'テキストボックスをダブルクリックしたら通常のテキストを入力できるようにする'
Private Sub textbox_DblClick(Cancel As Integer)
Me.textbox.Format = ""
End Sub
Private Sub textbox_Enter()
Me.textbox.Format = "yyyy/m/d"
End Sub
Private Sub cb2担当者_Enter()
Me.cb担当者.SetFocus
Debug.Print "前面コンボボックスフォーカス取得"
End Sub
Private Sub cb担当者_Enter()
Me.cb担当者.Requery
Debug.Print "背面コンボボックスフォーカス取得"
End Sub
テーブル:データ
|社員番号|氏名|判定内容1|判定1|判定内容2|判定2|判定内容3|判定3|判定内容4|判定4|
|00001234|〇田| 正常外 | B | 〇〇異常| D | △△異常| E |やや異常値| A|
|00005678|〇木| ××異常| F | 〇〇異常| B | △△異常| C |やや異常値| A|
Option Compare Database
Option Explicit
Private originX As Long
Private originY As Long
Private Sub Form_Load()
originX = Me.InsideWidth
originY = Me.InsideHeight
End Sub
Private Sub img_Resize_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button And acLeftButton Then
ReleaseCapture
Call SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0&)
End If
End Sub
Private Sub img_Resize_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If originX >= Me.InsideWidth Then Me.InsideWidth = originX
If originY >= Me.InsideHeight Then Me.InsideHeight = originY
End Sub
Accessはデータベースなので、まずはテーブル設計からはじめる必要があります。
テーブル設計では、フィールドのデータ型をどうするかは重要です。
それが正しく設定されていないと、検索とか抽出、集計というデータベースとしての機能が使いづらくなります。
日付を格納するフィールドは日付/時刻型にすべきです。そこには日付や時刻しか入力できません。
テキスト入力が必要なら別にテキスト型のフィールドを用意するべきです。
「必要なし」だけでいいなのら、Yes/No型のフィールドでもいいでしょう。
フォーム上では、Yes/No型のチェックボックスをチェックしたら、VBAで日付のフィールドをNullにするようにします。
テキスト型の場合は、何かテキストを入力したら日付フィールドをNullにするようします。
標準のカレンダー機能はデータ形式(書式)を必要とする入力支援機能なのでそのままでは無理ですね
ユーザーフォームを使ってなんとかするか、
カレンダーダイアログ日付入力関数 祝日表示対応版
逆に、通常のテキスト入力にしたいときだけひと手間かけるとかでしょう
1.帳票と単票で同じレコードを使う
2.単票を開いたときに帳票と同じ並び替えを適用する
3.単票を開いたときに帳票のキーを使って検索しレコード移動する
4.「前」「次」は単純にレコードの移動にする
とすれば楽に実装できると思いますよ
hatenaさん
ありがとうございます。こんなに簡単なことだったなんて。何日間も調べて悩んでいたのですが、ここで早く聞けばよかったです。(^^;)
お忙しいところ、わざわざお返事ありがとうございます。心より感謝申し上げます。
なおりました。それはよかったです。
Debugコードはなおったなら必要ないので削除ておいてください。
ご回答ありがとうございました!正直なところ、なぜなおったのかわからないのですが、hatena様の記載してくださったdebugコードを入れたりVBAに改行を入れたりしているうちになおりました。昨夜からあれやこれやとこねくり回して、さんざんもがき苦しんでいましたが、魔法のようです…本当に助かりました。ありがとうございました!!
頑張ってください。
行き詰ったら、その時点での状況を提示して質問してください。
まずは、下記の点を確認してください。
コンボボックスを重ねていると思いますが、その前後関係は正しくなってますか。リストを絞り込んでいる方が背面にくるようにしてください。
次に、2つのコンボボックスのフォーカス取得時のイベントプロシージャは正しく動作しているか確認してください。
下記のようにDebug.Printのコードを埋め込んで、イミディエイトウィンドウを表示させながら、コンボボックスを操作うしイベントが発生するとイミディエイトウィンドウに出力されるので確認できます。
先日こちらの件を教えていただき、正常に動いていたのですが、色々なところを触っている内に壊れてしまいました。原因を解明するためにもう、3時間以上確認していると思いますが、全く原因がわかりません…症状としては、全ての帳票のコンボボックスの選択肢が、一番上のコンボボックスの選択肢と同じになっています。どのような原因が考えられるでしょうか…なんだか「txt顧客番号」(作っていただいたところのcb顧客番号)を無視しているように感じます。本当に悩み苦しんでおります…どこに問題があるのか、思いつくところがありましたら助かります。
フォームのレコードソースと「年月」クエリに検索用のフィールド
年月検索用: Format(Nz([年月日]," 未入力"),"yyyymm")
を用意してあげればいいかなぁと
※
" 未入力"
部分には「未入力」の前に半角スペースが入っていますありがとうございます。
さっそくやってみます。
思ったレポートができそうです。
ありがとうございました。
また躓いたときにはよろしくお願いします。
このレイアウトは縦並びですよね。このレイアウトでいいのですか。ならば、レポートの設定で簡単に実現できます。
ユニオンクエリの出力は、下記のようになっていると思いますので、
このクエリをレポートのレコードソースにします。
社員番号でグループ化して、グループヘッダーを表示させて、そこに
社員番号 氏名 をテキストボックスとして配置します。
判定内容 と 判定 は詳細セクションに配置します。
グループヘッダーの「改ページ」プロパティを「カレントセクションの前」に設定します。
これで、ご希望のレイアウトになります。
グループ化の方法については下記を参考にしてくたさい。
レポートでのグループ化 - もう一度学ぶMS-Access
下記はレポートウィザードを使ってグループ化されたレポートを作成する方法です。
グループ化レポートまたはサマリー レポートを作成する - Access
説明不足で申し訳ございません。
テーブル:データ
|社員番号|氏名|判定内容1|判定1|判定内容2|判定2|判定内容3|判定3|判定内容4|判定4|
|00001234|〇田| 正常外 | B | 〇〇異常| D | △△異常| E |やや異常値| A|
|00005678|〇木| ××異常| F | 〇〇異常| B | △△異常| C |やや異常値| A|
DからFのみ抽出し
|00001234|〇田|〇〇異常|D|△△異常|E|
|00005678|〇木|××異常|F|
というデータを作成
最終的には1人1ページのレポートにしたいと思っています。
1ページ目
氏名 00001234
〇〇異常 D
△△異常 E
2ページ目
氏名 00005678
××異常 F
※最大10項目です
ユニオンクエリを使わず、レポートでもシンプルにできるでしょうか・・・
良い方法があれば教えてください。
よろしくお願いします。
これだけでは、どのような形の横並びなのか分かりません。
できれば、元のデータ例をだして、それの出力結果を提示して説明てもらえると分かり安いとおもいます。
また、横並びする最終目的がレポート出力なら、レポート側で横並びにするほうがシンプルな場合もあります。
どちらにしても出力結果のレイアウトが分からないと回答は難しいです。
あっ、ごめんなさい(;^ω^)
リンクを貼り付けたつもりでしたが、できてませんでした。回答を修正しましたので、リンク先を参考にしてください。
ありがとうございます!ちなみに、「下記は」というのはどの件でしょうか。見落としがあったら申し訳ありません。
とりあえず「更新クエリ」について調べてみてください。
希望の更新ができる更新クエリが作成できたら、フォームからマクロかVBAでその更新クエリを呼び出すだけです。
ユニオンクエリで追加すればどうでしょうか。
下記は「すべて」を追加する方法ですのて、これを参考に「未入力」を追加すればいいでしょう。
コンボボックス(リストボックス)のリストに"(すべて)"を追加する - hatena chips
具体的にどのようなSQLにすればいいか分からない場合は、現状のリストボックスの値集合ソースのクエリのSQLを提示してください。
レコード件数を表示したいなら、コントロールソースに
=Count(*)
と設定するほうかトラブルは少ないと思います。
できました!
あとで、よく勉強します。
下記でどうでしょうか。
絶対無理だと思って質問してしまいましたが、探り探り作成して、なんとかうまくいきました!更新クエリを作って、そこにマクロでフォームから該当の案件番号を追加実行できるようにしました。クエリは更新クエリと、作成用のクエリ2つにすればよかったようです。また問題が起こってきたら質問させていただくと思います。失礼いたしました。
'フォーム 開くとき
Private Sub Form_Open(Cancel As Integer)
Dim i As Integer
For i = 1 To 42
Me("T" & i).OnClick = "=SetDate(" & i & ")"
Next
Me.cmdPrev.OnClick = "=MoveMonth(-1)"
Me.cmdNext.OnClick = "=MoveMonth(1)"
' SetCalendar DLookup("日付", "T_予定") '開く時の日付表示
SetCalendar Format(Now(), "yyyy/mm/dd")
End Sub
私はこれで動きました。
質問を修正しました。コメント1,2は編集できなかったため、古いものが残っています。すみません。
これだけの情報では回答は難しいです。
そのアクセスのシステムを作成した人に問い合わせるのが早道です。
作成した人に連絡がとれないなら、Accessに関してそれなりのスキルを持っている人が実際のファイルをみて解析しないと無理でしょう。
テーブル設計の見直しについて、自分なりにずっと考えています。正しく変更できるかはわかりませんが、とりあえず変更はする予定です。それでもフォームに書き込めなかったらまた、質問させていただきます。ご迷惑をおかけしました。
すみません
https://tsware.jp/tips/tips_642.htm
で解決しそうでした^^;;
この質問の【T_お店】は【T_案件】の間違いです。別で全体的な構成の相談をさせていただいていたので、お伝えさせていただきました。この質問記事を編集しようと思いましたが、できませんでした。すみません。
できるだけ具体的に書いたつもりですが、つたない文章でわかりづらく申し訳ありません。(お客様=お店という点を残しましたが、実際は企業相手です。そこだけフィクションです)
実は、ネットへの書き込みは半永久的で、あまり本当の名前で全部書くと関係者に見られたとき恥ずかしいなと思い、テーブル名を別のものに置き換えていました。そのことが要らぬご負担をおかけする原因となってしまいました…本当に申し訳ありません…
しかも、置き換えると自分でも確認するとき混乱する原因となっておりました…
本当に愚かです…
後ほど、イメージしていただけるよう、本当の内容で改めて具体的に書かせていただきます。
申し訳ありません。
こちらについて記載にミスがありました。別で質問している件にも関わるので、一旦保留させてください。スミマセン…
テーブル設計はデータ内容と矛盾しないように設計する必要があるので、各テーブルのデータ内容の分析が重要です。
【T_お店枝番】ですが、一つのお店が複数の支店とか店舗を持っていて、その店舗ごとのデータを格納するということでしょうか(テーブル名やフィールド名からはこのような印象になります)。
しかし、「担当者ごとに枝番が分かれている情報」とのことだとすると上記の内容とは違うようですね。
この担当者というのは、店に複数の担当者がいて、担当者によって扱う商品が異なるということでしょうか。
【T_案件】とは具体的にどのようなものなのでしょうか。お店枝番 と 商品番号 があるということは、担当者と商品に関係のあるデータが格納されということになりますが、実際はそうなのでしょうか。
上記の点についての詳細な情報が分からないと、具体的にアドバイスは難しいですね。
一般的な商店とかに関するデータならだいたい推測できるのですか、どうも一般的なものとは異なる業務形態のようなので、推測もしづらいです。
現状のリレーションシップを図示すると下記のようになりますが、通常はこのようにループになるような結合はNGです。
下記のような結合になるような設計にすべきです。
あるいは、一から設計を見直す必要があるかもしれません。
where 条件文 = [年月] Is Null
となってますので、その場合は、フォームに新規レコードの表示になっているとおもいますが、
そうなってますか。(データ追加が可能な状態なら)
もし、そうなら、フォームを開くアクションのあとに、下記のIf文を追加すればいいでしょう。
If [Forms]![F個人情報].[newrecord]=True Then
メッセージボックス
メッセージ 新規レコードです。
Else
メッセージボックス
メッセージ 年月欄を埋めてください
ご回答ありがとうございます!年月欄が空白のものが存在しないときがあり、そういうときと区別させたいとおもったのですがややこしくなりそうでしょうか…
問題が解決しました。Q_案件で担当者と案件を外部結合できていませんでした。また、外部結合がエラーでできなかったのですが、担当番号にデフォルトで0が入ってしまっていたことが原因でした。色々お騒がせしました。
やってみたのですが、うまくいきませんでした。txt担当者を作るためにQ_案件で担当者と案件をつなぐと、F_案件に担当者が入ったものしか表示されなくなってしまうのですが、担当者が全部に入っていません。訳の分からないことを言っていたらすみません。パニック気味です…
↑で書き込んだ「ラベルやイメージのコントロールが背面に隠れてしまい」の部分ですがアンカーを使用した場合は、初期表示の画面サイズ以下でドラッグを開放すると画面が見切れてしまい操作不能という表現が正しかったです。
初期画面以下に縮小できないように規制するコードも思っていたよりも簡単に出来たので参考までに載せておきます。
以上、ありがとうございました。
なるほど! SendMessageにこんな使い道があったとは! コードがすごくシンプルに実装できますね。
あと実装して分かったことですが、サブフォームやListBoxの範囲内でドラッグを開放した場合ラベルやイメージのコントロールが背面に隠れてしまい再度ドラッグすることが不可能になってしまいました。
対策としては、初期の画面サイズ(InsideWidth or InsideHeight)を記憶してそれ以下に縮小しないように規制するコードを試行錯誤してみようと思います。
なにはともあれ、短時間でこのようなアイデアを教授頂き大変有り難うございます。