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

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

ACCESSあいまい検索から入力まで

VBAいじり始めて数日の超初心者です。 お知恵をおかしください。 ACCESS2000です あいまい検索をしたデータを選択して入力までできるようにしたいと考えていますが、検索の時点でうまくいきません。 関係のある項目 テーブル1 「入力テーブル」     2 「M_商品」 ……「JANコード」             ……「商品名」 フォーム1 「入力フォーム」→コマンドボタンで商品検索のフォームが開く     2 「商品検索」     3 「検索結果」……「JANコード」             ……「商品名」 入力テーブルとM_商品にはリレーションシップがかけてあります。 「M_商品」の中の「商品名」にフィルタをかけ、入力フォーム内に入力したいです。 商品検索のフォームには 非連結のテキスト「txt商品名」と「一致選択」という名のオプショングループ(3つの選択があり、部分一致と前方一致と後方一致です)、検索用のコマンドボタン(cmd検索)があます。 これで検索を実行してみると、コンパイルエラー;SubまたはFunctionが定義されていません、とでて、VBA側のPrivate Sub cmd検索_Click() が黄色くなって、「TakeOut」がグレーになった状態なります。

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

  • ベストアンサー
  • 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

  • アクセスにて検索フォームを作りたい

    お世話になります。 アクセス初心者です。 会社名検索フォームに会社名を入力して表示コマンドをクリックすると 会社フォームの入力した会社が表示されるようにしたいのです。 現在は、表示コマンドをクリックすると会社フォームが開きます。 どの会社名を打ち込んでもNo.1のレコードしか開きません。 つまり会社フォームが開く という指示をしているだけです。 コードなど全く分かりません。 ただ、本を見て真似て下記の通り入力してみました。 間違っているor足りない ということはわかっていますが、 どう入力すれば良いのかわかりません。 教えて下さい。よろしくお願いいたします。 Private Sub cmd表示_Click() On Error GoTo Err_cmd表示_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "会社フォーム" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_cmd表示_Click: Exit Sub Err_cmd表示_Click: MsgBox Err.Description Resume Exit_cmd表示_Click End Sub

  • ACCESSでの検索

    あいまい検索をしたいです。 【現状】 フォームデザインでテキストボックスを作り、検索ボタンを作成 ↓ 【したいこと】 マクロデザインで、「テキストボックスに文字列を入力すると、文字列を含むデータを抽出」 というまくろを組みたい。 [コード]=[Forms]![total]![コード入力]という、完全一致のものはここで教えていただいて作成できたのですが、もうひとつ、あいまい検索もしたいです。 あいまい検索は、「商品名」です。 宜しくお願いします。

  • ACCESS 別フォームから別フォームの処理を

    ACCESSでメインフォームから別フォームを 【メインフォーム】 DoCmd.OpenForm "FM_商品検索", , , , , acWindowNormal 【商品検索フォーム】 検索画面でJANコードを選んだらJANコードをセットして、商品マスタの読込等の処理をしたい Forms!F_仕入!F_仕入sub.Form!JANコード = Me.JANコード ↑これは動く Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate ↑これがエラーになります 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 でエラーになります。 Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate Public Sub JANコード_BeforeUpdate(Cancel As Integer) 何がおかしいのでしょうか? 宜しくお願いします

  • Q>access2000でフォーム画面での新規レコード

    access2000でJANテーブルに[janコード][商品名]があります。 フォームでカード形式フォームを作ったのですが、 新しくJANコードを登録する為の新規レコードを表示させたいのですが、 コマンドボタンを作ったのですが、JANコードのセル?に カーソルが自動で行きません。 左下の現在のレコード番号が書いてある、 右側の>*のボタンを押すと、きちんと新規レコードに行って、 カーソルもJANコードのセルに行ってくれるのに・・。 そこで、教えていただきたいのですが、 テーブルを開くと、常に新しいレコードを表示させる。 もしくは、 フォーム内に作ったボタンを押すと、>*のボタンを押した時と 同じようになる方法をご存知の方いらっしゃいましたら、 よろしくお願いします。 (私はお礼&ポイント発行は必ずしていますのでよろしくお願いします。)

  • アクセスである文字を含む検索

    ACCESS2000を使っています。 あるデータテーブル「発注書テーブル」があって、ここでは「(1)ID」「(2)顧客名(法人)」「(3)発注商品」「(4)納品済チェック」の4つフィールドがあるとします。 作業はフォームで行います。フォーム名は「発注書フォーム」。 「(2)顧客名」から検索をかけたくて、検索コマンドボタンをつくり、「検索フォーム」を発注書フォームとまったく同じ形態でつくり、そこにとべるようにしました。 「検索フォーム」には「検索」というテキストボックスを作ります。 「検索クエリ」というクエリを作り、発注書テーブルを素とし、すべてをデザインビューで表示するようにしました。 そして、「(2)顧客名」の抽出条件に[Forms]![検索フォーム]![検索]を入力します。 すると、「検索フォーム」の「検索」をコンボボックスにして、顧客名をすべて表示させ選択した場合は、「検索フォーム」では、選択した顧客の情報が表示されるようになりました。 が、しかし、「検索」をコンボボックスではなく、テキストボックスで、しかも顧客名の一部だけを入力したら、その文字を含むすべてのレコードを表示してほしいのです。 そこで、「検索クエリ」の「(2)顧客名」抽出条件にlike"*[Forms]![検索フォーム]![検索]*"と入力してみました。 そして「検索フォーム」の「検索」テキストボックス(非連結)に顧客名の一部を入力したところ、ぜんぜん絞りこみ抽出してくれません。 もちろん、クエリ上でも絞り込んでいない模様です。 どうしたら文字の一部からその文字を含む顧客名のレコードを全て抽出し、表示させることができるでしょうか? 細かくてすみませんが、かなり困ってます。 どうかわかる方、教えてください。 まったくちがう方法(別の手法)でもかまいません。 この説明でわからない部分がありましたら補足しますのできいてください。 よろしくお願いします。

  • ACCESS2002の入力値からフィルタをかける

    はじめまして 会社で商品マスタという、データベースのテーブルを持っています。 テーブルから、フォームフィルタを使って特定の番号・データを持ったものだけ抽出して表示する方法をよく使っていてわかるのですが、テーブルを直接触るので危険と思っています。 そこで、次のようなフォーム画面を作って誰でも抽出できるように運用しようとしています。 (抽出クエリを個々に作ってもらう案もありましたが・・実用的ではないので却下されてしまいました。) まず、フォーム画面に非連結のテキストボックス5個とコマンドボックス1個を設置して テキストボックスの5個の内、1個でも入力がある状態で[cmd]を押すと テキストボックスの内容で抽出したクエリを表示するという物を作りたいと思っています。 (テキストボックス5個全て入力した場合は、入力があるごとにandにしようと思っています。) ま た、5個全て入力がない状態で[cmd]を押したら、エラーメッセージを出したいと考えています。 フォームのデータ テキストボックス:[Tx1],[Tx2],[Tx3 ],[Tx4],[Tx5] コマンドスイッチ:[cmd] テーブルのデータ テーブル:[tb1],[tb2],[tb3],[tb4],[tb5],[tb6],[tb7],[tb8],[tb9] ボタンは、フォームの実行を選択しています。が、うまくいきません。 いろいろググっているのですが、ACCESS初心者ですので、『これが参考になる』過去ログとか、 『このHPが』とかもわかりません。 どなたかご教授願えないでしょうか? 細かく教えていただければ幸いです。

  • ACCESSで複数検索をしたいのですが・・・

    T_1・・・テーブル  No.、得意先名、商品名、売上日、備考 Q_1・・・クエリ  「T_1」を元に作成 「Q_1」からなる「F_1」というフォームのヘッダーに [Txt得意先名]、[Txt商品名]、[Txt売上日]という3つのテキストボックスと、 検索ボタン[Cmd検索]を配置し、1~3つの条件を入力して検索する フォームを作りたいと考えています。 そこで、http://okwave.jp/qa/q2029954.html にあるコードを使い、 下記のコードを書いてみました。 ================= Private Sub Cmd検索_Click() Dim MyCriteria As String MyCriteria = "売上日 ="  If IsNull(Txt売上日) Then   MyCriteria = MyCriteria & True  ElseIf Not IsNull(Txt売上日) Then   MyCriteria = MyCriteria & "#" & Me!Txt売上日 & "#"  Else  End If strfilter = MyCriteria strfilter = strfilter & " And 得意先名 Like '*" & Me.Txt得意先名.Value & "*' And 商品名 Like '*" & Me.Txt商品名.Value & "*'" Filter = strfilter FilterOn = True Me.Requery End Sub ================= ただ、上記のコードでは、[Txt売上日]を空欄で検索した場合、 仮に「T_1」で売上日が未入力だった時にそのデータは検索してくれません。 自分でもいろいろ調べて試したのですが、なかなかうまくいかず・・・。 ご存知の方、教えていただけませんでしょうか? よろしくお願いいたします。

  • Access97で自動入力と反映が違うテーブルの場合

    こんにちは、前の質問などでフォームへの自動入力は何とかできるようになったのですが、今度はその入力したデータを他のテーブルBに反映させたいのですが、どうしたら良いのでしょうか? テーブルA 店舗コード 店舗名 ※テーブルAの管理者は私ではなく、ネットワークで私のPCと「テーブルのリンク」でつながっています。 テーブルB 店舗コード 店舗名 商品番号 他に店の情報フィールドをいくつか作成 フォームC 店舗コード 店舗名 商品番号 他に店の情報テキストボックスをいくつか作成 フォームCで、店舗コードを入力したら店舗名が自動的に入力される方法は、フォームCのレコードソースをテーブルAにして、店舗コードの更新後処理をイベントプロシージャにして、下記イベントコードを設定しました。 Private Sub 店舗コード_AfterUpdate() Me![店舗名]=DLookup("店舗名","テーブルA","店舗コード=" & Me![店舗コード] & " ") End Sub そして、フォームの残りのテキストボックスに、店と商品に関するデータを入力し、入力した全てのデータをテーブルBに反映させたいのですが、どうしたら良いのでしょうか? 自動入力の方法でDLookupを使用したのがいけなかったのでしょうか? また、できればテーブルBは商品番号順に並びかえられているのですが、入力したら商品番号のリストの一番下に挿入されるという形にしたいのです。 どうかよろしくお願いします。

  • アクセスで重複と該当なしコードは入力不可にしたい

    アクセス97で顧客管理をしています。 まだなかなか使いこなせないでいるところがあるのですが、どなたかわかりましたらよろしくお願いします。 テーブルAに1000件以上のレコードがあります。主なフィールドはコードと顧客名と住所などの情報です。そのテーブルにレコードを追加していくのに、フォームから行っています。フォームプロパティのデータ入力を「はい」に設定してるだけです。 ここで問題が2つあります。 (1)例えばフォームからコードを入力する際に、正しいコードであれば良いのですが、間違ったコードを入力してしまってもテーブルに追加されてしまうのです。今はその都度テーブルを開いてその行を削除しています。 正しいコードかコードでないかの判断はテーブルBに存在するコードによって決定します。テーブルBになければ全てエラーにしたいのです。 (2)コードが重複してもいけないのですが、テーブルAのコードのプロパティを重複なしにしているのですが、フォームに一度重複したコードを入力してしまうと、一度開いたフォームを強制終了しなければ先に進めません。 (1)においても(2)においても、例えばメッセージボックスが開いて「正しいコードを入力して下さい」のようなものが開いて、OKをクリックしたら、またコードの入力から始まるような方法はないものでしょうか? ちなみにその顧客コードを入力したら、顧客名が自動的に開く下記VBAをフォームに組んでいます。 Private Sub 店番_AfterUpdate() Me![名前] = DLookup("顧客名", "テーブルB", "顧客コード=" & Me![コード] & " ") End Sub 何卒よろしくお願いします。

  • エクセルVBA コンボボックスの値から検索したい

    エクセル・VBAで商品検索をしようとしているのですが行き詰ってしまい、皆様のお知恵を拝借できればと思い質問させていただきます。 ・現状 1.商品マスタ シートにJANコード・商品名・規格その他を入力しています。 2.ユーザーフォームを使い、商品名(一部分)を入力・検索したら、その商品の商品名・規格がコンボボックス上に表示される(2列分の情報を出力しています) 3.当てはまる商品を選択し、コマンドボタンを押したら、その商品のJANコードや商品名・規格・価格などが出力されるようにしたい 現在2.まではなんとか作成したのですが、3.の操作をどうすれば良いかわからず悩んでおります。 コンボボックスに格納されたデータは配列形式で、findメソッドを使って引っ張ってきているのですが、選択したデータからもともとの商品マスタのセルを割り出す操作があるのかどうかも分かりません。 独学でやっているので、基礎の基礎もわかっていないとは思いますが、どうかご教授ください。 (例) 商品名検索をした際には、コンボボックスに     チロルチョコ    バナナ味20円     チロルチョコ    いちご味21円     チロルチョコ    マンゴー味21円 のように表示されます。その中でチロルチョコ イチゴ味を選択した後に、そのチロルチョコ いちご味のデータを出力したいのです。