前回の続きになります。進捗が遅くてお恥ずかしいですが、どうぞよろしくお願い致します。
Filterプロパティを利用した検索機能についてなのですが、エラーの原因は分かっているのですが、対処の仕方が分からずにいます。どうぞ知恵をおかしください。
検索機能について
ユーザーフォームにオブジェクト(テキストボックスを2つ、検索ボタンを1つ、リストボックスを1つ)を設置しています。
検索にかける文字列は、TextBox1に姓(ex.山田)もしくはセイ(ex.ヤマダ)、TextBox2に数字4文字(ex.0123)。
検索の参照先は、TextBox1がレコードセット(adoRs)の「姓」もしくは「セイ」のフィールドの値、TextBox2が「電話番号1」もしくは「電話番号2」のフィールドの値です。
検索条件は、TextBox1とTextBox2と共に部分一致です。またテキストボックスへの入力はTextBox1とTextBox2のどちらか一方のみ、もしくは2つとも入力しても検索可能な仕様にしたいと思っています。
最後に検索条件に一致したら、レコードセットを参照して必要な情報をリストボックスに表示します。
エラーがでる場所
vba
1adoRs.Filter = "姓 like '%" & Me.TextBox1.Value & "%'" & "OR セイ like '%" & Me.TextBox1.Value & "%'" & _ 2 "OR 電話番号1 like '%" & Me.TextBox2.Value & "%'" & "OR 電話番号2 like '%" & Me.TextBox2.Value & "%'"
エラーメッセージ
実行時エラー'301':
引数が間違った型、許容範囲外、または競合しています。
原因と思われるもの
Filterプロパティの検索文字列にはNullの値は使用できないという説明がありました。
用意している参照先のAccessデータベースにはNullもあります。
テキストボックスの値は空(""
)のときにエラーが出るので、これがNullと競合?しているのだと思われます。
考えてみた解決策
素人考えで解決策を考えてみました。テキストボックスの値が空だとエラーが出るので、空の場合はアンダーバーを入れる、というようにしてみました。しかし、うまいやり方ではないんじゃないかと思われて…。(下記のコードをadoRs.Filter
より前にかませてみたら一応動きはしたのですが…)
vba
1 If Me.TextBox1.Value = "" Then 2 Me.TextBox1.Value = "_" 3 Else 4 Me.TextBox1.Value = Me.TextBox1.Value 5 End If 6 If Me.TextBox2.Value = "" Then 7 Me.TextBox2.Value = "_" 8 Else 9 Me.TextBox2.Value = Me.TextBox2.Value 10 End If 11
なにか良い回避策をご教授いただけませんでしょうか?どうぞよろしくお願い致します。
質問に不備がありましたら改善したいと思いますので、ご指摘いただけると幸いです。
全文は下記の通りです。
vba
1Option Explicit 2 3'---ACCESS接続用 4Private adoCn As Object 5Private adoRs As Object 6Private strSQL As String 7 8'---ユーザーを検索 9Private Sub SearchButton_Click() 10 Dim cnt As Long 11 12 Call ConnectDB 'データベースに接続 13 14 strSQL = "SELECT * FROM 顧客マスター" 15 adoRs.Open strSQL, adoCn 16 17 '抽出条件を設定してフィルターをかける 18 adoRs.Filter = "姓 like '%" & Me.TextBox1.Value & "%'" & "OR セイ like '%" & Me.TextBox1.Value & "%'" & _ 19 "OR 電話番号1 like '%" & Me.TextBox2.Value & "%'" & "OR 電話番号2 like '%" & Me.TextBox2.Value & "%'" 20 21 If adoRs.BOF = True And adoRs.EOF = True Then '条件に一致するデータがない場合、データベースを切断して終了 22 Call CutDB 23 MsgBox "条件に一致するデータがありません。" 24 Else 25 With Me.SearchList 26 .ColumnCount = 8 27 .ColumnWidths = "50;50;40;40;60;200;100;100;" 28 .Font.Size = 13 29 Do Until adoRs.EOF 'レコードが終了するまで繰り返す 30 .AddItem "" 'リストボックスに表示する 31 .List(cnt, 0) = NullChg(adoRs(3).Value) '姓 32 .List(cnt, 1) = NullChg(adoRs(4).Value) '名 33 .List(cnt, 2) = NullChg(adoRs(6).Value) 'セイ 34 .List(cnt, 3) = NullChg(adoRs(7).Value) 'メイ 35 .List(cnt, 4) = NullChg(adoRs(10).Value) '都道府県(住所1) 36 .List(cnt, 5) = NullChg(adoRs(11).Value) '住所2 37 .List(cnt, 6) = NullChg(adoRs(13).Value) '電話番号1 38 .List(cnt, 7) = NullChg(adoRs(14).Value) '電話番号2 39 adoRs.MoveNext 40 cnt = cnt + 1 41 Loop 42 End With 43 End If 44 45 Call CutDB '検索がすんだら、データベースを切断して終了 46 Exit Sub 47 48End Sub 49
追記
たびたび申し訳ありません。自分がやりたい事というのが自分でもよく把握していなかったみたいです…。今回、皆さま方よりご回答をいただいて、ようやくそれを明確にできてきました。
それで、いただいたご回答を参考にしながら、自分のやりたい抽出条件を書いてみました。
①それぞれのテキストボックスに別々の抽出条件(SearchFilter1とSearchFilter2)を設定する
②その上でテキストボックスへの記入がされているかどうかで条件分岐して
③最初に設定した抽出条件を使用して、最終的な抽出条件(adoRs.filter)を決定する。
vba
1Dim SearchFilter1 As String, SearchFilter2 As String 2 3'それぞれのテキストボックスに抽出条件を設定 4SearchFilter1 = ("姓 like '%" & Me.TextBox1.Value & "%'" & " OR セイ like '%" & Me.TextBox1.Value & "%'") 5SearchFilter2 = ("電話番号1 like '%" & Me.TextBox2.Value & "%'" & " OR 電話番号2 like '%" & Me.TextBox2.Value & "%'") 6 7'それぞれのテキストボックスへの入力の有無により条件分岐 8If Me.TextBox1.Value = "" And Me.TextBox2.Value = "" Then 'どちらも未入力の場合 9 Call CutDB 10 MsgBox "テキストボックスに条件を入力してください。" 11 Exit Sub 12ElseIf Me.TextBox1.Value <> "" And Me.TextBox2.Value <> "" Then 'どちらにも入力されている場合 13 adoRs.filter = SearchFilter1 & " AND " & SearchFilter2 14ElseIf Me.TextBox1.Value <> "" And Me.TextBox2.Value = "" Then 'TextBox1のみ入力されている場合 15 adoRs.filter = SearchFilter1 16ElseIf Me.TextBox1.Value = "" And Me.TextBox2.Value <> "" Then 'TextBox2のみ入力されている場合 17 adoRs.filter = SearchFilter2 18End If 19
ただ、これだと adoRs.filter = SearchFilter1 & " AND " & SearchFilter2
でエラーが出てしまいます。
AND
を OR
にすると動くのですが、意図する仕様は AND です。
エラーメッセージ
実行時エラー'301':
引数が間違った型、許容範囲外、または競合しています。
OR はよくて AND はだめな理由が分かりません。。
追記2
サンプルコードありがとうございます。示していただいたサンプルコードを試してみたのですが、やはり AND のところで、同様のエラーが発生してしまいます。同じように OR だと動きます。
いろいろ試すことで、vbaに少しずつ慣れてきているのは自分でも嬉しいのですが、それは置いといて、なぜ意図どおりに動いてくれないのか…
ORの場合は動くので、最初に思いついた原因の「Nullとうまく参照できていない」というのとは別に原因がありそうだと思い直しています。
追記2-2
公式の説明にANDで結合できないことが書かれてありました。結合の仕方を変える必要があるそうです。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/20 09:01