ACCESS VBA Filterに配列を使いたい

このQ&Aのポイント
  • Access VBAのFilter機能を使用して検索条件を設定する際に、配列を使用しようとしていますが、うまくいっていません。コードとデータ型に問題があるようです。正しい方法を教えていただけないでしょうか。
  • 現在、Access VBAの検索機能を改善するために、検索条件に配列を使用しようとしています。しかし、配列の使用方法に誤りがあり、うまくいきません。解決策を教えていただけないでしょうか。
  • Access VBAのFilter機能において、検索条件を配列を使用して設定しようとしていますが、エラーが発生しています。正しい記述方法を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

ACCESS VBA Filterに配列を使いたい

初めての書込みです。誤りがあれば、訂正致しますので、宜しくお願いします。 (背景) Access2003で作成したプログラムを、3年ほど使ってきました。 少しずつバージョンアップを加え、機能を増やしてきた次第です。 これまでの検索は、クエリによる抽出条件設定を行っていましたが、 入力型フィールドが2つから4つに増えるため、Is Null とlikeによる抽出条件の設定ではカバーしきれないと判断しました。 (本題) 検索結果フォームのレコードに、VBAでFilterをかけるべく頑張ってきましたが、 Loopを使う為にフィールド名を配列変数にしているところで 行き詰まってしまいました。 (やりたいこと) 検索条件 ="部署 Like '*人事*'"   'としたい。 (今の状態) 検索条件 = "部署 Like '* Form_frm_検索ボックス!部署検索 *'" 'となってしまう。 (1)コード 検索条件 = sh(i) & " Like '*" & "Form_frm_検索ボックス!" & sh(i) & "検索" & "*'" (2)データ型 Dim 検索条件 As Variant Dim sh(4) As String Dim i as integer コード、及びデータ型で、間違っている場所が分かれば、ご指導頂けないでしょうか。 宜しくお願いします。

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

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

【要旨】 ご質問のコードを、以下のように修正すれば、ご希望の結果が得られるのでは ないかと推察します。 <現在> 検索条件 = sh(i) & " Like '*" & "Form_frm_検索ボックス!" & sh(i) & "検索" & "*'" <修正> 検索条件 = sh(i) & " Like '*" & Form_frm_検索ボックス.Controls(sh(i) & "検索") & "*'" 【説明】 「Form_frm_検索ボックス!○○検索」となる部分をダブルクォーテーションの 外に出し、その値(→ご質問の例では「人事」)をコード上で確定させることで、 「"部署 Like '*人事*'"」という文字列式を生成させています。 このとき、「~!○○検索」の形にするのではなく、当該フォームのControls コレクションを経由することで、コントロール名(→「○○検索」)による指定を 可能にしているのが『キーポイント』となります。 なお、もしもこのままではわかりにくいようでしたら、「Controls( )」の括弧の 中に入る部分を「strTB = sh(i) & "検索"」(strTBはString型の変数)とすると、 若干わかりやすいかもしれません。 更に、一旦「varText = Form_frm_検索ボックス.Controls(strTB)」として 「人事」という文字列自体を変数に格納してもOkです。 (varTextはVariant型の変数:Nullの場合、String型では代入できないため:  又は下記蛇足のように、Nz関数で空文字に変換してString型の変数に代入) 【蛇足】 ご存知だとは思いますが、Nullのレコードは「Like」では抽出できないため、 以下のようなIf文での場合分けが必要となりますので、念のため参考までに: Dim strText As String strText = Nz(Form_frm_検索ボックス.Controls(sh(i) & "検索")) If strText = "" Then   '条件の指定なし   検索条件 = "" ElseIf strText = "Null" Then   'Nullのレコードを抽出(→「Null」という文字列の指定で対応する場合)   検索条件 = sh(i) & " Is Null" Else   '「Null」以外の文字列が指定されている場合   検索条件 = sh(i) & " Like '*" & strText & "*'" End If

goodegoodeggg
質問者

お礼

