• ベストアンサー

ACCESS VBA 複数の条件文

ACCESS超初心者です。 部署にある書籍の一覧表をACCESSのフォームで作成しています。 3つの検索条件を作成したのですが 検索結果を表示させるIf文がVBAでうまく作れません。。。 ご教授ください。 【例】 テーブル名:Tbl_Test フィールド名: 分野 (テキスト型) 所在(テキスト型) 所有者(テキスト型) で、テーブルを作り、 検索用フォーム(フォーム名:Frm_Test)に、非連結の Ctl検索分野 (コンボボックス) Ctl検索所在(リストボックス) Ctl検索所有者(リストボックス) を作成 「Ctl検索所在(リストボックス)」 「Ctl検索所有者(リストボックス)」 それぞれの更新後処理のイベントプロシージャに 以下の6つのパターンの場合 それぞれ別のクエリを表示させるVBAを作成したい 「分野」:未選択 「所在」:未選択 「所有者」:未選択 の場合・・・クエリ「分野絞込なしの所在所有者未選択」を表示 「分野」:未選択 「所在」:未選択 「所有者」:選択 の場合・・・クエリ「分野絞込なしの所有者選択」を表示 「分野」:未選択 「所在」:選択 「所有者」:未選択 の場合・・・クエリ「分野絞込なしの所在選択」を表示 「分野」:選択 「所在」:未選択 「所有者」:未選択 の場合・・・クエリ「分野絞込ありの所在所有者未選択」を表示 「分野」:選択 「所在」:未選択 「所有者」:選択 の場合・・・クエリ「分野絞込ありの所有者選択」を表示 「分野」:選択 「所在」:選択 「所有者」:未選択 の場合・・・クエリ「分野絞込ありの所在選択」を表示 相変わらず説明が下手で申し訳ありません。 初心者の私にとっては難しすぎて 頭がパンクしてしまいました。 よろしくお願いします!

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

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

> データが連結しているとはどのような意味なのでしょうか? 私は説明べたなので以下を参照してください。 http://oshiete1.goo.ne.jp/qa57126.html > (2)以下について意味を教えてください  以下でわかりますでしょうか。  sTmp = ""  sTmp = sTmp & OrAnd & "(AAA)"  sTmp = sTmp & OrAnd & "(BBB)"  sTmp = sTmp & OrAnd & "(CCC)"  出来上がった、sTmp の中身は、  " AND (AAA) AND (BBB) AND (CCC)" となります。  sTmp = Mid(sTmp, Len(OrAnd) + 1) とすると、  "(AAA) AND (BBB) AND (CCC)" となります。  AND ではなく OR に変更する場合、   Const OrAnd As String = " AND " ↓   Const OrAnd As String = " OR "  とするだけで、対処できます。 > (3)以下について、 > Select Case Ctl検索分野 > Case 1 > Me.RecordSource = "クエリ01"  コンボボックスの表示には、パターン番号のようなものを表示しているのでしょうか? >  If (Not IsNull(Me.Ctl検索分野)) Then >    sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')" >  End If  上記での前提として、分野そのものが表示され、連結列になっていた場合のものになります。  例えば、値集合ソースの内容が   SELECT DISTINCT 分野 FROM テーブル名 ORDER BY 分野;  リストボックスも同様に、リストボックスの値がそのまま抽出条件に使えることを前提としていました。  また、複数選択:しない となっていることが前提となっています。 >  sTmp = "" >  If (Not IsNull(Me.Ctl検索分野)) Then >    sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')" >  End If >  If (Not IsNull(Me.Ctl検索所在)) Then >    sTmp = sTmp & OrAnd & "([所在]='" & Me.Ctl検索所在 & "')" >  End If >  If (Not IsNull(Me.Ctl検索所有者)) Then >    sTmp = sTmp & OrAnd & "([所有者]='" & Me.Ctl検索所有者 & "')" >  End If > >  If (Len(sTmp) > 0) Then >    sTmp = Mid(sTmp, Len(OrAnd) + 1) > >'フォーム自体のレコードソースを変更する場合 >    Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");" >    Me.Requery  上記方法では、クエリは使用しません。  クエリに書いてあるものを、状況に応じて作成し、設定することになります。  ここで、クエリ自体が不要になるのか考えるところです。  そのクエリを使ってレポートに、とか、外部出力(ExcelやCSVなど)に使うとか。 >「フォーム自体のレコードソースを変更する場合」 > で自分なりに色々やってみたのですがうまくいきません。。。  今まで作成したクエリを、デザインビューで開いた後、SQLビュー表示にしてみます。  その時、参照テーブル名が2つ以上あった場合、以下の部分でテーブル名を明示的に指定します。     sTmp = sTmp & OrAnd & "([テーブル名].[分野]='" & Me.Ctl検索分野 & "')"  また、     Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");"  の記述は、クエリのSQLビューを参考に、WHERE部分以外まねます。 ※ 現状考えられている方向を察するに、#2の方の方法が身近かもしれません。

