Access2007 フォームでの検索について

このQ&Aのポイント
  • Access2007 フォームでの検索方法について教えてください。
  • フォームの検索窓に入力した文字をテーブル上のすべてのデータから検索させる方法を教えてください。
  • 検索した文字が見つからなかった場合にメッセージBOXを表示させる方法を教えてください。
回答を見る
  • ベストアンサー

Access2007 フォームでの検索について

お世話になります。 accessはあまり使わないので、自己流でどうにか作っている状況で わからなければネットで調べているのですが、 どうしても自力で解決できないので、よろしければ教えて下さい。 テーブル名、T_機器データ一覧 フォーム名、F_機器登録 F_機器登録に入力したものがT_機器データ一覧に保存されます。 すでに登録しているか調べる為に、このフォームのヘッダーに 「検索窓」と「検索」ボタンと「次へ検索」ボタンという名前で設置し、 「検索窓」に入力した文字を、T_機器データ一覧から探して、もしあれば 詳細部分の入力用のボックスに表示されるフォームにしました。 T_機器データ一覧のフィールドは番号や機器名等々で20個ほどあり、 1つの検索窓ですべてのフィールドのデータを検索させたく、 某サイト様に載っていた方法を使わせて頂きました。 (番号や機器名という特定フィールドの情報ではなく、とにかく 「検索窓」に入力した文字がT_機器データ一覧にあるかどうかで調べたいです。) ----------------- ↓「検索」ボタン ----------------- Private Sub 検索_Click() On Error Resume Next Dim v Me.番号.SetFocus v = Me.検索窓 Me.検索窓 = Null DoCmd.FindRecord v, acAnywhere, False, acSearchAll, , acAll, True Me.検索窓 = v End Sub ------------------- ↓「次へ検索」ボタン ------------------- Private Sub 次へ検索_Click() On Error Resume Next Dim v Screen.PreviousControl.SetFocus Screen.ActiveControl.SelStart = 255 v = Me.検索窓 Me.検索窓 = Null DoCmd.FindRecord v, acAnywhere, False, acDown, , acAll, False Me.検索窓 = v End Sub ------------------- これで思った通りに検索してくれるのですが、 検索した文字が無かった場合に、"見つかりません"という様な メッセージBOXを表示させたいのですが、方法を見つけられませんでした・・。 Microsoftのサイトに、 「FindRecordメソッドは、成功または失敗を示す値を返しません。」 とあり、FindRecordを使わずに別の方法がないかと探したのですが、 特定のフィールドのみから「検索窓」に入力した文字を探す方法はあるのですが、 1つの「検索窓」へ入力したものをテーブル上のすべてのデータから 検索させる方法がわかりませんでした。 書き方がおかしな所があるかもしれません。 その場合は大変申し訳ありません・・。 どうかよろしくお願い申し上げます。

  • lin93
  • お礼率66% (2/3)

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

  • ベストアンサー
  • panacon
  • ベストアンサー率31% (214/679)
回答No.1

lin93 さんへ 私の場合、出来合いのマクロとクエリで処理できるものは、そちらで作るようにしています。VBが得意であれば良いのですが、そうでもないので出来合いのもので済ませます。 私でしたら、「検索窓」に情報を入れて更新するタイミングで、フィルタを使います。 「検索窓」が英数のみであれば、書式に半角英数を選択して、文字の変換に”無変換”を選択します。そうすることで、F8を押したりENTERを押す工数を減らせます。また、「検索窓」をクリックしたときに、「検索窓」にNull値を代入します。これも出来合いのマクロで作れるので相しています。 それでは、そのマクロとクエリの内容を書きます。 予め、フィルタに用いるクエリを作っておきます。クエリ名=Q_フィルタ クエリのフィールドは、[T_機器データ一覧]のすべてのフィールドで、抽出条件で、番号=forms![F_機器登録]![検索窓]としておきます。 サブマクロ名=クリア (このマクロを検索窓のフォーカス取得時に貼る) 値の代入 代入先=forms![F_機器登録]![検索窓] 値=Null サブマクロ名=フィルタ (このマクロを検索窓の更新後に貼る) すべてのレコードの表示 フィルタ フィルタ名=Q_フィルタ このほかに、「全表示」ボタンを作って、すべての表示に戻せるようにしておきます。 サブマクロ名=全表示 (このマクロを全表示ボタンのクリック時に貼る) このように作ると、検索窓をクリックしたときに先に入力されたものがあればクリアされ、消す手間が省けて、抽出条件を入れてTABで離れれば、フィルタで該当する複数レコードが抽出されます。必要に応じて、レコードの移動ボタンをフォーム上に置いておくと便利です。「全表示」ボタンを押せば、元に戻ります。「全表示」ボタンに工夫を付けたいときは、そのレコード番号を覚えさせて、全レコード表示後に、その番号に移動することもできます。こんな感じです。 蛇足ですが、「検索窓」の条件付書式で、フォーカス取得時に背景色と前景色を変えるようにしています。どこのフィールドをクリックしているか分かりやすいのでそうしています。

