

VBAいじり始めて数日の超初心者です。
お知恵をおかしください。
ACCESS2000です
あいまい検索をしたデータを選択して入力までできるようにしたいと考えていますが、検索の時点でうまくいきません。
関係のある項目
テーブル1 「入力テーブル」
2 「M_商品」 ……「JANコード」
……「商品名」
フォーム1 「入力フォーム」→コマンドボタンで商品検索のフォームが開く
2 「商品検索」
3 「検索結果」……「JANコード」
……「商品名」
入力テーブルとM_商品にはリレーションシップがかけてあります。
「M_商品」の中の「商品名」にフィルタをかけ、入力フォーム内に入力したいです。
商品検索のフォームには
非連結のテキスト「txt商品名」と「一致選択」という名のオプショングループ(3つの選択があり、部分一致と前方一致と後方一致です)、検索用のコマンドボタン(cmd検索)があます。
これで検索を実行してみると、コンパイルエラー;SubまたはFunctionが定義されていません、とでて、VBA側のPrivate Sub cmd検索_Click() が黄色くなって、「TakeOut」がグレーになった状態なります。
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)をコピー等で配置してフォームが開けるのか?)
この回答への補足
有難うございます。
検索結果を表示するための式が全く作られていませんでした。
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
を貼り付けたら出来ました。
これで出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか?
No.4
- 回答日時:
開いているフォームにそのレコードを読み込むには
入力フォームがどのような構成かわかりませんが・・。
検索ボタンの記述内にフォーム名を宣言し定義して入力フォームにキーになる値を検索フォームの指定(取得)した値を代入させ入力フォームをRequeryさせればいけると思います。
一つの質問内ではなく別の質問でしてください。
No.3
- 回答日時:
>出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか
検索結果を表示するフォームを帳票フォーム型にして詳細部にボタンを一つ作りそのボタンをクリックすると入力フォームを開くようにします。入力フォームは特定のレコードを表示するように設定しレコードのキーとなるフィールド同士で連結すれば出来ます。
ボタン作成のウィザードで検索結果と入力フォームのレコードソースが該当すれば特定のレコードを表示する箇所がウィザードで表示されますので順次進めれば完成です。
この回答への補足
何度も有難うございます。
なるほど……。
入力時に、すでに入力フォームが開いてる状態で検索をかけているのですが、すでに開いたフォームに入力することは可能でしょうか?
No.1
- 回答日時:
cmd検索のクリックイベントにどのように記述したか不明ですが
TakeOutは関数?(記述不明のため)
TakeOutはFunctionにでも定義してあるのですか?
TakeOutをユーザー関数として定義していないので使えない。という事でエラーが出ているのではないですか?
商品名だけからあいまい検索をするなら部分一致とか前方一致とかではなく単純にLikeを使って部分一致だけにしても同じではないでしょうか。
VBでcmd検索_Click()のイベントがエラー出なくなるまで編集してコンパイルしてみてはいかがでしょう。
記述不明のためこのくらいしか回答できません。
この回答への補足
文字数制限で全部明記できませんでしたので、細くします。わかりにくくて申し訳ありません。
以下の構文を組んでみました(サンプルを元に直しただけなので、細かい意味はよくわかっていません。すみません)。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSでVBAから選択クエリの抽...
-
AccessでIDを入力したら他の項...
-
クエリ実行結果0件の場合のフ...
-
ACCESSで、フォームで抽出した...
-
ACCESSで、EXCELのような、sumi...
-
ACCESS フォームで抽出したデー...
-
Accessでフィルタの実行アクシ...
-
サブフォームを利用したクエリ...
-
access クエリでIIF文で抽出条...
-
ADOレコードセットのコピー
-
Access2016埋め込みマクロでの...
-
エクセルで、抽出したデータだ...
-
Access サブフォームでの選択行...
-
Access 複数フォームを...
-
access サブフォームにリストを...
-
入力した値をコンボボックスに...
-
サブフォームでのダブルクリッ...
-
未審査請求包袋抽出表作成とは...
-
前のレコードの値を自動で入れたい
-
PDFファイル/抽出許可され...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSでVBAから選択クエリの抽...
-
クエリ実行結果0件の場合のフ...
-
AccessでIDを入力したら他の項...
-
ACCESS2007 マクロ クエリのパ...
-
ACCESSで、EXCELのような、sumi...
-
Accessでフィルタの実行アクシ...
-
アクセスのフォームに連番を表...
-
クエリーの結果をフォームに表...
-
サブフォームを利用したクエリ...
-
VarChar型をINT型に変換するには
-
ACCESS フォームで抽出したデー...
-
ACCESS2003のグループ化のエラ...
-
アクセスのパラメータクエリを...
-
Access 抽出したフォームをフ...
-
ACCESSのレポートにフォームの...
-
Accessのフォームで・・・
-
accessでパラメータをフォーム...
-
アクセスで期間を指定しての抽...
-
【Access2000】レコードの抽出方法
-
ACCESS97でデータ管理をしたい
おすすめ情報