masunona
質問者

お礼

丁寧に教えていただいてありがとうございます! 時間はかかりましたがなんとか理解することができました。 また質問することもあると思いますが よろしくおねがいします!

その他の回答 (2)

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

今回ご質問の件に関しては、No.1の方の回答のように、レコードソースか フィルタ式をVBA上で直接編集してしまった方が楽なのですが・・・ 「頭がパンクしてしまいました」とのことなので、場合分けの仕方の参考 としての回答をします。 Private Sub ReflectSelect()   Dim rsl As Integer, strQry As String   'IsNull関数により、選択状況を確認(未選択で-1、選択済で0が返される)   '※下の「 * 1」は表記形式を揃えるためだけに入れています(=省略可)   rsl = - (IsNull(Ctl検索分野) * 1 + IsNull(Ctl検索所在) * 2 + IsNull(Ctl検索所有者) * 4)   Select Case rsl  '全部で8パターン(【追加】の2件は不要?)     Case 0  '未選択なし(=-{(0*1)+(0*2)+(0*4)})       strQry = "分野絞込ありの所在所有者選択"   '【追加】     Case 1  '分野のみ未選択(=-{(-1*1)+(0*2)+(0*4)})       strQry = "分野絞込なしの所在所有者選択"   '【追加】     Case 2  '所在のみ未選択(=-{(0*1)+(-1*2)+(0*4)})       strQry = "分野絞込ありの所有者選択"     Case 3  '分野・所在が未選択(=-{(-1*1)+(-1*2)+(0*4)})       strQry = "分野絞込なしの所有者選択"     Case 4  '所有者のみ未選択(=-{(0*1)+(0*2)+(-1*4)})       strQry = "分野絞込ありの所在選択"     Case 5  '分野・所有者が未選択(=-{(-1*1)+(0*2)+(-1*4)})       strQry = "分野絞込なしの所在選択"     Case 6  '所在・所有者が未選択(=-{(0*1)+(-1*2)+(-1*4)})       strQry = "分野絞込ありの所在所有者未選択"     Case 7  'すべて未選択(=-{(-1*1)+(-1*2)+(-1*4)})       strQry = "分野絞込なしの所在所有者未選択"     Case Else       MsgBox "不明", , "Error"   End Select   Me.RecordSource = strQry End Sub ・・・以上、参考まで。 (なお、推奨されるのは、あくまでNo.1の方の方法です)

masunona
質問者

お礼

ご回答ありがとうございました! caseの使い方ってこうゆうふうになってるんですね!! フォームの別の部分でもっと単純なcaseを使用したVBAを わけもわからずコピペで使っていましたが 今回この回答をいただいたおかげで 理解することができとてもうれしいです! また質問することもあると思いますが その際はよろしくお願いします!

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

