- ベストアンサー
ACCESS VBA テーブルデータにYES/NO
ACCESSの表形式のフォームにYES/NOフィールドを足して 一覧フォームで任意のチェックボックスを選択して 選択されたデータのみを表示するようにしたいです。 しかしチェックボックスはレコードひとつひとつについてるのですが 認識されるチェックボックスは一番上のレコードのチェックボックスのみです。どうすればレコード別に判定できるのがわからないので 詳しい方ご教授お願いします。自分が書いたのは下記コードです。 Dim chkBln As Boolean chkBln = False If チェック50 = True Then chkBln = True MsgBox chkBln End If '検索結果の表示 DoCmd.OpenForm ("データ修正画面") '自身のレコードソースに設定 Forms("データ修正画面").RecordSource = "Select * From T_障害票マスタ WHERE チェック = " & chkBln & ""
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.3です。 > 一覧を全件表示しているフォームは一覧表形式なので、すべてのレコードの > チェックボックスが"チェック50"になるので判定をどうすればいいのかわかりません。 ・・・すみません、前回の回答で説明用の画像をつけるつもりでいたはずが、そのまま 忘れていました(汗) 現在、『チェック50』チェックボックスで、テーブルの『チェック』フィールドの値を表示 させている(=連結コントロール)のでしたら、フッタに設置したコマンドボタンの隣に、 ”チェックボックスを新たに追加”してください。 このチェックボックスの名前を『チェック抽出用』とします。 ※「チェック50」チェックボックスは表示用に使用しますので、そのまま残しておきます。 上記に基づいて前回の回答を修正すると、以下のようになります: (重複するコメントは削除しました) Private 抽出_Click() Dim chkBln As Boolean, RecSrc As String '「データ修正画面」フォームの名前を定数として設定 Const FName As String = "データ修正画面" 'レコードのデータを表示している「チェック50」ではなく、 'フッタに設置した「チェック抽出用」を、抽出条件に使用します。 chkBln = チェック抽出用 MsgBox "chkBln = " & chkBln 'If chkBln Then MsgBox "chkBln = " & chkBln RecSrc = "Select * From T_障害票マスタ Where チェック = " & chkBln '「データ修正画面」フォームを開く DoCmd.OpenForm FName 'レコードソースを設定(定数として設定済みなので「"」括りは”無用”) Forms(FName).RecordSource = RecSrc End Sub
その他の回答 (4)
- 30246kiku
- ベストアンサー率73% (370/504)
#2です > ひとつだけチェックボックスを選択して実行すると全件表示されていしまいます。 > 2つ以上だと先に選択したレコードは表示されず2つのレコードから表示されてしまいます。 もしかしたら、そのチェック項目にチェックした後、確定操作していますか。 また、判別が逆ということはありませんか。 1つ目をチェックして確定せずに修正画面を起動したとしても、レコード内はチェックしたもので更新されていないと思います。 2つ以上だと1つ目が表示されなくて、・・・・ これは、判別が逆だから・・・と思います。 チェックを入れたらすぐに確定するには、 If (Me.Dirty = True) Then DoCmd.RunCommand acCmdSaveRecord End If とか、 Me.Dirty = False で確定後、OpenForm の処理を、判別逆でやってみてください。 (上記2つ目の方法は私自身試したことはありませんが、あるところで他の方が回答し、それで解決したお礼もありました)
お礼
詳しい説明ありがとうございます。 問題はDexMachinaさんが投稿してくれた方法で解決できました。 頂いたアドバイスもこれからの参考にさせていただきます。 またなにかありましたらお願いします。
- DexMachina
- ベストアンサー率73% (1287/1744)
やりたいことは、 『データ修正画面』で一旦全件表示した後、『T_障害票』テーブルの『チェック』 フィールドがオンまたはオフのものに絞り込んで再表示 ということでよろしでしょうか。 (「自身のレコードソースに設定」とされているので、別フォームではないものと判断) 上記の通りだとすると、チェックボックスは、 ・詳細領域(レコードの表示領域)に設置(→レコード毎の値の確認・更新用): 『コントロールソース』に『チェック』フィールドを指定したもの(=連結コントロール) ・フォームのヘッダまたはフッタに設置(→絞り込み条件の指定用): 『コントロールソース』が空白のもの(=非連結コントロール) の2種類が必要ですので、まずはその点をご確認下さい。 ※フォームのヘッダ/フッタは、当該フォームをデザインビューを開いた状態で、メニュー から「表示(V)→フォーム ヘッダ/フッタ(H)」を選択すると表示されます。 なお、ヘッダまたはフッタの一方のみが必要な場合は、不要な側をダブルクリックする などしてプロパティシートを表示させ、『書式』タブの『高さ』を「0cm」に設定します。 (または、同タブの『可視』を「いいえ」にしても可) とりあえず、「チェック50」の方が非連結ということなら、提示のコードでも動くかと 思いますが、不要部分などもありましたので、参考までに少し手を入れてみました。 Private 抽出_Click() Dim chkBln As Boolean, RecSrc As String '指定された抽出条件を確認(値を変数に設定) chkBln = チェック50 'メッセージボックスで値を確認 MsgBox "chkBln = " & chkBln 'チェック50がオンの場合にのみメッセージが必要なら以下に差し替え 'If chkBln Then MsgBox "chkBln = " & chkBln 'SQL文の作成 '(Booleanでは値を「"」等で括る必要がないので末尾の「""」は省略しました) RecSrc = "Select * From T_障害票マスタ Where チェック = " & chkBln '自身のレコードソースに設定(自身の場合は「Me」で指定できます) Me.RecordSource = RecSrc '※「自身への設定=フォームは展開済」なのでOpenFormは不要です。 End Sub
補足
ご回答ありがとうございます。 すみません説明不足でした。 チェックボックスは詳細部分に配置してコントロールソースをテーブルのチェックフィールド(yes/no型)に設定しています。 フッタ部分にはコマンドボタンがあり、チェックの入ったフィールドのみをデータ修正画面に表示させたいと思っています。 自身のフォームと書いたのは一度データ修正画面を開いてそれからレコードソースを更新していたのでそう書きました。 一覧を全件表示するフォームとデータ修正画面は別のフォームになります。紛らわしくてすみません。 またレコードは常に一定ではないので非連結だと対応できない可能性があります。(増えたときなど) 一覧を全件表示しているフォームは一覧表形式なので、すべてのレコードのチェックボックスが"チェック50"になるので判定をどうすればいいのかわかりません。 こうゆう場合はどうすればいいのでしょうか?
- 30246kiku
- ベストアンサー率73% (370/504)
チェックボックスは、非連結のものでしょうか? であれば、以下参考になるかと 非連結のチェックボックスでレコードを選択する http://hatenachips.blog34.fc2.com/blog-entry-28.html テーブルのフィールドとしてチェックボックスと連結されているものがあるのなら フォーム「データ修正画面」には、チェックが付いたものだけを表示したいのでしょうか。 であれば、OpenForm での WhereCondition に条件を指定します。(4つ目) DoCmd.OpenForm "データ修正画面", , , "チェック = " & chkBln (「チェック」名のフィールドがテーブル「T_障害票マスタ」にあるとして) フォーム「データ修正画面」のレコードソースは、「T_障害票マスタ」だけを指定しておきます。 ※ DoCmd.OpenForm は、一般的に ( ) は付けません(上記の様に) ※ フォーム「データ修正画面」起動後に、レコードソースを書き換えているようですが、フォームの「開く時」イベント(Form_Open)前に、設定されているレコードソースでの抽出は完了しているようですので、後からレコードソースを設定するのであれば、フォームの初期状態で指定しておかない方が良いと思います。 設定していなければ、余計なお世話ということで。 WhereCondition で指定したものは条件として加味して抽出されるようです(Form_Open前に)
お礼
ご回答ありがとうございます。 教えて頂いたとおりに(連結の場合)やってみたら。 ひとつだけチェックボックスを選択して実行すると 全件表示されていしまいます。 2つ以上だと先に選択したレコードは表示されず2つのレコードから表示されてしまいます。 しかも理由がわかりません。 こうゆう事ってあるんですか?
- tsukasa-12r
- ベストアンサー率65% (358/549)
レコードにもYes/No型のフィールドを追加して、チェックボックスのデータソースだったかコントロールソースだったかを、追加したYes/No型フィールドに連結させるのがお手軽でよいと思います。
お礼
ご回答ありがとうございます。 DexMachinaさんの方法で無事解決いたしました。 こちらの意見も参考にさせていただきました。 ありがとうございます。
お礼
いつも詳しい説明ありがとうございます。 ご投稿いただいた方法で無事解決しました。 また、今回作成していた障害管理プログラムも思っていたよりも ずっと良くできました。 VBAは初めてだったので皆さんのお力添えに感謝いたします。 ありがとうございました。