lin93
質問者

補足

ご回答頂き有難うございます。 試してみたのですが、 Q_フィルタの抽出条件、番号=forms![F_機器登録]![検索窓] の場合、番号でしか検索できないと言う事はないでしょうか? 「T_機器データ一覧」テーブルのフィールドには機器名や、使用者名、設置場所等々あるのですが、検索窓にそれらのどのデータを入力しても詳細のところの入力用ボックスに表示させたいのです。 (なので検索窓は英数だけではなく、カナ漢字記号がすべて対象になります。) それから、「F_機器登録」フォームは1件ずつのデータ入力用になっていて、ご記入頂いている、「フィルタで該当する複数レコードが抽出されます。」の部分の、複数レコードを表示させるようになっておりません。 そのためか、作ってみたこの↓マクロは、 >サブマクロ名=フィルタ (このマクロを検索窓の更新後に貼る) >すべてのレコードの表示 >フィルタ フィルタ名=Q_フィルタ これの「すべてのレコードの表示」がエラーになります。 「コマンドまたはアクション'全レコードの表示'は無効です。」 (今は自宅にあるAccess2013で試したので、「すべてのレコードの表示」がなく、「全レコードの表示」を選択しました。) ただ、フィルタ フィルタ名=Q_フィルタ の部分は動いていて、 番号だけの検索でしたら詳細の入力用ボックスにデータを表示してくれます。 今までマクロ&クエリで抽出ができるというのを知りませんでした。 教えて頂きありがとうございます。 ただ、この方法ではすべてのデータを1つの検索窓で探せるようには できませんでした。 また、探して対象データが無い時に、"見つかりません"という様なメッセージBOXを表示させる術がわかりません・・。 まだ悩んでみようと思います。 「検索窓」をクリックした時に、「検索窓」にNull値を入れる方法と、 (今までクリアボタンを別に作っていました。) 「検索窓」の条件付書式で、フォーカス取得時に背景色と前景色を変える ようにする案、使わせて頂きます!! お時間を割いて頂き、ありがとうございました。

その他の回答 (1)

  • panacon
  • ベストアンサー率31% (214/679)
回答No.2

lin93 さんへ VBだとレコードセットからデータを抽出するということで、検索窓が一つで良いということなのですね。私も何かの時に使ってみたくなりました。 私の場合は、VBが得意ではないので、検索をするフィールド(フォームに3つ程度)にそれぞれ検索窓を付けてしまっています。添削するフィールドがテキストの場合は、クエリをあいまい検索にするので、Like "*" & [検索窓] & "*" を貼り付けるようにしています。 また、ご質問のレコードのないことを知る条件は、抽出したレコード数が0であるかどうかでメッセージを分岐できると思います。VBの書き方は分かりませんが、Dcount関数を使って、抽出条件を付けたクエリのID数をカウントする式をマクロのIf文に書くようにしています。勿論、VBでも出来るだろうと思います。

lin93
質問者

お礼

度々有難うございます。 結局、自分ではできず・・・プログラミングの仕事をしている知り合いに聞いてみた所、スラスラと結果を返してくれました。 詳しく説明もしてくれたのですが、いまいち考え方が理解できていません・・・。 Access奥が深いですねー! この度はお時間を割いて頂き、ありがとうございました。