意図を完全にくみ取った回答を頂き、敬服しました。 >>検索条件 = sh(i) & " Like '*" & strText & "*'" まさに求めていた回答です、ありがとうございました! Is Nullの条件分岐設定は次に考えようとしていたので、 これまた助かりました、、恥ずかしながら丸コピさせていただきました。 今回フォームでのFilter条件に初トライしてみて、 クエリで組んだ時よりずっと可読性・拡張性に富んでいて 良いな♪と思いました。 ただ…これまでクエリの抽出結果をそのままEXCELへEXPORT、が できなくなってしまいましたので、今度はそっちに対応しなければ・・・。 (Opn時 Filterなので、クエリをExportすると全件吐き出される・・・) しばらく考えて、わからないようだったらまたgoo!してみます。 お時間ありましたら、またお付き合い頂ければ幸いです。 ※最後に、「急いでいます!」アイコンを選んだにも関わらず、 締めまで時間がかかってしまったこと、お詫び申し上げます。

その他の回答 (3)

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

No.2です。 見て見ぬふりをするのもどうかと思いましたので、補足しておきます。 『Formsコレクション経由の参照』(「Forms!フォーム名」や 「Forms("フォーム名")」)と、『フォームモジュール経由(?)の参照』 (「Form_フォーム名」)は、完全互換や上位互換といった関係には ありません。 現状で動いている部分までわざわざ修正する場合は、充分に ご注意下さい。 (前者はVBAの他、プロパティシート上やクエリ上でも使用可能で  汎用性がある一方、後者ではVBAに限定されるものの、下に  提示したURLのNo.1でも触れている「インテリセンス」が有効に  なる(→当該フォーム上のコントロール等も含めて参照可能に  なる)等の特徴があります) http://okwave.jp/qa/q8031397.html なお、Loopについての補足が必要なようでしたら、改めて補足 しますので、その旨追記してください。 (それにしても、折角質問者の方が要点を絞っている状況で、  なぜ最初から全文を書きたがるのか・・・)

goodegoodeggg
質問者

お礼

追加の補足まで頂き、ありがとうございました。 勉強になります!

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

> Form_frm_検索ボックス!部署検索 上記記述にしているのは、何か意図はありますか? 通常は、 Forms!frm_検索ボックス!部署検索 とか Forms("frm_検索ボックス").Controls("部署検索") とかの記述になると思います。 この記述の違いは、(雰囲気)以下の#1を参照してみてください。 VisibleとOpenFormは意味が同じ? http://okwave.jp/qa/q7778972.html 「frm_検索ボックス」と「検索結果」の、2つのフォームが存在するという事ですね。 補足をお願いしていいですか? 1)上記記述にしているのは、何か意図はありますか? 2)処理を記述するのは、どちらのフォームになるのでしょうか? 3)各検索条件は AND / OR どちらで繋げれば良いですか? 現状で回答するとすれば、例えば、 ・「部署」「部署1」「氏名」「住所」を「frm_検索ボックス」フォームで文字列を作る ・繋げるのは AND とした場合、以下未検証です(記述するのは「frm_検索ボックス」フォーム) Public Function GetFilterStr() As String   Dim sWhere As String   Dim v As Variant   Const sAndOr As String = " AND "   sWhere = ""   For Each v In Array("部署", "部署1", "氏名", "住所")     With Me(v & "検索")       If (Len(Nz(.Value)) > 0) Then         sWhere = sWhere & sAndOr & v & " Like '*" & .Value & "*'"       End If     End With   Next   GetFilterStr = Mid(sWhere, Len(sAndOr) + 1) End Function ※ Is Null の処理は入れてません ※ 上記は AND ~~ AND ~~ と作っておいて、先頭の AND を除いたものを・・・ 全部あれば 部署 Like ~ AND 部署1 Like ~ AND 氏名 Like ~ AND 住所 Like ~~ に。 関数 GetFilterStr の戻り値は、Filter に設定する文字列にしたので、 a)「frm_検索ボックス」フォームから「検索結果」フォームに設定する場合 With Forms("検索結果")   .Filter = GetFilterStr   .FilterOn = Len(.Filter) > 0 End With b)「検索結果」フォームから「frm_検索ボックス」フォームを参照する場合 Me.Filter = Forms("frm_検索ボックス").GetFilterStr Me.FilterOn = Len(Me.Filter) > 0 ※   For Each v In Array("部署", "部署1", "氏名", "住所")  部分は、 For Each v In Split("部署,部署1,氏名,住所", ",") でも良いかも・・・ また、 Dim sh(3) As String sh(0) = "部署" sh(1) = "部署1" sh(2) = "氏名" sh(3) = "住所" For Each v In sh でもできるかも・・・

