• ベストアンサー

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 & ""

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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

anman0201
質問者

お礼

いつも詳しい説明ありがとうございます。 ご投稿いただいた方法で無事解決しました。 また、今回作成していた障害管理プログラムも思っていたよりも ずっと良くできました。 VBAは初めてだったので皆さんのお力添えに感謝いたします。 ありがとうございました。

その他の回答 (4)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#2です > ひとつだけチェックボックスを選択して実行すると全件表示されていしまいます。 > 2つ以上だと先に選択したレコードは表示されず2つのレコードから表示されてしまいます。 もしかしたら、そのチェック項目にチェックした後、確定操作していますか。 また、判別が逆ということはありませんか。 1つ目をチェックして確定せずに修正画面を起動したとしても、レコード内はチェックしたもので更新されていないと思います。 2つ以上だと1つ目が表示されなくて、・・・・ これは、判別が逆だから・・・と思います。 チェックを入れたらすぐに確定するには、   If (Me.Dirty = True) Then     DoCmd.RunCommand acCmdSaveRecord   End If とか、   Me.Dirty = False で確定後、OpenForm の処理を、判別逆でやってみてください。 (上記2つ目の方法は私自身試したことはありませんが、あるところで他の方が回答し、それで解決したお礼もありました)

anman0201
質問者

お礼

詳しい説明ありがとうございます。 問題はDexMachinaさんが投稿してくれた方法で解決できました。 頂いたアドバイスもこれからの参考にさせていただきます。 またなにかありましたらお願いします。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

やりたいことは、   『データ修正画面』で一旦全件表示した後、『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

anman0201
質問者

補足

ご回答ありがとうございます。 すみません説明不足でした。 チェックボックスは詳細部分に配置してコントロールソースをテーブルのチェックフィールド(yes/no型)に設定しています。 フッタ部分にはコマンドボタンがあり、チェックの入ったフィールドのみをデータ修正画面に表示させたいと思っています。 自身のフォームと書いたのは一度データ修正画面を開いてそれからレコードソースを更新していたのでそう書きました。 一覧を全件表示するフォームとデータ修正画面は別のフォームになります。紛らわしくてすみません。 またレコードは常に一定ではないので非連結だと対応できない可能性があります。(増えたときなど) 一覧を全件表示しているフォームは一覧表形式なので、すべてのレコードのチェックボックスが"チェック50"になるので判定をどうすればいいのかわかりません。 こうゆう場合はどうすればいいのでしょうか?

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

チェックボックスは、非連結のものでしょうか? であれば、以下参考になるかと 非連結のチェックボックスでレコードを選択する http://hatenachips.blog34.fc2.com/blog-entry-28.html テーブルのフィールドとしてチェックボックスと連結されているものがあるのなら フォーム「データ修正画面」には、チェックが付いたものだけを表示したいのでしょうか。 であれば、OpenForm での WhereCondition に条件を指定します。(4つ目) DoCmd.OpenForm "データ修正画面", , , "チェック = " & chkBln (「チェック」名のフィールドがテーブル「T_障害票マスタ」にあるとして) フォーム「データ修正画面」のレコードソースは、「T_障害票マスタ」だけを指定しておきます。 ※ DoCmd.OpenForm は、一般的に ( ) は付けません(上記の様に) ※ フォーム「データ修正画面」起動後に、レコードソースを書き換えているようですが、フォームの「開く時」イベント(Form_Open)前に、設定されているレコードソースでの抽出は完了しているようですので、後からレコードソースを設定するのであれば、フォームの初期状態で指定しておかない方が良いと思います。   設定していなければ、余計なお世話ということで。   WhereCondition で指定したものは条件として加味して抽出されるようです(Form_Open前に)

anman0201
質問者

お礼

ご回答ありがとうございます。 教えて頂いたとおりに(連結の場合)やってみたら。 ひとつだけチェックボックスを選択して実行すると 全件表示されていしまいます。 2つ以上だと先に選択したレコードは表示されず2つのレコードから表示されてしまいます。 しかも理由がわかりません。 こうゆう事ってあるんですか?

回答No.1

レコードにもYes/No型のフィールドを追加して、チェックボックスのデータソースだったかコントロールソースだったかを、追加したYes/No型フィールドに連結させるのがお手軽でよいと思います。

anman0201
質問者

お礼

ご回答ありがとうございます。 DexMachinaさんの方法で無事解決いたしました。 こちらの意見も参考にさせていただきました。 ありがとうございます。

