dポイントプレゼントキャンペーン実施中!

1つのテキストボックスで全フィールドを検索するには

Access2002使用です。
現在フォームにて、それぞれのフィールド毎に検索用のテキストボックスを用意してる為、
下記のようになっています。
これを、1つのテキストボックスで全てのフィールドを検索できるようにするには、
どこを訂正したらよろしいでしょうか?
宜しくお願い致します。

Option Compare Database

Function exeFilter()
Dim strFilter As String

If Not IsNull(姓検索) Then
strFilter = " AND 姓 Like '*" & Me.姓検索 & "*'"
End If

If Not IsNull(名検索) Then
strFilter = strFilter & " AND 名 Like '*" & Me.名検索 & "*'"
End If

If Not IsNull(姓ふりがな検索) Then
strFilter = strFilter & " AND ふりがな(姓) Like '*" & Me.姓ふりがな検索 & "*'"
End If

If Not IsNull(名ふりがな検索) Then
strFilter = strFilter & " AND ふりがな(名) Like '*" & Me.名ふりがな検索 & "*'"
End If

If Not IsNull(住所1検索) Then
strFilter = strFilter & " AND 住所1 Like '*" & Me.住所1検索 & "*'"
End If

If Not IsNull(住所2検索) Then
strFilter = strFilter & " AND 住所2 Like '*" & Me.住所2検索 & "*'"
End If

If Not IsNull(住所1ふりがな検索) Then
strFilter = strFilter & " AND 住所1ふりがな Like '*" & Me.住所1ふりがな検索 & "*'"
End If

If Not IsNull(住所2ふりがな検索) Then
strFilter = strFilter & " AND 住所2ふりがな Like '*" & Me.住所2ふりがな検索 & "*'"
End If

Me.Filter = Mid(strFilter, 6)
Me.FilterOn = True
End Function

Private Sub Form_AfterUpdate()

End Sub

A 回答 (2件)

ひとつのテキストボックス(仮に名前を、全検索)が有るとすると


提示されたコードの、AND を全て OR に書き換えて
検索対象の、Me.姓検索 などを全てMe!全検索にすると出来るかと
思いますが、
そうすると、たとえば”市川”で検索すると
名前が市川や住所の市川市などもヒットしてしまいます。
かといって AND では全ての条件に収まるレコードは
おそらく有り得ないので常に何もヒットしなくなります。

なので、OR 検索の方向でもう少し考えると・・・
リストボックスを作成し、(名前は仮に LB1 とします)
値集合タイプを、フィールドリスト
値集合ソースに、フォームのレコードソース名 とします。
複数選択は、標準 または 拡張に。

今回は、コマンドボタンのクリック時イベントに割り当ててみました。
ご参考までに。※投稿用にタブを全角スペースに変換しています。

『コマンドボタンあれ』のクリック時イベントに下記をコピペ

Private Sub コマンドボタンあれ_Click()
  Dim varItem As Variant
  Dim strItem As String
  Dim strArray() As String
  Dim strFilter As String
  Dim i As Integer

  If Me!LB1.ItemsSelected.Count = 0 Then    'リストボックスが選択されていない場合
    Me.FilterOn = False
    Exit Sub
  End If
    
  For Each varItem In Me!LB1.ItemsSelected  'リストボックスの内容を変数に格納
    strItem = strItem & Me!LB1.ItemData(varItem) & Chr(124)
    '多分使わないであろう文字 | Chr(124)を区切り記号にしています
  Next
  strItem = Left(strItem, Len(strItem) - 1)
  
  Me.Filter = ""
  strArray = Split(strItem, Chr(124), , vbDatabaseCompare)  '配列に収めます
        
  For i = 0 To UBound(strArray)  '配列からFilter文の作成
    strFilter = strFilter & "([" & strArray(i) & "]" _
          & " like '*" & Me!全検索 & "*')" & " OR "
  Next
  strFilter = Left(strFilter, Len(strFilter) - 4)   '末尾の" OR "を削除
'  Debug.Print strFilter
  Me.Filter = strFilter
  If DCount("*", Me.RecordSource, Me.Filter) = 0 Then
    MsgBox "知らない", vbOKOnly
    Exit Sub
  End If
  Me.FilterOn = True

End Sub
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
今まで試行錯誤していたのですが、どうもうまくいきませんでした。
VBA自体がよく分かってないということもあり、
ご説明にありました、AND を全て OR に書き換えて、
Me.姓検索 などを全てMe!全検索にする
という部分を試してみたりしたのですが、検索されず失敗に終わりました。

現状の私には敷居が高いということが分かっただけでも良かったです。
VBAをもう少し勉強してからもう一度試してみたいと思います。
ありがとうございました。

お礼日時:2010/10/20 20:50

勘違いがあるかもわかりませんが



Function exeFilter(送り値1, 送り値2 As String) As String
If Not IsNull(送り値1) Then
exeFilte = " AND 送り値2 Like '*" & 送り値2 & "*'"
End If
End Function
Private Sub Form_AfterUpdate()
Dim strFilter As String
strFirter = exeFilter(姓, 姓検索) & exeFilter(名, 名検索) & exeFilter(姓ふりがな, 姓ふりがな検索)
strFirter = strFiter & exeFilter(名ふりがな, 名ふりがな検索) & exeFilter(住所1, 住所1検索)
strFirter = strFiter & exeFilter(住所2, 住所2検索) & exeFilter(住所1ふりがな, 住所1ふりがな検索)
strFirter = strFiter & exeFilter(住所2ふりがな, 住所2ふりがな検索) & exeFilter(住所1, 住所1検索)
End Sub

追伸
失礼があったらすみません
関数とサブルーチンについて見直してください

関数
Function 戻り値(送り値1, 送り値2 As String) As String
命令文
戻り値=○○
end Function

サブルーチン
1.主ルーチンのステップが大きいとき 処理を分割して分かりやすくする
2.同じ処理が各所に入るとき

1.の場合
privatesub 主処理()

従RTN2


従RTN3

end sub

Pribatesub 従RTN1()

end sub
Pribatesub 従RTN2()

end sub

Pribatesub 従RTN3()

end sub


以上ですが
あなたのコーディングで期待通りの結果が得られましたか?
関数処理でなくて サブルーティン的な記述です
private SUB で初めて ENDsubで終わっても同じ結果になる
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
今まで試行錯誤していたのですが、どうもうまくいきませんでした。
VBA自体がよく分かってない為、
現状の私には敷居が高いということが分かっただけでも良かったです。
VBAをもう少し勉強してからもう一度試してみたいと思います。
ありがとうございました。

お礼日時:2010/10/20 20:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!