ACCESS VBAを学習しています。
今回はVBAを使ってテキストボックスの値を取得してフォームで検索する方法について学びます。
この記事では、使い方と使用例を掲載しています。
使い方については、よく使う部分だけを抜粋してご紹介しています。
詳細は公式のドキュメントをご覧ください。
説明・パラメータ
フォーム上で検索してその結果を表示するには、分割フォームを使用してForm.Filterプロパティを使う方法があります。
ACCESSのフォームで検索をする際、VBAのコード内にSQL構文が混ざってしまいます。最終的な書き方をいきなりご紹介するとわかりづらいので、初めに3つだけポイントをご紹介させてください。
既にわかっているという方は読み飛ばしても問題ありません。
SQLでは「’」で囲って文字列として扱う
SQLではある値を文字列として扱いたいときは「’」を使います。
※実際には「”」でも文字列とすることができますが、ACCESS VBAではSQLの部分は「’」シングルクオーテーションを使っている例も多いです。
ACCESS VBAでは「”」で囲って文字列として扱う
続いて、ACCESS VBAではある値を文字列として扱いたいときは「”」ダブルクォーテーションで囲って使用します。
SQLと違って、「’」では文字列として扱うことはできません。
ACCESS VBAでの文字列・変数の結合は「&」
1 2 3 4 5 6 |
Dim a As String Dim b As String a = "Hello" b = "World" MsgBox a & B # HelloWorld |
↑のように、ACCESS VBAでは文字列や変数を結合して扱いたいときは「&」を使用します。
ここまでの3つのポイントを把握したうえで書き方に移ります。
書式
フィルタ・検索する条件を直接指定する場合
1 2 3 4 |
Private 検索() Me.Filter = " [列名] = '[値]' " Me.FilterOn End Sub |
「Me」というのは、フォーム自身のことを指しています。
[列名]は可変であり、検索を行うテーブル・クエリ内に存在する列名を自分で指定します。
[値]も可変であり、検索条件に使う内容をここで指定します。
[列名]で指定した列内に[値]と完全もしくは部分的にに一致するデータが抽出されます。(大小比較などもあります。)
同じ列内に重複があるデータならフィルタによって複数の行(レコード)が表示され、
一意に特定される主キーでなら唯一の行(レコード)が表示されます。
「’」シングルクオーテーションはSQL構文としての文字列化です。[値]に含まれている内容をSQLにおいて文字列として扱います。
「”」はVBAとしての文字列化です。一番外側を囲むことで、SQL構文を含めて全て文字列として扱っています。
最後に、「Me.FilterOn」で実際にフィルタを行っています。
フィルタ・検索する条件を変数で指定する場合
1 2 3 4 |
Private 変数を使った検索() Me.Filter = "[列名] = '" & [変数] & "' " Me.FilterOn = True End Sub |
こちらの例では、変数を使って検索条件を指定しています。
3つの部分に分けることができます。
1:”[列名] = ‘ ”
→「[列名]= ‘」を「”」で囲ってVBA内で文字列としています。
2: [変数]
3:” ‘ ”
→「’」を「””」で囲ってVBA内で文字列としています。文字列とされた「’」は、1にある「’」と前後から2の[変数]を挟み、[変数]をSQL構文として扱っています。
そして、1と2、2と3の間を「&」で挟んでいます。
※1,2,3はそれぞれVBA内で文字列として扱っているので「&」で結合できます。
「”」で囲っている箇所が2つあります。なぜこんなややこしい書き方にするかと言うと、[変数]を「”」で囲ってしまうと、変数としての文字がそのまま出力されてしまうからです。
「Hello」という文字列が格納された変数「text」があったとして、1組の「”」だけで囲ってしまうと「[列名] = ‘text’」となってしまいます。
テーブル・クエリ内の[列名]で指定した列の中には「text」という値が入っている行(レコード)はないため、何も検索結果に表示されないことになります。
変数を使って複数の条件でフィルタ・検索する場合
1 2 3 4 5 6 7 8 |
Private 検索() Dim filter1 As String Dim filter2 As String filter1 = "[列名] = '" & Me![テキストボックス1] & "'" filter2 = "[列名] = '" & Me![テキストボックス2] & "'" Me.Filter = filter1 " And " filter2 Me.FilterOn = True End Sub |
変数を使って複数の条件に全て合致する場合の方法です。
1つ目の検索条件を変数filter1に代入し、
2つ目の検索条件をfilter2に代入し、
Me.Filterには filter1とfilter2を「And」演算子でつないで代入しています。
この時、「And」演算子はVBAとしての演算子になります。
また、必ず「And」の前後には半角スペースが必要です。もし、スペースなしの場合、[filter1]And[filter2]というように、一連の文字列として認識されてしまいます。
And条件(全ての条件に合致する場合)を使っているので、1つでも当てはまらない内容がある場合は検索にヒットしません。
また、テキストボックス1,2は両方とも入力する必要があります。厳密にいうと、空白でも問題はありませんが、その場合はある列では何かしらの値を持ち、もう一方の列では空白の値を持っているという検索条件になり、ヒットしない結果にあります。
使用例(コード)
1つの条件で値を直接指定して検索
1 2 3 4 |
Private Sub button_検索_Click() Me.Filter = "顧客番号 = '1001111111'" Me.FilterOn = True End Sub |
顧客番号の列で、「1001111111」の値と一致する行(レコード)を全て抽出します。
↑の図では、テキストボックス内には何も入力していませんが、VBAのコード内で検索値を指定しているため、想定通りにフィルタ・検索ができています。
1つの条件で変数を使って検索
1 2 3 4 5 6 |
Private Sub button_検索_Click() Dim text As String text = "1001111112" Me.Filter = "顧客番号 = '" & text & " ' " Me.FilterOn = True End Sub |
「text」という変数に「1001111112」を代入し、「顧客番号列」内にその値が含まれる行(レコード)を抽出しています。
今回もVBAのコード内で検索値を指定しているので、「顧客番号」のテキストボックス内では何も入力していなくても検索することができています。
テキストボックスに入力された値で検索
1 2 3 4 |
Private Sub button_検索_Click() Me.Filter = " 顧客番号 = '" & Me!textbox_顧客番号 & "' " Me.FilterOn = True End Sub |
ここでは、フォーム内の「textbox_顧客番号」という名前のテキストボックスに入力された値を取得して、「Me.Filter」にセットしてからフィルタ・検索を行っています。
「Me!」はフォーム自身のことを指していますが、「Me」を別のフォーム名にすることで、別のフォームを指定することもできます。
顧客番号のテキストボックスに「1001111111」を入力し、検索ボタンを押した結果が以下の画像です。
これで検索することができました。
変数を使って複数の条件で検索
1 2 3 4 5 6 7 8 |
Private Sub button_検索_Click() Dim filter1 As String Dim filter2 As String filter1 = " 顧客番号 = '" & Me!textbox_顧客番号 & "'" filter2 = "電話番号 = '" & Me!textbox_電話番号 & "'" Me.Filter = filter1 & " And " & filter2 Me.FilterOn = True End Sub |
検索に指定する条件の数だけ変数を文字列型で用意します。
次に、各変数に検索条件を代入していきます。
次に、「Me.Filter」に各検索条件を「 And 」でつないで代入します。
※Andの前後に空白があることに注意してください。
最後にフィルタオンで↓のように検索することができます。
注意点として、検索値を入れるテキストボックス(「顧客番号」、「電話番号」)のどちらかが空白だった場合、
一方は値を持ち、もう一方は空白の行(レコード)を探すことになります。多くの場合で検索にヒットしないことになるため、実質的に全てのテキストボックスで入力が必須になります。
参考
公式ドキュメントです。
Form.Filter プロパティ (Access) | Microsoft Learn
また、変数を使った検索についてはこちらの記事がわかりやすいです。
Access上のコード内で引用符(“)と単引用符(‘)の使い分けについて – hatena chips (fc2.com)
ACCESSの記事を一覧にしています。ACCESS VBAの正式な情報は公式ドキュメントを読むべきですが、このサイトでは実際に使う場面を想定して紹介しているので、公式ドキュメントと併せて読んでいただくと理解が深まると思います。
コメント