• ベストアンサー

Accessで検索フォームを作成したい。

teppyの回答

  • teppy
  • ベストアンサー率50% (9/18)
回答No.6

条件付でサンプルコードを記します ・文字列検索のみ ・一つのフィールドのみ検索可(指定変更可能) ・複数条件の時は、OR条件で検索する データはフォームで開いていて、検索フォームを作成したと仮定します (データを開いているフォームは、「ABC」と仮定します) (検索フォームは、「検索値」テキストボックスと「検索実行」コマンドボタンが配置されている) '~~~~~~~~~~~~~~~~~~~~ Private Sub 検索実行_Click() Dim stSearch As String '検索値 Dim stFieldName As String '検索対象フィールド名 Dim stFormName As String '検索対象フォーム名 Dim stSQL As String '検索条件 Dim stMsg As String 'メッセージ Dim RS As DAO.Recordset '検索用レコードセット '検索値を取得 stSearch = Nz(Me![検索値].Value, "") If stSearch = "" Then stMsg = "検索値が設定されていません!" MsgBox stMsg, vbExclamation Exit Sub End If '検索フィールド設定 stFieldName = "氏名" '検索条件設定(複数可:"/"にて判断) stSQL = 条件式作成(stSearch, stFieldName) '検索対象フォームのレコードセット展開(フィルタ設定込み) stFormName = "ABC" Set RS = Forms(stFormName).RecordsetClone '検索実行(次へ) RS.FindNext stSQL If RS.NoMatch = True Then '検索実行(全体) RS.FindFirst stSQL If RS.NoMatch = True Then stMsg = "データがありません!" MsgBox stMsg, vbExclamation Else stMsg = "最後まで検索しました!" & vbCrLf & "また最初から検索しますか?" If MsgBox(stMsg, vbYesNo + vbQuestion) = vbYes Then 'レコード移動 Forms(stFormName).Bookmark = RS.Bookmark End If End If Else 'レコード移動 Forms(stFormName).Bookmark = RS.Bookmark End If 'レコードセット解放 Set RS = Nothing End Sub '~~~~~~~~~~~~~~~~~~~~ Private Function 条件式作成(stSearch As String, stFieldName As String) As String Dim stSQL As String '検索条件 Dim stTmp As String '作業用文字列 Dim intCnt1 As Integer '作業用カウンタ1 Dim intCnt2 As Integer '作業用カウンタ2 Const stSepa As String = "/" '検索条件区切り文字 Const stAst As String = "*" '検索条件アスタリスク Const stQues As String = "?" '検索条件クエスチョン '検索条件設定(複数可:"/"にて判断) stSQL = "" intCnt1 = 1 intCnt2 = InStr(1, stSearch, stSepa) If intCnt2 = 0 Then '条件式設定 If InStr(1, stSearch, stAst) = 0 And InStr(1, stSearch, stQues) = 0 Then stSQL = "((" & stFieldName & ") = '" & stSearch & "')" Else stSQL = "((" & stFieldName & ") Like '" & stSearch & "')" End If Else stTmp = Mid(stSearch, intCnt1, intCnt2 - 1) Do Until stTmp = "" '条件接続詞を付加 If stSQL <> "" Then stSQL = stSQL & " Or " '条件式追加 If InStr(1, stTmp, stAst) = 0 And InStr(1, stTmp, stQues) = 0 Then stSQL = stSQL & "((" & stFieldName & ") = '" & stTmp & "')" Else stSQL = stSQL & "((" & stFieldName & ") Like '" & stTmp & "')" End If intCnt1 = intCnt2 + 1 intCnt2 = InStr(intCnt1, stSearch, stSepa) If intCnt2 = 0 Then intCnt2 = Len(stSearch) stTmp = Mid(stSearch, intCnt1, intCnt2 - intCnt1 + 1) Loop End If '戻り値設定 条件式作成 = stSQL End Function '~~~~~~~~~~~~~~~~~~~~ ※参照設定で、「Microsoft DAO 3.6 Object Library」にチェックをつけておいて下さい すいませんm(_ _)m 長くなってしまいました。 たぶん求めているのに近いと思います。(細かいところまでは動作確認をしておりませんが...) 抽出機能に関しては、「検索実行(次へ)」から以下を下記コードに置き換えればできると思います。 ただ、抽出(フィルタ)機能を使用すると、フィルタ条件をフォームが覚えてしまうので、どこかでフィルタの初期化をしてあげなければなりません。 '~~~~~~~~~~~~~~~~~~~~ '抽出実行 Forms(stFormName).Filter = stSQL Forms(stFormName).FilterOn = True '~~~~~~~~~~~~~~~~~~~~ フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。 もし、分からないところがあれば補足を御願い致します それでは頑張って下さい (^^)/