実際に動かした検証していないので、雰囲気だけでも コンボ/リストボックスがクリックされた時に、有効なものだけを使って抽出条件を作ります。 (表示するデータは連結していることが前提です) Private Sub WhereMakeSet()   Dim sTmp As String   Const OrAnd As String = " AND "   sTmp = ""   If (Not IsNull(Me.Ctl検索分野)) Then     sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')"   End If   If (Not IsNull(Me.Ctl検索所在)) Then     sTmp = sTmp & OrAnd & "([所在]='" & Me.Ctl検索所在 & "')"   End If   If (Not IsNull(Me.Ctl検索所有者)) Then     sTmp = sTmp & OrAnd & "([所有者]='" & Me.Ctl検索所有者 & "')"   End If   If (Len(sTmp) > 0) Then     sTmp = Mid(sTmp, Len(OrAnd) + 1) 'フォーム自体のレコードソースを変更する場合     Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");"     Me.Requery 'フォームの Filter 機能を使う場合     Me.Filter = sTmp     Me.FilterOn = True   Else 'フォーム自体のレコードソースを変更する場合     Me.RecordSource = "SELECT * FROM テーブル;"     Me.Requery 'フォームの Filter 機能を使う場合     Me.FilterOn = False     Me.Filter = ""   End If End Sub Private Sub Ctl検索分野_Click()   Call WhereMakeSet End Sub Private Sub Ctl検索所在_Click()   Call WhereMakeSet End Sub Private Sub Ctl検索所有者_Click()   Call WhereMakeSet End Sub

masunona
質問者

お礼

ご回答ありがとうございます! 「フォーム自体のレコードソースを変更する場合」 で自分なりに色々やってみたのですがうまくいきません。。。 こちらかなりの初心者のため理解できない部分が多いせいで VBAをうまく編集できていないのだと思います。 参考書やネットで色々調べてみたのですが やっぱり分からないところだらけでした。。 以下の部分について詳細教えていただけると助かります! (1)初っぱなですが以下の一文 「(表示するデータは連結していることが前提です)」 データが連結しているとはどのような意味なのでしょうか? (2)以下について意味を教えてください! (何をしようとしているのかが分かりません。。)      ・Dim sTmp As String    Const OrAnd As String = " AND "   ・If (Len(sTmp) > 0) Then     sTmp = Mid(sTmp, Len(OrAnd) + 1) (3)以下について、 Private Sub Ctl検索分野_Click()   Call WhereMakeSet End Sub Private Sub Ctl検索所在_Click()   Call WhereMakeSet End Sub Private Sub Ctl検索所有者_Click()   Call WhereMakeSet End Sub 現在のところ コンボボックスについては Private Sub Ctl検索分野_Click() Select Case Ctl検索分野 Case 1 Me.RecordSource = "クエリ01" Case 2 Me.RecordSource = "クエリ02" ・ ・ ・ リストボックスについては Private Sub Ctl検索所在_AfterUpdate() Me.RecordSource = "クエリ03" Private Sub Ctl検索所有者_AfterUpdate() Me.RecordSource = "クエリ04" というように検索結果を表示させるよう それぞれVBAを作成してあるのですが それらについてはすべて必要なくなるということなのでしょうか・・?? そもそも   Dim sTmp As String   Const OrAnd As String = " AND " についてまったく理解できていないので VBAをどのように編集していったらいいかが分かりません。。。 ご教授お願いいたします!

