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

VBAいじり始めて数日の超初心者です。
お知恵をおかしください。

ACCESS2000です

あいまい検索をしたデータを選択して入力までできるようにしたいと考えていますが、検索の時点でうまくいきません。

関係のある項目
テーブル1 「入力テーブル」
    2 「M_商品」 ……「JANコード」
            ……「商品名」
フォーム1 「入力フォーム」→コマンドボタンで商品検索のフォームが開く
    2 「商品検索」
    3 「検索結果」……「JANコード」
            ……「商品名」

入力テーブルとM_商品にはリレーションシップがかけてあります。

「M_商品」の中の「商品名」にフィルタをかけ、入力フォーム内に入力したいです。

商品検索のフォームには
非連結のテキスト「txt商品名」と「一致選択」という名のオプショングループ(3つの選択があり、部分一致と前方一致と後方一致です)、検索用のコマンドボタン(cmd検索)があます。
これで検索を実行してみると、コンパイルエラー;SubまたはFunctionが定義されていません、とでて、VBA側のPrivate Sub cmd検索_Click() が黄色くなって、「TakeOut」がグレーになった状態なります。

A 回答 (4件)

まず最初に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

を貼り付けたら出来ました。

これで出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか?

補足日時:2005/11/05 14:33
    • good
    • 0

開いているフォームにそのレコードを読み込むには


入力フォームがどのような構成かわかりませんが・・。
検索ボタンの記述内にフォーム名を宣言し定義して入力フォームにキーになる値を検索フォームの指定(取得)した値を代入させ入力フォームをRequeryさせればいけると思います。

一つの質問内ではなく別の質問でしてください。
    • good
    • 0
この回答へのお礼

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

助かりました。

お礼日時:2005/11/07 17:38

>出てきた検索結果のひとつを選択して、入力フォームに反映させることって出来ますか


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

この回答への補足

何度も有難うございます。

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

補足日時:2005/11/06 00:38
    • good
    • 0

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

お分かりになりますでしょうか?

補足日時:2005/11/04 19:01
    • good
    • 0

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

関連するカテゴリからQ&Aを探す