KODAMAR
質問者

補足

詳しい回答ありがとうございます! これは・・・検索フォームをつくるための検索クエリに入れればよいのでしょうか?(初心者ですいません。) >・文字列検索のみ >・一つのフィールドのみ検索可(指定変更可能) >・複数条件の時は、OR条件で検索する 条件まで考えていただいてありがとうございます。 確かにこういうことを考えなきゃ、と気づき使用者にきいたところ ・複数フィールドを一度に検索することもある。(日付と名前とか) ・同じフィールドで複数条件を検索することもある。(田中と山田という名前、とか) ・上記2つを同時に行うこともある。(東京都に住んでいる田中と山田など) ということなのだそうです。 なんかできるのかできないのかさえ自分で判断できなくなってきてしまいました・・・。 それとできたら、ということで言われたのですが、ANDとORを切替えることができるボタンのようなものが欲しい、とのことなのです。 こういうことってできるのでしょうか? >フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。 下に使用するフィールド名をかきますね。 ・Date_year     日付の年(Ex.00(年)) ・Date_month     日付の月(Ex.01(月)) ・Date_day      日付の日にち ・氏名ID       個々に番号をつける ・ソートID1     ソートをするためのキー ・ソートID2     ソートをするためのキー ・氏名         ・削除対象      削除する場合にチェックする。(チェックボックス) ・挨拶状送付     送付する場合にチェックを入れる。(チェックボックス) ・年賀状送付先    自宅か会社か選択をする。 ・暑中見舞い送付先    同  上 ・ランク       A~Eを選ぶ。 ・喪中        喪中の場合にチェック。(チェックボックス) ・会社グループID   会社のグループを選択する。 ・会社名        ・会社名2       ・役職         ・所属         ・会社郵便番号    会社の郵便番号 ・会社住所_都道府県  会社の住所の都道府県 ・会社住所_市町村       市町村 ・会社住所_町名        町名・番地 ・会社電話番号    会社の電話番号 ・自宅郵便番号     ・自宅住所_都道府県 ・自宅住所_市町村 ・自宅住所_町名 ・自宅電話番号 ・お歳暮・お中元_備考 ・住所・ハガキ_備考 ・異動・退職_備考 ・その他_備考 以上が全フィールドです。 会社・自宅の住所・郵便番号は相互でどちらかを入れるとどちらかが自動で入るようになっています。 このような状態のもので検索フォームを作成し、使用することは可能でしょうか? 長々とかいてしまいました。 よろしくお願いします。