goodegoodeggg
質問者

お礼

回答ありがとうございました。 >1)上記記述にしているのは、何か意図はありますか? VBA初心者で、マクロから変換したコードをコピペした結果です。 紹介頂いたページ、大変参考になりました、ありがとうございました。 >2)処理を記述するのは、どちらのフォームになるのでしょうか? 検索結果のOPEN時イベントで処理していました。 >3)各検索条件は AND / OR どちらで繋げれば良いですか? ANDです。 Loopは独学でなんとかなったのですが、 For Each v In Splitは初めてだったので、使用させていただきました! つたない質問からたくさんの回答を頂き、感謝致します。 また機会がありましたら、宜しくお願いします。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

sh(i)に"部署"が入っているなら、 検索条件 = sh(i) & " Like '*" & "Form_frm_検索ボックス!" & sh(i) & "検索" & "*'" とすれば、 検索条件 = "部署 Like '* Form_frm_検索ボックス!部署検索 *'" となる。 当然といえば当然のことです。 Form_frm_検索ボックスはどんなフォームなのか? どんなコントロールを配置しているのか? "Form_frm_検索ボックス!" & sh(i) & "検索" の"検索"はどういう意味で記述したのか? それが分からないと回答しようがないでしょう。

goodegoodeggg
質問者

お礼

>"Form_frm_検索ボックス!" & sh(i) & "検索" の"検索"はどういう意味で記述したのか? 補足に至るまで時間がかかってしまい、申し訳ありません。 "検索"は、コントロールの接尾語で、配列関数(sh(i))のあとに必ずつくキーワードです。 例:部署検索、住所検索、氏名検索 というコントロールたち。。 要領を得ない質問で、申し訳ありませんでした。 回答、ありがとうございました。

