'テキストボックスをダブルクリックしたら通常のテキストを入力できるようにする'
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|
テキストボックスのプロパティシート>データ>コントロールソースに下記の式を入れれば、それぞれ表示されます。
=Format(Date(),"y")
=Format(Date(),"m")
=Format(Date(),"d")
帳票ぎゅうぎゅう詰めのアイデアについて、hatena様の参考ページを見つけることができました。参考にさせていただきます。ありがとうございます。
https://hatenachips.blog.fc2.com/blog-entry-242.html
条件付き書式ではできませんでしょうか?的外れであれば申し訳ありません。
やはりそうですよね。
>フィールドをNullにするようします
なるほど、そういったことも必要になるのですね。勉強になりました!ありがとうございます。
なるほど、こんなことができるのですね。勉強になりました!ありがとうございます。
>Private Sub cmd降順_Click()
すみません、このコードについては記述しなくても望み通りの動きをしてくれたのですが、「
フィルターや並べ替えを変更すると、レコードセットの共有がレセットされます」とはどういうタイミングになりますでしょうか。
望み通りのものを作成することができました!コードについても勉強になりました。とても助かりました。ありがとうございました。
ご回答ありがとうございます!参考にさせていただきます。
VBAが必須かどうかは要件によりますが、入力フォームやレポートでの見やすい出力を考えたら、クエリ(SQL)だけでは解決できないと思います。
メイン/サブフォーム形式、レポートのグループ化機能などを使う必要が出てくると思います。
こんばんわ、ろでますです。
ご返信ありがとうございます。
となると、VBAに足を突っ込まないといかないかもということですか。
エクセルのはそこそこ使ったことあるんですが・・・
Accsessとなってくると、初めてになります。
SQL構文覚えないと><
あっ、誤記です。すみません。回答の方も修正しておきます。
そうですね。これは外部キーにはなりませんね。
脳内だけで構成を考えていたのでこのへんはちょっとおかしいですね。
これはリンクせずに、入力フォームを作成するときの抽出条件に使うという感じの設計になるのかな。
各人物の回答用の入力フォームは、メイン/サブフォーム形式のものになるので、
メインで回答者を選択するコンボボックスの値集合リストの抽出条件に使うといいかも。
これもあくまで脳内シミュレーションでの構成ですので、実際につくると修正が必要になるかも知れません。
こんばんわ、ろでますです。
すいません、私の知識不足で、上から読み解いていくうちにわからないことが出てきたので、教えていただけませんか。
>※F1、F2 は M_Category の外部キー
これはK1、K2の誤記ですか?(揚げ足を取るとかそんなんではなく、純粋に)
あと、
M_Category (カテゴリーマスター)
でK1・K2は2つで複合キーになっていると思うのですが、その後ろの
T_Question (質問テーブル)
の説明書きに
>※K1 は M_Category の外部キー
とあります。
なぜ、複合主キー内のK1のみを主キーとしてT_Question (質問テーブル)のK1を外部キーとして扱うことができるのかがわかり間ませんでした。(おっしゃりたい意味は大体理解できます)
ためしに、M_Category (カテゴリーマスター)テーブルのK1キーとT_Question (質問テーブル)のK1キーをリレーショナルすると、「未定義となりました」
すいません、ここがわからなかったのでこれ以上先に進めていません><
よろしければご教授願います。
いろいろ考えられますが、
一つの解決策としては下記のようなテーブル構成にするのが自由度か高いかな、と思います。
M_Category (カテゴリーマスター)
K1, K2 複合PK
M_Person (人物マスター)
※F1、F2 は M_Category の外部キー
T_Question (質問テーブル)
※K1 は M_Category の外部キー
T_Choice (選択肢)
CID, QID 複合PK
QID は T_Question の外部キー
T_Person_Choice (人物がどの選択肢を選択したか)
テーブル名とかは出された情報から推測で適当につけてますので、参考程度に。
これはあくまで一例ですので、別の方法もあるかと思います。
ご回答どうもありがとうございます!
確かにおっしゃる通りの方法でうまくいきました。
すいませんが、この後実は色々難所があり、それもお伺いしてもよろしいでしょうか。
このテーブル構成で、
FK
山田さん 1 1
加藤さん 1 3
佐藤さん 1 1
田中さん 2 1
伊藤さん 2 3
となっているときに、FKの左側が1の方に質問があったとします。(山田さん・加藤さん・佐藤さん)
その問いが別のテーブルにあり、10個(01~10)の回答から複数選択しなさいという物いです。
同様にFKの左側が2の方に質問があったとします(田中さん・伊藤さん)
その問いが別のテーブルにあり、15個(01~15)の回答から複数選択しなさいという物いです。
この場合、どういったテーブルを作って、何処のテーブルと結合していいかが全く考え付きません。
よろしければご教授願えませんでしょうか・・・。
質問の設定だと、それぞれのテーブルが
M1(一) →(多)M2
M1(一) →(多)M3
のような一対多関係になります。
一つのクエリで上記の結合をしてしまうと、M2とM3が多対多の関係になるので、ユニークに決まらない場合で出てくるので整合性エラーになります。
例えば、下記のような場合、
M1
1 1 A
1 2 B
1 3 C
M3
1 1 X
2 1 E
2 2 F
M2 の FK が 1 1 のとき、A か X か決まりませんよね。
M1 と M3 を分けずに一つににまとめれば、このような重複は許可されないので整合性の保証されたデータになり、エラーはでなくなります。
PK
1 1 A
1 2 B
1 3 C
1 4 D
2 1 E
2 2 F
2 3 G
M1 と M3 を分けたまま、2つのテーブル間で上記のようなユニーク属性を制定するのはできません。
やるとしたら、上記のように一つに纏めておいて、必要に応じて、選択クエリで分割することになると思います。
整合性が保障されないので、整合性に反したデータの入力が可能になってしまいますので、入力、更新するたびに自前で整合性をチェックする(VBAなどで)ことになります。
わざわざそのような面倒かつ不確実なこともぜすとも上記のように必要に応じて選択クエリに分ける設計にすれば問題奈と思います。
このデータはどこにどのような形であるのですか。
テーブルなら、これから追加クエリを作成して、SQLビューにすればいいでしょう。
テーブルでないなら、どのように追加するデータを指定するか明示してください。
hatena さん
レポートの事です。失礼しました。
困っていたことは、解決しそうです。
ご回答ありがとうございました。
レポートの話ですよね。
用紙の最下部にグループフッターを表示したいということでしょうか。
下記の方法が参考になると思います。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
「F案件」と「F案件詳細」のレコードソースは同じテーブルですか。
同じという前提が回答します。
あと、全角英数字を名前に使用するとトラブルの元なので、半角に修正しておくことを推奨します。
「F案件」、「F案件詳細」とFは半角として回答します。
「F_案件」フォーム上にコマンドボタン「cmd案件詳細」があり、そのクリックで「F案件詳細」を開くとします。
このcmd案件詳細のクリック時のイベントプロシージャを下記のように記述します。
これで、「F案件」と「F案件詳細」は同じレコードセットを共有することになりますので、並び順は同じなりレコード移動も完全同期します。片方のフォームでレコード移動するともう一方のレコードも追随して同じなります。
レコード移動のボタンに関しては、コントロールウィザードをオンにしておいてコマンドボタンは配置すると、「レコードの移動」で「前のレコードに移動」「次のレコードに移動」をそれぞれ選択すると自動で作成できます。
あと、フィルターや並べ替えを変更すると、レコードセットの共有がレセットされますので、並べ替えを変更したあとにもレコードセット共有処理を実行するようにします。
例えば下記のような感じです。
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(*)
と設定するほうかトラブルは少ないと思います。