関連するQ&A

  • ACCESSで複数条件でデータ抽出するフォームの作成

    ACCESS2000で複数の条件を入力し、該当するデータを抽出するフォームを作成しています。どんな方法がありますか?簡単に出来る方法をお教えください。 具体的には、売上明細データを検索します。あらかじめ テーブル:売上明細データ をいろいろなマスタを参照している クエリ:売上明細クエリ を元に抽出します 条件は売上日付の日付1と日付2の項目と、伝票区分の項目です。 フォームの頭にテキストボックスを3つ作成し、日付1~日付2までの売上日付で 入力された伝票区分のもののみを表示させたいのです。 検索というコンボボタンを配置し、クリック時にその下にクエリからの必要な表示項目を売上明細クエリから配置しています。 抽出する方法(条件の与え方)を教えてください。よろしくお願いいたします。

  • Accessの検索フォームで。

    Accessを使ってデータベースを作成しています。 「テーブル1」があり、これには 名前ID 名前 入力日 チェック項目1 チェック項目2   : とあります。 これをもとに「検索クエリ」を作成しました。 検索クエリの項目は「テーブル1」とまったく同じですが、 すべてを検索するわけではないので ・名前ID  「検索項目なし」 ・名前  「Like IIf(IsNull([Forms]![検索条件入力フォーム]![名前]),[氏名],'*' & [Forms]![検索条件入力フォーム]![名前] & '*') ・入力日  「検索項目なし」 ・チェック項目1  「Like IIf(IsNull([Forms]![検索条件入力フォーム]![チェック項目1]),[チェック項目1],[Forms]![検索条件入力フォーム]![チェック項目1])」 ・チェック項目2  ※上記と同じ。   : としてあります。 この「検索クエリ」をもとに「検索条件入力フォーム」を作成してあります。 名前の欄に「田中」と入力すれば、「田中」がつく人がすべて検索されるというようなカンジになっています。 「テーブル1」に空欄があり、その場合に、検索がうまくいきません。 「検索クエリ」のところですべてに条件を入れればいいのですが、フォームに全てが入っていないので。。。 やはりフォームに「テーブル1」の項目すべてを含め、クエリで条件を入れるべきでしょうか? これが今考えている中では一番手早いようなカンジがするのですが、どうしてもあまりスマートなやり方ではないような気がして。。。 これしかないのであれば、これでやりますが、他にいい方法があれば、教えていただけないでしょうか? あまり上手な文章ではないので、補足要求があれば補足します。 宜しくお願いします。 Ac2000です。

  • Access、検索用フォームでのあいまいな検索

    現在、Accessでデータベース作成をしています。 テーブル:  ・テーブルA          ・テーブルB          (A・B間にリレーションシップ設定) クエリ    ・検索クエリ(テーブルA・テーブルBを元に作成) フォーム   ・検索用フォーム(デザインビューでフォーム作成より)          ・検索結果フォーム(検索クエリを元に作成) また、以下のような設定を入力しました。 「検索クエリ」の抽出欄  Like "*" & [Forms]![検索用フォーム]![検索したい名前] & "*"・・(1)  ※検索したい項目、すべての抽出欄に設定済 「検索用フォーム」  検索実行ボタンを作成し、マクロを設定  ・フォームを開く→「検索結果フォーム」  ・フィルタ→「検索クエリ」 上記の設定により、検索用フォームに検索文字を入力することで、その結果を「検索結果フォーム」に反映することができました。 ただ、テーブルAが元になっている項目の抽出欄のみに(1)を入力すると、うまくいくのですが、テーブルBが元になっている項目欄にも (1)を入力しようとすると、検索用フォームからうまく検索することができなくなります。 2つのテーブルを元にしたクエリからは、検索用フォームをつかった複数のOR検索はできないのでしょうか?? ご存知の方、ぜひ教えてください。 よろしくお願いいたします。

  • Accessでキーワード検索(抽出)

    Access97で新聞記事のデータベースを作っています。 以下のようなテーブルがメインの非常に単純なものです。 ┌──┬───┬──┬──┐ │日付│見出し│分類│備考│ ├──┼───┼──┼──┤ 新聞記事を日付やキーワードで抽出したいのですが、 キーワード検索がうまく出来ません。 パラメーターで見出し列からデータを抽出したところ、 完全に一致するデータは抽出されるのですが、 「*キーワード*」で一部合致のデータを 抽出することは出来ませんでした。 デザインビューで「抽出条件」に入力すれば 「*キーワード*」でも可能なことは確認しましたが Accessに慣れていない人に操作をさせたいため、できれば キーワード入力を促すフォーム(ダイアログ)表示 ↓ キーワードを入力して抽出 ↓ クエリー、フォーム又はレポートに表示 という手順にしたいのですが、 Accessの機能のみでそういったことはできますでしょうか? VBAを使った方がいいでしょうか?

  • Access2002での複数項目検索について

    教えてください。 Access2002でデータベースを作っています。 ふたつのテーブルから選択クエリを作成、そのクエリ内で部分一致のパラメータを設定し、 複数項目(5つ)の検索を行っていましたが、検索のたびに毎回5つのダイアログボックスを クリア(必要項目を入力、入力しないパラメータは「OK」でとばす)するのがめんどくさいと 使用者にいわれ、検索フォームからの検索に変えたいと思っています。 その場合、  (1)選択クエリを基としたフォームを新規作成し、  (2)非連結のテキストボックスを5つ作り、それぞれ適当な名前を付け、  (3)クエリの抽出条件の欄の現在パラメータ設定をしているところを、       [Forms]![フォーム名]![テキストボックス名]に変える だけではできないのでしょうか。。 いろいろWeb上で調べたり、本を読んで見よう見まねでつくってみましたが、出来上がった フォームから検索ボタン(「クエリの実行」ボタン)を押しても、全件が表示されてしまうの です。 パラメータではできているのに・・・。 どなたか、ご教示くださるとうれしいです。 よろしくお願いいたします。

  • ACCESS のフォームの内容をクエリーの抽出条件にするには?

    Windows2000,Access2000です。 Accessのクエリーでデータを選択して表示する作業をしています。 現在はクエリーを自分で修正して実行しています。 でもそれではみんなで使うには使いづらいので、 フォームを作成しそのフォーム上の入力項目に入力された データをクエリーの抽出条件に指定する様にしようという事になりました。 フォーム上の入力フィールドの内容をクエリーの抽出条件に設定する方法はすぐわかりました。 でも「like」を指定する方法がわかりません。 つまりフォーム上の入力データを“xxx”とした時、クエリーの抽出条件を 「like "*xxx*"」としてクエリーを実行したいのです。 つたない文章でわかりにくいかと思いますが、ご存じの方おりましたら、 よろしくご教示ください。

  • Accessでデータベースを作っています。

    Accessでデータベースを作っています。 先日、こちらで質問をさせていただいて、クエリで複数のフィールドを対象にデータを検索する ことはクリアできました。 ありがとうございました。 ご指導に基づき、4つのフィールド(仮にA,B,C,D)について、クエリの抽出条件に  Like "*" & [Aを入力] & "*"  Like "*" & [Bを入力] & "*" ・・・ とそれぞれ設定してパラメータ入力を求め、4つの条件すべて、または一部のみ設定して検索し、 正しい検索結果が得られました。 今度は、検索用のフォームを作成し、フォームで入力した条件をクエリに送って、同じ結果を 得たいと思うのですが、以下の方法では正しい検索結果が出てきません。 ・フォームに検索用のボックスをA~Dまで4つ作成(ひとつはコンボボックス、あとはテキスト) ・クエリの抽出条件に、それぞれ以下を入力     Like "*" & [Forms]![Q_form(作成したフォームの名前)]!                       [A(それぞれの検索ボックスの名前)] & "*" ・フォームに「クエリの実行」のコマンドボタンを配置 パラメータで入力する代わりにフォームを使いたい、というものなのですが(パラメータ入力 よりも、コンボボックスを使って値を選ぶ方が検索する人には使いやすいかと思って)、どうしたら うまいこといきますでしょうか。。 教えてください。

  • accessのnot検索

    access2000で テーブル[日付](yyyy/mm/ddで入力されています)   [内容](なんでも。空白の場合もあります) フォーム  「日付」(yyyy/mm/ddのみ入力可能にしています)  「NGword」(どんな文字でも入力できます) という項目を作成し・・・ 1、クエリでフォームの「日付」に入力したものかつ 2、フォームの「NGWord」を含まないレコードのみを抽出したいのですがうまくいきません。 「日付」「NGword」が空白の場合は入力された条件のみ適用させたいです。 (「日付」・「NGWord」が両方空の場合は全レコード抽出したいです) クエリを作成して・・・ [日付]の抽出条件を like "*" & forms![フォーム名]![日付] & "*" で [内容]の抽出条件を (not like "*" & forms![フォーム名]![NGword] & "*") or (is null) で設定したのですがうまくいきませんでした・・・泣 宜しくお願いします。

  • アクセス2003で選択クエリから検索フォームを作成しています。検索した

    アクセス2003で選択クエリから検索フォームを作成しています。検索したいレコードの名前を入力する際に、コピーアンドペーストができません。パラメータの入力でその都度入力しているので不便です。貼り付けができるようにするにはどのようにしたらよいでしょうか。どなたかご教授ください。よろしくお願いいたします。

  • Access2003 検索用フォームでの検索がうまくいかない

    Access2003 検索用フォームでの検索がうまくいかない とある、テーブルを参照するフォームを作成。 そしてテキストbokを設けて、各項目毎にキーワードを指定してデータを抽出できるようにしたいのですが、 どうもうまくいきません。 検索は出来ているのですが、全部ひっかからないのです。 例えば ID という項目を検索するbox に"1"を入力して ID=1の全データを抽出しようとすると、一部検索にかかってこないものがある という具合です。 テーブルに入力されている数字や文字が本当に一致しているかどうかも調べましたが確かに一致しています。 実際、テーブルを開いて ctr+f で検索すると全てひっかかります。 何が原因なのでしょうか??? 私の作った手順は以下のとおりです。 テーブル作成(エクセルからインポート) ※空白の欄もあります フォーム新規作成でフォーム作成 フォーム上にテキストbox作成 クエリ作成 (Like "*" & [Forms]![フォーム名]![テキストbox名] & "*" ) マクロ作成⇒フィルタ実行/上の手順で作ったクエリを登録 マクロをフォーム上へドロップ およそこのような手順です。