条件付でサンプルコードを記します
・文字列検索のみ
・一つのフィールドのみ検索可(指定変更可能)
・複数条件の時は、OR条件で検索する
データはフォームで開いていて、検索フォームを作成したと仮定します
(データを開いているフォームは、「ABC」と仮定します)
(検索フォームは、「検索値」テキストボックスと「検索実行」コマンドボタンが配置されている)
'~~~~~~~~~~~~~~~~~~~~
Private Sub 検索実行_Click()
Dim stSearch As String '検索値
Dim stFieldName As String '検索対象フィールド名
Dim stFormName As String '検索対象フォーム名
Dim stSQL As String '検索条件
Dim stMsg As String 'メッセージ
Dim RS As DAO.Recordset '検索用レコードセット
'検索値を取得
stSearch = Nz(Me![検索値].Value, "")
If stSearch = "" Then
stMsg = "検索値が設定されていません!"
MsgBox stMsg, vbExclamation
Exit Sub
End If
'検索フィールド設定
stFieldName = "氏名"
'検索条件設定(複数可:"/"にて判断)
stSQL = 条件式作成(stSearch, stFieldName)
'検索対象フォームのレコードセット展開(フィルタ設定込み)
stFormName = "ABC"
Set RS = Forms(stFormName).RecordsetClone
'検索実行(次へ)
RS.FindNext stSQL
If RS.NoMatch = True Then
'検索実行(全体)
RS.FindFirst stSQL
If RS.NoMatch = True Then
stMsg = "データがありません!"
MsgBox stMsg, vbExclamation
Else
stMsg = "最後まで検索しました!" & vbCrLf & "また最初から検索しますか?"
If MsgBox(stMsg, vbYesNo + vbQuestion) = vbYes Then
'レコード移動
Forms(stFormName).Bookmark = RS.Bookmark
End If
End If
Else
'レコード移動
Forms(stFormName).Bookmark = RS.Bookmark
End If
'レコードセット解放
Set RS = Nothing
End Sub
'~~~~~~~~~~~~~~~~~~~~
Private Function 条件式作成(stSearch As String, stFieldName As String) As String
Dim stSQL As String '検索条件
Dim stTmp As String '作業用文字列
Dim intCnt1 As Integer '作業用カウンタ1
Dim intCnt2 As Integer '作業用カウンタ2
Const stSepa As String = "/" '検索条件区切り文字
Const stAst As String = "*" '検索条件アスタリスク
Const stQues As String = "?" '検索条件クエスチョン
'検索条件設定(複数可:"/"にて判断)
stSQL = ""
intCnt1 = 1
intCnt2 = InStr(1, stSearch, stSepa)
If intCnt2 = 0 Then
'条件式設定
If InStr(1, stSearch, stAst) = 0 And InStr(1, stSearch, stQues) = 0 Then
stSQL = "((" & stFieldName & ") = '" & stSearch & "')"
Else
stSQL = "((" & stFieldName & ") Like '" & stSearch & "')"
End If
Else
stTmp = Mid(stSearch, intCnt1, intCnt2 - 1)
Do Until stTmp = ""
'条件接続詞を付加
If stSQL <> "" Then stSQL = stSQL & " Or "
'条件式追加
If InStr(1, stTmp, stAst) = 0 And InStr(1, stTmp, stQues) = 0 Then
stSQL = stSQL & "((" & stFieldName & ") = '" & stTmp & "')"
Else
stSQL = stSQL & "((" & stFieldName & ") Like '" & stTmp & "')"
End If
intCnt1 = intCnt2 + 1
intCnt2 = InStr(intCnt1, stSearch, stSepa)
If intCnt2 = 0 Then intCnt2 = Len(stSearch)
stTmp = Mid(stSearch, intCnt1, intCnt2 - intCnt1 + 1)
Loop
End If
'戻り値設定
条件式作成 = stSQL
End Function
'~~~~~~~~~~~~~~~~~~~~
※参照設定で、「Microsoft DAO 3.6 Object Library」にチェックをつけておいて下さい
すいませんm(_ _)m 長くなってしまいました。
たぶん求めているのに近いと思います。(細かいところまでは動作確認をしておりませんが...)
抽出機能に関しては、「検索実行(次へ)」から以下を下記コードに置き換えればできると思います。
ただ、抽出(フィルタ)機能を使用すると、フィルタ条件をフォームが覚えてしまうので、どこかでフィルタの初期化をしてあげなければなりません。
'~~~~~~~~~~~~~~~~~~~~
'抽出実行
Forms(stFormName).Filter = stSQL
Forms(stFormName).FilterOn = True
'~~~~~~~~~~~~~~~~~~~~
フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。
もし、分からないところがあれば補足を御願い致します
それでは頑張って下さい (^^)/
補足
詳しい回答ありがとうございます! これは・・・検索フォームをつくるための検索クエリに入れればよいのでしょうか?(初心者ですいません。) >・文字列検索のみ >・一つのフィールドのみ検索可(指定変更可能) >・複数条件の時は、OR条件で検索する 条件まで考えていただいてありがとうございます。 確かにこういうことを考えなきゃ、と気づき使用者にきいたところ ・複数フィールドを一度に検索することもある。(日付と名前とか) ・同じフィールドで複数条件を検索することもある。(田中と山田という名前、とか) ・上記2つを同時に行うこともある。(東京都に住んでいる田中と山田など) ということなのだそうです。 なんかできるのかできないのかさえ自分で判断できなくなってきてしまいました・・・。 それとできたら、ということで言われたのですが、ANDとORを切替えることができるボタンのようなものが欲しい、とのことなのです。 こういうことってできるのでしょうか? >フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。 下に使用するフィールド名をかきますね。 ・Date_year 日付の年(Ex.00(年)) ・Date_month 日付の月(Ex.01(月)) ・Date_day 日付の日にち ・氏名ID 個々に番号をつける ・ソートID1 ソートをするためのキー ・ソートID2 ソートをするためのキー ・氏名 ・削除対象 削除する場合にチェックする。(チェックボックス) ・挨拶状送付 送付する場合にチェックを入れる。(チェックボックス) ・年賀状送付先 自宅か会社か選択をする。 ・暑中見舞い送付先 同 上 ・ランク A~Eを選ぶ。 ・喪中 喪中の場合にチェック。(チェックボックス) ・会社グループID 会社のグループを選択する。 ・会社名 ・会社名2 ・役職 ・所属 ・会社郵便番号 会社の郵便番号 ・会社住所_都道府県 会社の住所の都道府県 ・会社住所_市町村 市町村 ・会社住所_町名 町名・番地 ・会社電話番号 会社の電話番号 ・自宅郵便番号 ・自宅住所_都道府県 ・自宅住所_市町村 ・自宅住所_町名 ・自宅電話番号 ・お歳暮・お中元_備考 ・住所・ハガキ_備考 ・異動・退職_備考 ・その他_備考 以上が全フィールドです。 会社・自宅の住所・郵便番号は相互でどちらかを入れるとどちらかが自動で入るようになっています。 このような状態のもので検索フォームを作成し、使用することは可能でしょうか? 長々とかいてしまいました。 よろしくお願いします。