関連するQ&A

  • Access2002での複数項目検索について

    教えてください。 Access2002でデータベースを作っています。 ふたつのテーブルから選択クエリを作成、そのクエリ内で部分一致のパラメータを設定し、 複数項目(5つ)の検索を行っていましたが、検索のたびに毎回5つのダイアログボックスを クリア(必要項目を入力、入力しないパラメータは「OK」でとばす)するのがめんどくさいと 使用者にいわれ、検索フォームからの検索に変えたいと思っています。 その場合、  (1)選択クエリを基としたフォームを新規作成し、  (2)非連結のテキストボックスを5つ作り、それぞれ適当な名前を付け、  (3)クエリの抽出条件の欄の現在パラメータ設定をしているところを、       [Forms]![フォーム名]![テキストボックス名]に変える だけではできないのでしょうか。。 いろいろWeb上で調べたり、本を読んで見よう見まねでつくってみましたが、出来上がった フォームから検索ボタン(「クエリの実行」ボタン)を押しても、全件が表示されてしまうの です。 パラメータではできているのに・・・。 どなたか、ご教示くださるとうれしいです。 よろしくお願いいたします。

  • ACCESS VBA フォーム複数条件

    ACCESSフォーム内のテキストボックスが空欄かどうかで条件分岐させる方法を教えてください。 フォーム内に複数テキストボックスがあります。 テキスト1 テキスト2 テキスト3 このテキストボックスの入力があるかどうかで、 エクスポートするクエリを変更したいです。 それぞれのテキストボックスの入力値は、 対応するクエリの抽出条件になっています。 少なくとも、テキスト1には入力があるという条件で、 ・テキスト2が空白なら、クエリ2を出力する ・テキスト3が空白なら、クエリ3を出力する という処理を行いたいのです。 マクロビルダーで、IFを使った処理は作ることができたのですが、 VBAを使って、同じ処理ができるようにしたいです。 どうかご教授のほど、よろしくお願いします。

  • Excel VBA 条件検索について

    ExcelVBAで 「データ検索後リスト表示をして、そのリストから該当するシートを選べば表示される」 というユーザーフォームを作成したいのですが、やり方がよく解りません。どなたか教えて下さい。 具体的には 「コマンドボタンが押された時に、ユーザーフォーム内のテキストボックスに入力された値(名称、日付等)と、複数のシート内のセルの値(名称、日付等)を比較して、一致(全一致、一部一致)した場合、ユーザーフォーム内のリストボックスに表示させる」 というものと 「リストボックスに表示されたものの中から見たいシートを選択すると、そのシートを表示する」 というものです。 リストの表示形式は シート名   名称  日付等 Sheet1    りんご  2013.01.01 Sheet2    りんご  2013.01.02 という具合にしたいと思っています。 ちなみに複数のシートと言いましたが、マスターシートを作りコピーして使用しますので、同一形式のものになります。 以上になります。 色々やってみましたが、うまくいきませんので、どなたか解る方は教えて下さい。 よろしくお願いします。

  • Access2003でコンボボックスからデータを抽出したい

    自己啓発でAccess2003を勉強しています。 Access2003でコンボボックスで名前を選択して、データ(住所)を抽出したものをリストボックスに表示させたいのですがどこがまちがっているかわかりません。こんなことで3週間ぐらい悩んでいます。 回答またはアドバイスをお願いします。 もしくはもっと簡単なやりかたがあればお願いします。 (1)「氏名」、「住所」のテーブルを作成。テーブル名は「01データ」 (2)「氏名」、「住所」のクエリを作成。クエリ名は「クエリ1」 (3)フォームでコンボボックスとリストを作成。フォーム名は「印刷」 ⇒コンボボックスの名前は「検索」。 ⇒値集合ソースはSELECT [01データ].ID, [01データ].氏名 FROM 01データ; これで「氏名」が選択できた。 (4)クエリの「氏名」抽出条件にLike [forms]![印刷]![検索] (5)検索するマクロを作成。マクロ名「M検索」 アクションは 全レコードの表示 フィルタの実行 ⇒Where条件は[Forms]![印刷]![検索]=[クエリ1]![氏名] (6)マクロ「M検索」をコンボボックスのプロパティ「イベント」タブから変更時に設定する。 (7)フォーム「印刷」を開き、コンボボックスで氏名を選択すると『クエリ1!氏名』と表示されてしまいます。 (8)フォーム「印刷」のリストボックスは全レコードが表示されている。

  • Access リストボックス複数選択を抽出条件に

    Access リストボックスで複数選択した値をクエリの抽出条件にしたいです。 ※PC環境:Win7 Access2007 Excel2007 リストボックスで複数選択した値を取得する事はできるのですが、 クエリ実行をすると結果が0件になってしまいます。 他の方のQAなどを参考に以下を作成しましたが、ほしい結果が得られず困っています。 おわかりになる方、ご教示いただけますようお願い致します。 <動作概要> 「画面」の「リストボックス」で複数選択し、 [実行]ボタンを押して、「リストボックス」で選択した値を、「テキストボックス」にセットし、 クエリの抽出条件に、in(テキストボックス)をセットし、テーブルから合致するデータを抽出したい <リストボックス> ※年区分テーブル参照 区分,区分名 1,1年 2,2~3年 3,4~5年 「2,2~3年」「3,4~5年」を選択 ※「区分」は数値型 <VBA> Private Sub 実行_Click()  Dim i As Variant  Me.テキストボックス = Null  For Each i In Me.リストボックス.ItemsSelected Me.テキストボックス = Me.テキストボックス & Me.リストボックス.Column(0, i) & "," Next If Me.テキストボックス <> "" Then  Me.テキストボックス = Left(Me.テキストボックス, Len(Me.テキストボックス) - 1) End If   'ここで画面を確認すると「テキストボックス」には、「2,3」 がセットされている DoCmd.OpenQuery "クエリ"   'テーブルには抽出条件に該当するデータがあるが、クエリ実行結果は0件 End Sub <クエリ SQL> SELECT テーブル FROM テーブル WHERE (((テーブル.区分) in([Forms]![画面]![テキストボックス]))); ※「テーブル.区分」は、数値型 どうぞよろしくお願い致します。

  • ACCESSのフォーム上で複数検索したい項目がある場合どうすればいいですか?

    (1)部品ID (2)日付 (3)入庫か出庫  以上3つを検索したいのですがどうすればいいでしょうか? (1)の部品IDはリストBOXの一覧から選択し、選択したものをテキストBOXに表示させるという形で作成しました。 (2)の日付はテキストBOXに手入力という形です。 (3)の入庫か出庫はコンボBOXで選択するという形です。 検索ボタンを作成してクエリの更新をかけて表示したいと思うのですが、3つの条件のうちその時により、全ての検索条件を入力しなくても1つでも条件を入力するとその条件が表示させるようにさせたいのです。 あと、何も条件を入力せず、検索ボタンを押すと全てのデータが表示させれるようにもしたいのです。 どのようなコードを記述すればいいでしょうか? よろしくおねがいします

  • ACCESSクエリ抽出条件について

    フォーム画面のリストボックスで複数選択が出来るよう設定し、その結果をクエリの抽出条件で forms![フォーム名].[リストボックス名] としたのですが全く反映されません。 複数選択が出来ないようにしたら問題なく表示されるのですが、上記の記述以外に入力しないといけないのでしょうか?

  • アクセスでこんなフォームを作成したいのですが・・・

    サブフォームにクエリ集計から作成したフォームを表示し、メインのフォームで選択すると、サブフォームに選択したものだけの表が表示されるようなフォームを作りたいのです。 例をあげると・・・ メインフォーム→名簿 サブフォーム→成績表(行:名前  列:科目  値:点数) メインフォームの名簿をリストBOXで選択できるようにして、選択した名前をテキストBOXで表示させるまではできています。 そのテキストBOXに表示された人の成績だけをサブフォームの表に表示したい。 説明が下手で申し訳ないのですが、分かる方ぜひ教えてください。お願いします。 また、複数の人を選択したとき、必要な表だけ表示する方法も教えてください。 宜しくお願いします。

  • access クエリ 検索フォームの作り方

    よろしくお願いします。 やりたいこと: フォーム上で、テキストボックスに入力した値を検索して表示したい。 本やウェブで調べて、なんとか一度はやっと出来たのですが、 誤って何かを変更してしまい、使えなくなってしまいました。 今となってはどの資料を見て作れたのかわからなくなりました。 やったこと: クエリ :クエリA   条件にforms!フォームA!txt0を入力 フォーム:フォームA ヘッダーに非連結のテキストボックスtxt0を作成 txt0の更新後処理:docmd.requeryを入力 しかし、txt0に入力しても検索されません。 フォームのプロパティのレコードソース欄にクエリAを選択するようですが、 選択するクエリ名が表示されないので、クエリ名を入力しましたがダメでした。 どこか間違っているのでしょうか。VBAまでは勉強できないので上記範囲内でお願いします!

  • アクセスのクエリ、リストボックスで複数選択をしたい

    フォームのリストボックスから選択してクエリで検索しています。 ▼フォーム 例) 北海道 東北 関東 ▼クエリ [Forms]![フォーム]![地域] ← 抽出条件 リストで1つしか選べないのですが、これを複数選択出来るようにするにはどのようにしたら 良いのでしょうか? 今だと北海道しか選べないので、これを北海道、東北などと複数を選べるように変更したいと思っています ?ご存知の方教えてください。

専門家に質問してみよう