関連するQ&A

  • 【Access】複数フィールドを対象とする検索

    Access上で「検索ボタン」をクリックすると、 「データ」フォームのフィールド1、フィールド2、フィールド3のいずれかに「検索条件1」の語を含み、かつ、フィールド4、フィールド5、フィールド6のいずれかに「検索条件2」の語を含むレコードを抽出できるようにしたいと思います。 検索条件はテキストボックスに入力するようにしており、テキストボックス名は「検索条件1」、「検索条件2」となっています。 以下のコードでやってみたのですが、「実行時エラー13、型が一致しません」というエラーが出てうまく抽出できません。 Private Sub 検索ボタン_Click() Dim filter1 As String filter1 = "フィールド1 like '*" & Me!検索条件1 & "*' or フィールド2 like '*" & Me!検索条件1 & "*' orフィールド3 like '*" & Me!検索条件1 & "*'" And " フィールド4 like '*" & Me!検索条件2 & "*' or フィールド5 like '*" & Me!検索条件2 & "*' orフィールド6 like '*" & Me!検索条件2 & "*'" DoCmd.OpenForm "データ", acNormal Forms!データ!.filter = filter1 Forms!データ!.FilterOn = True End Sub 「検索条件1,2」のテキストボックスがあるフォーム上の「検索ボタン」をクリックすると、 「データ」フォームが開き、検索をかけるという流れをイメージして作成 しています。 どなたか正しい記述を教えていただけませんでしょうか。 よろしくお願いいたします。

  • Access97VBAでのFilter方法

    ・初歩的な質問でスミマセン。  Access97のVBAでツマヅキ、何か解決の方法はないかと思い質問させていただきます。 クエリー1を元にして作成した、開いている「フォームA」の「テキスト1」(テキストボックス)の文字列でフィルターをかけたいと思っています。 下記のコードを書き実行するのですが、フィルターがかからずクエリー1のデータがそのまま抽出されてしまいます。 Filterコマンド行の記述が間違っているのでしょうか? * クエリ1に「フォームA」の「テキスト1」ボックスを参照する抽出条件を入れてたのですが、「パラメータが少なすぎます。・・・」のエラーとなるので、この方法で行っています。 * Private Sub コマンド6_Click() Dim stTBL, stFltr As Recordset Dim stQRY As DAO.Recordset Set stQRY = CurrentDb.OpenRecordset("クエリー1") stQRY.Filter = "テキスト1='" & [Forms]![フォームA]![テキスト1] & "'" Set stFltr = stQRY.OpenRecordset stQRY.MoveFirst Do Until stQRY.EOF MsgBox stQRY.Fields("フィールド2") stQRY.MoveNext End If Loop 以上のようなんですが、どうかご指導お願いします。

  • アクセスのVBAについて

    win2000、アクセス2000を使用しています。 「検索条件」というフォームのテキストに条件を入力したら、「検索結果」というフォームへ抽出されるようにしたいのです。 条件を入力する際に一部分(キーワード)の入力でも当てはまるデータが抽出されるようにしたいのですが、検索条件を入力するテキストボックスが10ヶ所あり、それぞれにキーワードでの抽出をしたいのです。 DoCmd.OpenForm "検索結果", acNormal, , "[施工年度] Like '*" & t_04.Value & "*'" ※[施工年度] →フィールド名  t_04    →テキスト名 上の状態では、うまくいきましたが、条件が複数ある時はどうやって続けたらよいかわかりません。 単純に And で続けたらエラーがでてうまくいきません。 アクセス初心者のため、うまく説明できず申し訳ありませんが、どうぞよろしくお願いします。

  • Accessのクエリ

    初めまして。Accessのクエリについての質問です。 Access2003を使っています。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件にあいまい条件のLike "*" & [Forms]![フォーム名]![テキストボックス名] & "*"を入れています。 今はテキストボックスが2つですが、もっと増やしていろんな条件で検索出来るようにしたいので、3つ目のテキストボックスを作り、抽出条件も同じように入れました。ですが、そうすると今までちゃんとできていた最初の2つのテキストボックスによる抽出が違った結果となりでてきました。このとき、新しく作った3つ目のテキストボックスは空欄なので最初と同じ結果が出ると思ったのですが、これは抽出条件が3つはできないということでしょうか?どなたか教えてください。

  • Accessでデータベースを作っています。

    Accessでデータベースを作っています。 先日、こちらで質問をさせていただいて、クエリで複数のフィールドを対象にデータを検索する ことはクリアできました。 ありがとうございました。 ご指導に基づき、4つのフィールド(仮にA,B,C,D)について、クエリの抽出条件に  Like "*" & [Aを入力] & "*"  Like "*" & [Bを入力] & "*" ・・・ とそれぞれ設定してパラメータ入力を求め、4つの条件すべて、または一部のみ設定して検索し、 正しい検索結果が得られました。 今度は、検索用のフォームを作成し、フォームで入力した条件をクエリに送って、同じ結果を 得たいと思うのですが、以下の方法では正しい検索結果が出てきません。 ・フォームに検索用のボックスをA~Dまで4つ作成(ひとつはコンボボックス、あとはテキスト) ・クエリの抽出条件に、それぞれ以下を入力     Like "*" & [Forms]![Q_form(作成したフォームの名前)]!                       [A(それぞれの検索ボックスの名前)] & "*" ・フォームに「クエリの実行」のコマンドボタンを配置 パラメータで入力する代わりにフォームを使いたい、というものなのですが(パラメータ入力 よりも、コンボボックスを使って値を選ぶ方が検索する人には使いやすいかと思って)、どうしたら うまいこといきますでしょうか。。 教えてください。

  • Access filterにて

    フィルターする時、オプションボタンやトグルボタンを使用し、Select Caseで分岐させてフィルターするやり方でなく、下記のようにすることはできますか? ************************************************************** 「Me.検索項目」はコンボボックス(集合体ソースには、検索するフィールド名を用意) 「Me.日付入力」は日付だけを入力するテキストボックス Me.Form.Filter = "'" & Me.検索項目 & "'" = "#" & Me.日付入力 & "#" Me.Form.FilterOn = True ************************************************************** 検索するフィールド名をいちいち記述しなくて済むのでは?と思いましたが、結果が得られませんでした。 どこがおかしいのでしょうか?よろしくお願いします。

  • VBA 初心者

    sheet1から、sheet2データを検索して抽出する練習をしているのですがerror"1104"が表示されます、なぜなのか分からないので投稿しました、よろしくお願いします。 sub test() dim sh1 as worksheets dim sh2 as worksheets dim  i  as  integer set sh1 = thisworkbook.worksheets("sheet1!") set sh2 = thisworkbook.worksheets("sheet2!") b = userform1.textbox1 for i = 1 to 10 sh1 .cells(i,2) = b b = b+1 x = sh1.cells(1,2) sh1.cells(i,3).value = worksheetfunction.vlookup(x,sh2.range("a1:d500"),2,false) next i end sub

  • Access2007 Like と Notlike

    フォームに数個テキストボックスがあり任意の文字列で検索できるようにしていますが、 ”この文字列を含まないもの” という検索もできると検索精度が上がります。 クエリの1つのフィールドの抽出条件に  Like "*" & form!フォーム名!テキストボックス1 & "*" And Not like "*" & form!フォーム名!テキストボックス2 & "*" ということがしたいのですがうまくいきません・・・ (Like と Not Like が混在は無理 というのも理解できるのですが…) form!フォーム名!テキストボックス1 → この部分に直接文字列を記述すると機能するのですが、フォームに入力された文字列を検索 という記述にすると機能しません… フォームのテキストボックスに何も記述されていない時は全部表示するようにしたいです。 こんなことは可能でしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • うまく処理されません(ACCESSのVBA)

    イベント事業を管理するデータベースを作っています。 メインのテーブルを表示するフォームから、チェック(Yes/No型)された項目だけを抽出したクエリ「記事抽出」があります。 ここから、「行事名」「会場」「月1」「日1」という各フィールドのデータを以下のコードのように変数に代入していきたいのです。 チェックした数が少ないときはうまくいくのですが、20個くらいチェックすると、ループの途中で抜けてしまいます。このとき、エラーメッセージは表示されません。 原因として考えられることがあればお教えください。 説明が不足しているようでしたら、補足のほうで説明したいと思いますのでよろしくお願いします。 Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim i As Integer Dim gyouji(50) As String '行事名 Dim kaijyou(50) As String '会場 Dim tuki1(50) As Integer '月1 Dim nichi1(50) As Integer '日1 Set cnn = CurrentProject.Connection i = 0 With rst    .Open "記事抽出", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect    Do Until .EOF      gyouji(i) = !行事名      kaijyou(i) = !会場      If IsNull(!月1) Then        tuki1(i) = 0      Else        tuki1(i) = !月1      End If      If IsNull(!日1) Then        nichi1(i) = 0      Else        nichi1(i) = !日1      End If      .MoveNext      i = i + 1    Loop    .Close End With cnn.Close

  • アクセス チェックボックスとクエリ

    いつもお世話になっております。アクセス初心者です。 あるフォームのチェックボックスのオンオフとコンボボックス、 クエリの選択条件が思うように連携できなくて困っています。 やりたいことは、、、フォームのチェックボックスが、 ON(True)ならば、 フィールドにコンボボックスのキーワードを含むレコードおよびフィールドが空白のレコードを抽出し、 OFF(False)ならば、 フィールドにコンボボックスのキーワードを含むレコードのみでフィールドが空白のレコードは抽出しない、 としたいのですが…。 IIfやSwitchで式を書きましたが、チェックを入れても外しても、どちらも抽出件数が0件になります。 クエリの実行は、コマンドボタンで別のフォームを開いています。 (IIfでは、エラーが出ているのか、チェックを入れた時『~キャンセルされました』と出ます。  IIf(…,…,IIf(…,…,…)) という感じで書きました。) Switchの時のクエリの抽出条件の式は、次のような感じです。 Switch([Form]![チェックボックス]=True,([テーブル名].[フィールド名]) Like "*" & [Form]![コンボボックス] & "*" Or Is Null,[Form]![チェックボックス]=False,([テーブル名].[フィールド名]) Like "*" & [Form]![コンボボックス] & "*") ( Like の前の『([テーブル名].[フィールド名])』は、式をビルドすると、勝手に追加されてきます。) このようなことはできないのでしょうか? 別の方法が必要でしょうか? すみませんが、教えてください。宜しくお願い致します。

専門家に質問してみよう