関連するQ&A

  • ACCESS97 サブフォームのレコードソースプロパティーを変更したい。

    フォームの中にサブフォーム(データシート)が1つあります。 元のフォームのチェックボックスのオン・オフでサブフォームのレコードソースプロパティーを変更すると、 実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていません。がでます。 サブフォームのビューは変更したくありません。 だれか助けてください。 If Me.未送信のみ = -1 Then Forms!F_処理選択!F_理選択サブ.RecordSource = "F_処理選択サブ_1" Else Forms!F_処理選択!F_処理選択サブ.RecordSource = "F_処理選択サブ_2" End If

  • チェックボックスを利用してフォームを開く

    帳票フォームでデータを出している画面の一番左にチェックボックスを配置しました。 第一にチェックボックスを1つづつ選択できるように下記を記載しました。 Private Sub 選択_Click() If Me!選択 Then CurrentDb.Execute "UPDATE テーブル名 SET 選択 = False;" Me.Refresh End If End Sub チェックボックスにチェックを入れると一連のデータが新しいフォームに移る様に 下記のように記載しましたが、全く受け付けません。 Private Sub 編集_Click() If 選択 = False Then DoCmd.OpenForm "編集F" DoCmd.Close acForm, "メインフォーム名" End If 何が問題なのかわかりません。 ご助言いただきたく、宜しくお願い致します。

  • Accessで、yes/no型

     業者抽出クエリの中に、得意分野をチェックボックスで6個、営業地域をチェックボックスで10個作っています。  それに対応する業者抽出フォームのフォームヘッダーに、得意分野をチェックボックスで6個、営業地域をチェックボックスで10個、抽出用コマンドボタン1個を配置しています。  得意分野を1個&営業地域を1個選択して、そのふたつの条件を満たす抽出用コマンドボタンのSQL文はどのように書けばよいのでしょうか?

  • ACCESS VBAについて

    accessフォームにて実験データを入力するシステムを考えています。 添付画像のように空白のフォームに3つのサブフォーム(A.B.C)を設置しています。 動きとしては空白フォームに非連結のテキストボックス(日付カレンダー)があり、日付を変えるとフォームAのリストがその日付のサンプルリストが抽出されます。 次にフォームAの帳票リストのレコード選択するとそのレコードのSampleIDを参照してフォームBおよびフォームCのリクエリをかけたいのですがフォームBは連動するのですがフォームCが連動しません。 vbaは独学でしており、コードもネットからコピペばかりです(汗) エラーが出て、どう対処していいのかわかりません、 ご教授お願いいたします。 参考コード フォームAのレコードが選択(更新)する際のイベントです。 Private Sub Form_Current() SampleIDtemp = Me.TextSampleID.Value On Error GoTo KAIHI1 Forms(Screen.ActiveForm.Name).Controls("B").Form.RecordSource = "SELECT * FROM B WHERE B.SampleID = " & SampleIDtemp & ";" Forms(Screen.ActiveForm.Name).Controls("B").Form.Requery KAIHI1: On Error GoTo KAIHI2 Forms(Screen.ActiveForm.Name).Controls("C").Form.RecordSource = "SELECT * FROM C WHERE C.SampleID = " & SampleIDtemp & ";" Forms(Screen.ActiveForm.Name).Controls("C").Form.Requery KAIHI2: End Sub ちなみにいくつか出たエラーを示します (1)実行時エラー'2475': 指定した式では、フォームがアクティブウィンドウである必要があります。 (2)実行時エラー'2450': 参照されているフォーム'A'が見つかりません。

  • access vba 引数

    ACCESS VBA 引数取得について テキストボックスが横に3つ並んでいてその3つは同じデータのレコードで、 例えば | No | Name  |    Tel    |   ボタン  | |~~1~~|~~~山~~~~|~~99-9999-9999~~| |__更新__| | |~~2~~|~~~川~~~~|~~88-8888-8888~~| |__更新__| | |~~3~~|~~~空~~~~|~~77-7777-7777~~| |__更新__| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ となっていて、ボタンを押して別のフォームを開いてデータの更新をしたいのですが、その押したレコードのNoを引数にして別のフォームを開きたいのです。どのようにコードを書いていいのか分かりません。 今のところ引数はほかにもあるのでそれは取れていて 変数名 = (引数にしたい項目1) 変数名 = 変数名 & (引数にしたい項目2) 変数名 = 変数名 & (引数にしたい項目3) DoCmd.OpenForm "フォーム名", , , , , acDialog, 変数名  (↑openArgs) までは書けています。 押したレコードのNoを引数に加えるというところがどのようにすればいいか分かりません。 教えてください。 よろしくお願いします。m(_ _)m

  • ACCESS VBA コマンドDoCmd.OpenFormの引数

    2つの項目で主キーを構成するテーブルを定義しました。 この場合、VBA コマンドを使って登録画面を開く為の コマンドの引数の指定方法がわかりません。 テーブル名: T運転手割当 1)W業務依頼日 <=主キー 2)W使用車両  <=主キー 3)W運転手番号 DoCmd.OpenFormの書式 ■第4引数 WhereCondition/レコード抽出条件(省略可能) テーブルやクエリと連結しているときのレコード抽出条件を指定します。 1)仮に主キーが1つの時、以下の表記で正常に表示されます。 'フォームを開く DoCmd.OpenForm "F運転手割当登録", acNormal, , "W業務依頼日 = " & Me![lstWariate] 2)主キーが2つの時、以下の表記ではF運転手割当画面は表示されるのですが、 肝心のデータがセットされずに空白で表示されます。 'フォームを開く DoCmd.OpenForm "F運転手割当登録", acNormal, , ("W業務依頼日 = " & Me![lstWariate]) & " And " & ("W使用車両 = " & Me![lstWariate]) [lstWariate]とは、データの検索画面で検索結果を表示するリストボックスの名称です。 検索結果から該当データを選択して、個別データの修正画面に移行したいのですが・・・。 Me![lstWariate]の表記が良くないのだと思うのですが、具体的な表記方法が分かりません。 よろしくお願いします。

  • Access2013 vbaサブフォームのレコード

    [Access2013 vba] ■したいこと サブフォームのレコードの中から、一レコードだけをチェックボックスなどで選択したいのですが、どのようにしたら出来ますでしょうか。 複数行選択は出来ないようにしたいです。 選択したのち、メインフォームの選択ボタンを押すと、そのレコードのID番号を取得して、呼出元のフォームのIDフィールドに代入したいです。 ■画面の流れ・・・ Aフォーム → 帳票型Bフォームで、レコードを選び「開く」ボタンを押す→ B 'メインフォームとCサブフォーム)が開く Cサブフォームのレコードをチェックボックスにチェックを入れて選択する B ' メインフォームの「選択」ボタンを押すと B ' メインフォームと、その前のBフォームが閉じて Aフォームに戻り、AフォームのIDフィールドに選択したIDが格納される。 よろしくお願いします。

  • Access 複数条件のフィルタ

    フォーム[F_MENU]に非連結のテキストボックス検索用A~Cで3つあります。 検索用A 検索用B 検索用C AかつBかつCという全件一致でフィルターをかけてフォーム[詳細]を開きたいのですが DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'" And "B = '" & Forms!F_MENU!検索用B & "'" And "C = '" & Forms!F_MENU!検索用C & "'" とやると、実行時エラー'13':型が一致しません。 と出てしまいます。 Aだけ、Bだけ、Cだけ、それぞれひとつずつ書けば、エラーなく結果が得られます。 DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'" DoCmd.OpenForm "F_詳細", , , "B = '" & Forms!F_MENU!検索用B & "'" DoCmd.OpenForm "F_詳細", , , "C = '" & Forms!F_MENU!検索用C & "'" おそらくANDの使い方が誤っていると思うのですが、添削お願いいたします。 全てのテキストボックス及び元テーブルのデータ型はテキスト型です。 条件は3つとも完全一致のみで、検索用ABC、F_詳細のABCそれぞれのカラムにNULL値はありません。 よろしくお願いします。

  • AccessからExcellにエクスポートしたYes/No型のデータについて

    こんにちは。 AccessからExcellにエクスポートしたYes/No型のデータの扱いについて教えてください。 例えば上記のYes/No型のデータがセルA1に"TRUE"で入っていて、 IF文で、 =IF(A1="TRUE",条件○○,条件□□)という風に入力しても 認識されません。 =IF(COUNTIF(A1,"TRUE")=1,条件○○,条件□□)だと きちんと認識して、条件○○が選択されます。 これは何が原因でしょうか? できればCOUNTIFを使わずにシンプルに作りたいのですが、 分かる方いらっしゃいましたらお願いします。

  • access レコードソースを選択し、DoCmd.OpenFormする方法

    Select Caseのフレームで、レコードソース(クエリ)を選択し、 そのソースを基にDoCmd.OpenFormする方法がわかりません。 よろしくお願いします。 ---------------------------------------------------- Dim strSource As String Dim Q1, Q2 As String Dim stDocName As String Dim フォーム1 As Form stDocName = "フォーム1" Q1 = "クエリ1" Q2 = "クエリ2" Select Case フレーム1 Case 1 strSource = Q1 Case 2 strSource = Q2 End Select 'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか? DoCmd.OpenForm stDocName, acFormDS ---------------------------------------------------- クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。 ですのでフォーム1には、対応するテキストボックスは用意してあります。

専門家に質問してみよう