関連するQ&A

  • Access 検索フォーム

    いつもお世話になってます。 Accessの検索フォームについて教えて下さい。 業務マスターと仕事DBという2つのデーターベースがあります。 業務マスターは共有のサーバーの中にあり、得意先テーブルをリンクして、それをもとに得意先フォームを作りました。 非連結のテキストボックス(txt検索)と非連結のリストボックス(一覧)がり、リストボックス(一覧)のクエリ得意先の抽出に使うフィールドの条件に、Like"*"&[Forms]![得意先フォーム]![txt検索]&"*" を入れました。 txt検索に文字を入れ、一覧リストボックスで絞込をし、選ぶとフォームに表示されるという流れにしたのですが・・・。 Private Sub txt検索_AfterUpdate() Me![一覧].Requery End Sub Private Sub 一覧_AfterUpdate() Dim rs As Object Set rs = Me.Recordset.Clone rs.FindFirst "[得意先ID] = " & Str(Nz(Me![一覧], 0)) If Not rs.EOF Then Me.Bookmark = rs.Bookmark End Sub [Forms]![得意先フォーム]![txt検索]というパラメータがでて(今まで出たことがない) 文字を入力しても実行できませんでした。参照元が分からないのかなと思いますが、どうしたらうまくいくのか分かりません。どなたかお知恵をかしていただけないでしょうか。Accessは2003を使っています。よろしくお願いします。

  • access 表形式のフォームの複数条件検索

    access 表形式のフォームの複数条件検索の方法を教えてください。 現在は一つのComboボックスでの検索はできていますが、 これを2つ、3つにしたいのです。 検索は、学年、組、名前です。 現在は下記マクロで1つの(学年)はできていますが、それ以外の2つ を組み合すことができません。 下記は、学年を入力するComboボックスのcombo1conditionで学年を 選択し、ボタンのbtn1Searchで検索するといったマクロです。 どなたか教えてください。よろしくお願いいたします。 Private Sub btn1Search_Click() If Me.combo1condition <> "" Then Me.combo1condition.SetFocus Me.Filter = "学年 Like ""*" & Me.combo1condition.Text & "*""" Me.FilterOn = True Else Me.Filter = "" Me.FilterOn = False End If End Sub

  • Accessの検索フォーム

    またまたAccessについての質問です。 検索フォームというのを作りました。 テーブルのデータから条件に合うものだけを抽出したいのです。 たとえば1つ目の検索フォーム[A]のテキストボックスに「AAA」を入力します。 そのあとBには「BBB」と入力します。 同じくCには「CCC」と入力します。 そして絞込みボタンを押したらAAAでBBBでCCCのものが抽出されます。 これはうまくいきました。 とりあえず、複数条件なので、わけもわからず「&」で結んでしまいました・・・。 ↓は絞込みボタンのクリック時です。↓ 困ったのは、すべて検索条件を指定しない場合です。 たとえば「AAA」で「CCC」のものを抽出したいとき、[A]のテキストボックスに「AAA」と入れ [C]のテキストボックスに「CCC」と入れます。 そして絞込みボタンをクリック。 するとBが未記入だからか、抽出されたのは真っ白でした・・・。 Option Compare Database Private Sub コマンド50_Click() Me.Filter = "契約='" & Me!テキスト51 & "'and A='" & Me!テキスト57 & "'" Me.FilterOn = True End Sub 組み合わせが自由になる検索フォームにするにはどうすればよいのでしょうか? 誰か助けてくださ~い!

  • 【Access】複数フィールドを対象とする検索

    Access上で「検索ボタン」をクリックすると、 「データ」フォームのフィールド1、フィールド2、フィールド3のいずれかに「検索条件1」の語を含み、かつ、フィールド4、フィールド5、フィールド6のいずれかに「検索条件2」の語を含むレコードを抽出できるようにしたいと思います。 検索条件はテキストボックスに入力するようにしており、テキストボックス名は「検索条件1」、「検索条件2」となっています。 以下のコードでやってみたのですが、「実行時エラー13、型が一致しません」というエラーが出てうまく抽出できません。 Private Sub 検索ボタン_Click() Dim filter1 As String filter1 = "フィールド1 like '*" & Me!検索条件1 & "*' or フィールド2 like '*" & Me!検索条件1 & "*' orフィールド3 like '*" & Me!検索条件1 & "*'" And " フィールド4 like '*" & Me!検索条件2 & "*' or フィールド5 like '*" & Me!検索条件2 & "*' orフィールド6 like '*" & Me!検索条件2 & "*'" DoCmd.OpenForm "データ", acNormal Forms!データ!.filter = filter1 Forms!データ!.FilterOn = True End Sub 「検索条件1,2」のテキストボックスがあるフォーム上の「検索ボタン」をクリックすると、 「データ」フォームが開き、検索をかけるという流れをイメージして作成 しています。 どなたか正しい記述を教えていただけませんでしょうか。 よろしくお願いいたします。

  • Access2007 フォームでのOR検索

    Access歴は2カ月程度です。 クエリから作成したフォームの中でのOR検索を行いたいのですが フィールド名・・・工具名,使用番号 検索に使用する非連結txtbox・・・工具名条件,使用条件 となっており、 Private Sub 検索_Click() If [工具名条件] <> "" Then 検索文字 = 検索文字 & " and 工具名 like '*" & [工具名条件] & "*'" If [使用条件] <> "" Then 検索文字 = 検索文字 & " and 使用番号 like '*" & [使用条件] & "*'" If 検索文字 = "" Then Me.FilterOn = False Else Me.Filter = Mid(検索文字, 6, 2000) Me.FilterOn = True DoCmd.Requery End If End Sub となっており、工具名と使用番号のAND検索は出来ているのですが、使用番号が1~6あり、 OR検索を使用して2つを検索条件にし、それぞれ該当している結果を表示させたいのですが。。。 工具名はカタカナや漢字のみです。 使用番号は「1,2,3」等と入力してあります。 クエリの抽出条件は無記入です。 どうぞ、よろしくお願いします。

  • Accessでの検索フォーム作成

    お世話になります。 Accessを使い始めて半月ぐらいの初心者です 次のような条件の検索フォームの作成を依頼されたのですがうまく出来ません。 (1)Accessのフォームフィルタを使用した検索フォームで、3つのテキストボックス(以下TB)を同一 フォーム上に用意し、抽出を実行するボタンと解除するボタンをTBの隣にそれぞれ用意する (2)あいまいな条件(部分一致)で検索出来るようにする (3)抽出結果も同一フォーム上に表示 (4)任意のTBに入力した値で抽出後、他のTBを利用し 絞り込み検索を実行できるようにしたい 現在は下記のように作成しました。 ●テーブル [管理番号]、[品名品番]、[仕入先名]のフィールドを持つテーブルを用意。 ●フォーム(表形式) 上記テーブルに連結した検索フォームを作成し、抽出する値を入力する TBの名前はそれぞれ下のように付けました。 フィールド名    TB名 ・[管理番号]⇒管理番号検索 ・[品名品番]⇒品名品番検索 ・[仕入先名]⇒仕入先名検索 ・[抽出実行ボタン]のイベント(管理番号で検索時) Private Sub コマンド47_Click() Me.Filter = "管理番号 Like '*" & Me!管理番号検索 & "*'" Me.FilterOn = True End Sub ・[抽出解除ボタン]のイベント(管理番号で検索時) Private Sub コマンド49_Click() Me!管理番号検索 = Null Me.FilterOn = False End Sub 他2つも同様に作成して実行した結果、単体での抽出はうまくいくのですが さらに絞り込もうと他のTBに値を入力して抽出を実行すると先の抽出が解除され 単体でのフィルタがかかって抽出されてしまいます。 どなた様か良い案が御座いましたらご指導ください。 初心者のため、説明不足な点があるかと思いますが 不明な点がございましたらご質問くださいませ。 宜しくお願い致します。

  • アクセスのフォームで

    アクセスのフォームで、品番一覧というテーブルを基にした、F品番一覧というフォームがあります。 ヘッダー部に検索するコンボボックスがあり、品番一覧テーブルの品番を参照しています。 検索ボタンを押すと、コンボボックスの内容に当てはまるものが、フォームの詳細部に一覧として表示させる様にしたのですが、品番に"50#1"や"50#2"という#を使い、1と2を分けている物があるのですが、コンボボックスで、この#が付いた物で検索すると検索結果がなにも表示されません。#が付いていない物はちゃんと一覧が表示されます。 #が付いている場合でもちゃんと表示するにはどの様にしたら良いですか?テーブル側の#を取り除く事はできません。 検索ボタンのコードは Private Sub 検索_Click() Dim strFilter As String, strExp As String, aryOpe As Variant If Not IsNull(Me.txt氏名) Then strFilter = strFilter & " AND 品番 Like *" & Me.品番一覧 & "*" End If Me.Filter = Mid(strFilter, 5) If strFilter = "" Then Me.FilterOn = False Else Me.FilterOn = True End If となっています。 うまく説明できなくてすいませんが、誰か教えて頂けませんか? よろしくお願いします。 End Sub

  • Access:検索フォーム

    Access:検索フォーム クエリを基に作成したフォームで「日付2」が変動する検索フォームを作りたいのですが上手く動作しません。 不足などを教えてください; Access2007/WinXP クエリ名 q_出席一覧絞込 1)フィールド名 日付1  クエリ条件 >#2010/01/01#       (2010/1/1以降) 2)フィールド名 日付2  クエリ条件 ([Forms]![出席者絞込]![検索日]に入力した日付以降の日付) フォーム名:出席者絞込 帳票フォーム 1)テキストボックス名:検索日   定型入力: 0000/00/00;0;*   非連結 2)ボタン名:検索ボタン1   クリック時イベントプロシージャ:   Private Sub 検索ボタン1_Click() Me.Requery   End Sub また、フォーム上で元テーブル「出席一覧」のフィールド「単価」の修正機能を加えたい状態です。 (クエリにも「単価」は呼び込んであります) クエリ元のフォーム上で修正>ボタンクリック時にRequeryを記入、という考えでいいのでしょうか? 参考になるサイトなどあればご紹介ください。

  • Access 検索フォームの作り方について

    Accessで受付リスト作成しました。 *受付一覧テーブル:データはここに保存 *入力フォーム:データはここから入力 これとは別に、検索フォームを作りたいのです。 フォームのヘッダーにテキスト(氏名を入力)とトグルボタン("検索開始")を作って、 受付一覧テーブルにあるデータを入力フォームと同じ形式で呼び起こしたいのです。 初心者のため、こんな簡単な質問をして申し訳ございません。 ただ、1点気になるのが、テキストには全くの同一人物のデータが複数あります。 (例) 受付日    氏名 2005/11/2   山田 太郎 2006/02/5   山田 太郎 2007/10/1   山田 太郎 この複数のデータを受付日直近のものから順呼び起こすことは可能でしょうか? 難しいの場合は、単純に検索フォームの作り方をお教えいただけますと大変助かります。 何卒よろしくお願いいたします。

  • 検索フォームで検索するものが決まっているときのかきかた。

    Ac2000です。 T_マスタというテーブルに 名前や所属の課、年度などが入っています。 このTマスタから検索する検索フォームがあります。 検索ボタンがいくつかあり、 年度を検索するようにテキストボックスがあります。 年度テキストボックスにいれた年度で検索しつつ、 押した検索ボタンによって検索する方法はどのようにしたらよいでしょうか? Ex.検索ボタンには所属の課などがかいてあり、「総務」「営業」などどかいてあります。 ソースはこんな感じです。 ------------------------------ Dim SQL As String Dim WhereCond As String Dim condNendo As String '年度 If Me!年度.Value <> "" Then condNendo = "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")" WhereCond = WhereCond & " AND " & condNendo End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenReport "R_マスタ_一覧", acPreview, , WhereCond End Sub

専門家に質問してみよう