• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESSあいまい検索から入力まで)

ACCESS VBA初心者のためのあいまい検索方法

このQ&Aのポイント
  • ACCESS VBAを使ってあいまい検索を実装したい初心者です。関連するテーブルとフォームがあり、商品名をフィルタリングして入力フォームに表示したいですが、コンパイルエラーが発生しています。
  • ACCESS VBAの初心者です。あいまい検索を実装するために関連するテーブルとフォームを設定しましたが、検索を実行するとコンパイルエラーが発生し、商品名のフィルタリングができません。
  • ACCESS VBAの超初心者です。関連するテーブルとフォームを設定してあいまい検索を実装しようとしていますが、検索を実行するとコンパイルエラーが発生してしまいます。商品名をフィルタリングして入力フォームに表示する方法を教えてください。

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

まず最初にVBEでデバックのコンパイルをするとエラー箇所が反転表示されますからそこをチェック。 Sub cmd検索_Click()が黄色く反転するのか。TakeOutがグレーで使用不可状態なのか。 補足を見るところ VBでTakeOutがFunctionにもPrivate Sub内にも定義されていないということだと思いますが。 strSQLWhere = TakeOut(txt商品名, ",", "商品名", 1) はフィルタの抽出条件(Where条件)ですよね。 DoCmd.OpenForm strFormName, acFormDS, "", strSQLWhere でOpenFormメソッドのWhere条件欄にElseIfで分岐させたWhere句を配置してフォームを開く再にTakeOut(txt商品名, ",", "商品名", 1)が条件として合っているのか確認してください。(strFormNameで指定している検索結果フォームのOpenFormメソッドの引数にTakeOut(txt商品名, ",", "商品名", 1)をコピー等で配置してフォームが開けるのか?)

arkdream
質問者

補足

有難うございます。 検索結果を表示するための式が全く作られていませんでした。 Function TakeOut(strName As String, str区切り As String, _ strFieldName As String, g As Integer) '複数語句を可能にし、いずれかに一致する場合を検索する。 '部分、前方、後方一致をの選択機能も持たせる。 Dim VarSplit As Variant Dim VarTemp As Variant Dim a As Integer Dim b As Integer Dim c As Integer Dim i As Integer VarSplit = Split(strName, str区切り) ' --- A 'str区切りの個数を求める。 a = Len(strName) For b = 1 To a If Mid(strName, b, 1) = str区切り Then ' --- B c = c + 1 End If Next VarTemp = Null '初期化 For i = 0 To c If g = 1 Then VarTemp = VarTemp & IIf(Not IsNull(VarTemp), " OR " & strFieldName & _ " LIKE ", strFieldName & " LIKE ") & "'*" & VarSplit(i) & "*'" ElseIf g = 2 Then VarTemp = VarTemp & IIf(Not IsNull(VarTemp), " OR " & strFieldName & _ " LIKE ", strFieldName & " LIKE ") & "'" & VarSplit(i) & "*'" ElseIf g = 3 Then VarTemp = VarTemp & IIf(Not IsNull(VarTemp), " OR " & strFieldName & _ " LIKE ", strFieldName & " LIKE ") & "'*" & VarSplit(i) & "'" End If Next TakeOut = VarTemp End Function を貼り付けたら出来ました。 これで出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか?

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.4

開いているフォームにそのレコードを読み込むには 入力フォームがどのような構成かわかりませんが・・。 検索ボタンの記述内にフォーム名を宣言し定義して入力フォームにキーになる値を検索フォームの指定(取得)した値を代入させ入力フォームをRequeryさせればいけると思います。 一つの質問内ではなく別の質問でしてください。

arkdream
質問者

お礼

何度もありがとうございます。 挑戦してみます。 助かりました。

すると、全ての回答が全文表示されます。
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか 検索結果を表示するフォームを帳票フォーム型にして詳細部にボタンを一つ作りそのボタンをクリックすると入力フォームを開くようにします。入力フォームは特定のレコードを表示するように設定しレコードのキーとなるフィールド同士で連結すれば出来ます。 ボタン作成のウィザードで検索結果と入力フォームのレコードソースが該当すれば特定のレコードを表示する箇所がウィザードで表示されますので順次進めれば完成です。

arkdream
質問者

補足

何度も有難うございます。 なるほど……。 入力時に、すでに入力フォームが開いてる状態で検索をかけているのですが、すでに開いたフォームに入力することは可能でしょうか?

すると、全ての回答が全文表示されます。
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

cmd検索のクリックイベントにどのように記述したか不明ですが TakeOutは関数?(記述不明のため) TakeOutはFunctionにでも定義してあるのですか? TakeOutをユーザー関数として定義していないので使えない。という事でエラーが出ているのではないですか? 商品名だけからあいまい検索をするなら部分一致とか前方一致とかではなく単純にLikeを使って部分一致だけにしても同じではないでしょうか。 VBでcmd検索_Click()のイベントがエラー出なくなるまで編集してコンパイルしてみてはいかがでしょう。 記述不明のためこのくらいしか回答できません。

arkdream
質問者

補足

文字数制限で全部明記できませんでしたので、細くします。わかりにくくて申し訳ありません。 以下の構文を組んでみました(サンプルを元に直しただけなので、細かい意味はよくわかっていません。すみません)。 Private Sub cmd検索_Click() On Error GoTo エラー Dim strTableName As String Dim strFormName As String Dim strTxtName As String Dim strSQLWhere As String strTableName = "M_商品" 'テーブル名を指定します。 strFormName = "検索結果" '検索結果フォーム名を指定します。 If Not IsNull(Me.txt商品名) Then If Me.一致選択 = 1 Then strSQLWhere = TakeOut(txt商品名, ",", "商品名", 1) ElseIf Me.一致選択 = 2 Then strSQLWhere = TakeOut(txt商品名, ",", "商品名", 2) ElseIf Me.一致選択 = 3 Then strSQLWhere = TakeOut(txt商品名, ",", "商品名", 3) End If End If If vbYes = MsgBox("結果を表示しますか?", vbCritical + vbYesNo) Then DoCmd.OpenForm strFormName, acFormDS, "", strSQLWhere End If ' Debug.Print strSQLWhere Exit Sub エラー: MsgBox Err.Number & " : " & Err.Description Exit Sub End Sub お分かりになりますでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A