• ベストアンサー

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です。

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.8

また、間違えました。 なにぶん、実際に書いてないもんで。 チェック欄のところを以下のように修正して下さい。 '[チェック欄] Select Case Me!fraチェック欄.Value   Case 1  '全て     '何もしない   Case 2  'チェック欄あり     condCheck = "(テーブル1.チェック欄 =" & True & ")"     wherecond = wherecond & "and " & condCheck   Case 3  'チェック欄なし     condCheck = "(テーブル1.チェック欄=" & False & ")"     wherecond = wherecond & "and " & condCheck End Select 元のコードだと、チェック欄[全て]を選択すると、WhereCondの末尾に" AND "が余分についてしまい、構文エラーになってしまいます。 これで大丈夫だと思います。(ちょっと不安) では。

KODAMAR
質問者

お礼

できました!! ありがとうございます!! これでやっと。。。と思ったのですが、更に更に質問してもよろしいでしょうか? 今まで文字を入れる検索フォームはテキストボックスかチェックボックスかラジオボタンでしたよね。 コンボボックスなんていうのはどのようにやるのでしょうか? テキストボックスと同じようなカンジではもちろんエラーですよね? 何度もすいませんが、宜しくお願いします。。

KODAMAR
質問者

補足

すいません、大丈夫じゃなかったです(^^; 名前を入れないでチェックあり(なしも)の場合にエラーが出てしまいます! 名前さえ入れれば3つのどれでも大丈夫なのですが。。。 ------------------------ 実行時エラー '3075'; クエリ式'テーブル1.チェック欄=True)'の不要な')'があります。 ------------------------ です。 どこを直せばいいのでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.7

まだ締め切っていないようですので。 >チェック欄のところで、両方検索できない、とありますが、 >これの両方を検索する方法というのはあるのでしょうか? 検索条件入力フォームで、条件入力をチェックボックスで行うと、チェックした・しないの2種類しか判定出来ません。 したがって、必要な判定基準の数だけオプションボタンを作ります。 やり方(知っている部分は飛ばして下さい。) ・まず、フォームにオプショングループ(フレーム)を配置する ・ツールボックスのオプションボタンをクリックして選択状態にする ・マウスポインタ(フォーム上ではオプションボタンの形になる)をそのフレームの上に持っていくと、フレーム内が反転表示される ・そのままフレーム内にドラッグしてオプションボタンを配置する ・あと2つ、同様にオプションボタンをフレーム内に配置する ・これで、オプションボタンが3つグループ化されました。グループ化されているオプションボタンは、常にグループ内で1つしかチェック出来ません。(他のボタンを選択すると元のボタンは自動的にチェックが外れます。) ・オプションボタンにはオプション値というプロパティがあり、これでどのオプションボタンがチェックされているか判定します。 ・この値はオプションボタン自身ではなく、グループ化しているフレームのValueプロパティで設定したり、取得したりします。 ・オプションボタンとセットになっているラベルコントロールのキャプションを、分かり易く変えます。 例) オプション値1・・・"全て" オプション値2・・・"チェック欄あり" オプション値3・・・"チェック欄なし" ・フレームの既定値プロパティにどれかのオプション値の値を設定します。これで、フォームが立ち上がった直後のとりあえずチェックされているオプションボタンを設定出来ます。 ・コードのチェック欄の部分を以下のように変更します(フレームの名前は[fraチェック欄]とします) '[チェック欄] Select Case Me!fraチェック欄.Value   Case 1  '全て     condCheck = ""   Case 2  'チェック欄あり     condCheck = "(テーブル1.チェック欄 =" & True & ")"   Case 3  'チェック欄なし     condCheck = "(テーブル1.チェック欄=" & False & ")" End Select wherecond = wherecond & "and" & condCheck これで、[全て]を選べばチェック欄の有無両方とも、[チェック欄あり]でチェック欄がTrueのもの、[チェック欄なし]でチェック欄がFalseのものを抽出出来ます。 がんばって下さい。 では。

KODAMAR
質問者

お礼

何度もご登場いただき、ありがとうございます。。。 試してみました。 できました!やったー!! と思ったのも束の間! 名前欄に「持田」と入れて、チェック欄を「全て」で検索すると -------------------- 実行時エラー'3075'; クエリ式'(テーブル1.名前 like '*持田*')and' の構文エラー : 演算子がありません。 -------------------- と出てしまうんです。 名前に何もいれずにチェック欄を「全て」にすればきちんと検索結果が出るし、 名前を入れて、チェック欄を「あり」「なし」にすると検索結果が出てきます。 なぜエラーが出てしまうのでしょうか? 以下がコードです。 -------------------- Private Sub コマンド8_Click() Dim SQL As String Dim wherecond As String Dim condID As String Dim condName As String Dim condBirth As String Dim condCheck As String wherecond = "" '[氏名ID] If Me!氏名ID.Value <> "" Then condID = "(テーブル1.氏名ID = " & CLng(Me!氏名ID.Value) & ")" wherecond = wherecond & " and " & condID End If '[名前] If Me!名前.Value <> "" Then condName = "(テーブル1.名前 like '*" & Me!名前.Value & "*')" wherecond = wherecond & " and " & condName End If '[誕生日] If Me!誕生日.Value <> "" Then condBirth = "(テーブル1.誕生日 = #" & Me!誕生日.Value & "#)" wherecond = wherecond & " and " & condBirth End If '[チェック欄] Select Case Me!fraチェック欄.Value Case 1 condCheck = "" Case 2 condCheck = "(テーブル1.チェック欄=" & True & ")" Case 3 condCheck = "(テーブル1.チェック欄=" & False & ")" End Select wherecond = wherecond & "and " & condCheck wherecond = Mid(wherecond, 6) DoCmd.OpenForm "検索結果フォーム", acNormal, , wherecond End Sub -------------------- 申し訳ありませんが、もう一度ご教授願えませんか? 宜しくお願いします。

KODAMAR
質問者

補足

No.8に対する2度目の補足です。 (見ていただけるかどうか・・・) すいません、こちらのミスでした! ちゃんとできました。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.6

もうひとつ気になったので。 各条件の wherecond = wherecond & "and" & condName でandの前後に半角スペースはちゃんと入ってますか? では。

KODAMAR
質問者

お礼

あっ!入っていなかったです! これをやったら、下のエラーも解消しました! 本当に本当にありがとうございました! やっと完成しました。 なんと言ったらいいかわからないくらいお世話になりました。 貴重な時間を割いていただいて、本当に感謝しています。 ありがとうございました!!

KODAMAR
質問者

補足

追加で質問してもよろしいでしょうか?? チェック欄のところで、両方検索できない、とありますが、 これの両方を検索する方法というのはあるのでしょうか? お時間あるときで結構ですので、もし方法がありましたらお教えください。 宜しくお願いします。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

間違えました。 DoCmd.OpenForm 検索結果フォーム, acNormal, , wherecond を DoCmd.OpenForm "検索結果フォーム", acNormal, , wherecond にして下さい。 (フォーム名は文字列を指定しないといけないのでダブルクォーテーションで括らないとダメでした。) Dim condNameを削除した件はもちろんOKです。(私の間違い) では。

KODAMAR
質問者

お礼

ありがとうございます。無事解消しました。 が!また新たにエラーが!! 名前のところに「持田」と入れてボタンをクリックすると -------------------- 実行時エラー'3075'; クエリ式'ーブル1.名前 like '*持田*')and(テーブル1.チェック欄=False)'の不要な')'があります。 -------------------- と出てしまうのです。 これは一体どこのことでしょうか? お願いします。。。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

三度maruru01です。 順番にいきます。ちょっと修正もあります。 Dim SQL As String Dim WhereCond As String Dim condName As String Dim condID As String Dim condName As String Dim condBirth As String Dim condCheck As String WhereCond = ""  '変数の初期化。本当はいらないけど明示的に '氏名ID(検索条件入力がテキストボックスとする) 'ちなみにテーブル1の氏名IDは長整数型でないといけません。 If Me!氏名ID.Value <> "" Then   condID = "(テーブル1.氏名ID = " & CLng(Me!氏名ID.Value) & ")"   WhereCond = WhereCond & " AND " & condID End If 'CLngでテキストボックスの内容を長整数型に変換 '名前(検索条件入力がテキストボックスとする) If Me!名前.Value <> "" Then   condName = "(テーブル1.名前 LIKE '*" & Me!名前.Value & "*')"   WhereCond = WhereCond & " AND " & condName End If 'あいまい検索なのでLIKEとワイルドカード(*)を使用 'テキスト型なので、"'"(シングルクォーテーション)で括らないといけない '誕生日(検索条件入力がテキストボックスとする) 'このテキストボックスには、"2002/1/2"など、日付と認識出来る文字列でないといけない If Me!誕生日.Value <> "" Then   condBirth = "(テーブル1.誕生日 = #" & Me!誕生日.Value & "#)"   WhereCond = WhereCond & " AND " & condBirth End If '日付型なので、"#"で括らないといけない 'チェック欄(検索条件入力がチェックボックスとする) If Me!チェック欄.Value = True Then   condCheck = "(テーブル1.チェック欄 = " & True & ")" Else   condCheck = "(テーブル1.チェック欄 = " & False & ")" End If WhereCond = WhereCond & " AND " & condCheck 'ちなみにこの場合だとチェックがある人とない人を両方検索することは出来ない 'この時点で、WhereCondは必ず先頭に" AND "の5文字があるので、Mid関数で6文字目以降を取り出す WhereCond = Mid(WhereCond, 6) '[検索結果フォーム]を開く DoCmd.OpenForm 検索結果フォーム,acNormal,, WhereCond 'なお、予めテーブル1をソースにした[検索結果フォーム]を作成しておく 'フォームの作成は普通に新規作成で、最初の"基になるテーブル"にテーブル1を選択して行えばいいです これらを例えば検索条件入力フォームの[検索]コマンドボタンのClickイベントに書けばOK では。

KODAMAR
質問者

お礼

たびたびありがとうございます。 maruru01さんがおっしゃったとおりに以下の用に記入してみました。 Private Sub コマンド8_Click() Dim SQL As String Dim wherecond As String Dim condID As String Dim condName As String Dim condBirth As String Dim condCheck As String wherecond = "" '[氏名ID] If Me!氏名ID.Value <> "" Then condID = "(テーブル1.氏名ID = " & CLng(Me!氏名ID.Value) & ")" wherecond = wherecond & "and " & condID End If '[名前] If Me!名前.Value <> "" Then condName = "(テーブル1.名前 like '*" & Me!名前.Value & "*')" wherecond = wherecond & "and" & condName End If '[誕生日] If Me!誕生日.Value <> "" Then condBirth = "(テーブル1.誕生日 =#" & Me!誕生日.Value & "#)" wherecond = wherecond & "and" & condBirth End If '[チェック欄] If Me!チェック欄.Value = True Then condCheck = "(テーブル1.チェック欄 =" & True & ")" Else condCheck = "(テーブル1.チェック欄=" & False & ")" End If wherecond = wherecond & "and" & condCheck wherecond = Mid(wherecond, 6) DoCmd.OpenForm 検索結果フォーム, acNormal, , wherecond End Sub ------------------------------ Dim SQL As String Dim wherecond As String Dim condID As String Dim condName As String Dim condBirth As String Dim condCheck As String に「Dim condName As String」が二つあったので、独断で消してしまったのですが大丈夫でしょうか? 以上をクリック時のイベントプロシージャにかきこみ実行を行うと -------------------- 実行時エラー ‘2494’; このアクションまたはメソッドを実行するには、[Form Name/フォーム名]引数が必要です。 -------------------- と出てしまうのです。 どこが間違っているのでしょうか? テーブル1の 氏名ID「数値型[長整数型]] もちゃんとなっているようなのですが。。。 何度も何度も本当にすいません。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

再びmaruru01です。 ・・・以下略 のところは、変数(私が勝手に作りましたが、任意に付け直して下さい)の宣言をして下さい。全てStringです。 SQLステートメントは、クエリのデザインモードでメニューの[表示]→[SQLビュー]で見られるもの同じです。 ただし、文末の";"(セミコロン)は要りません。 また、改行しているところは、半角スペースでつなげます。 あと、名前はあいまい検索なので、LIKE演算子と*(ワイルドカード)を使用しています。(また、文字列なので、"'"(シングルクォーテーション)で括っています。) これが例えば、名前IDが数値型(長整数)なら、 condID = "(テーブル1.名前ID = " & CLng(Me!名前ID.Value) & ")" となります。 これらをANDでつなげると、(先頭の" AND "は取る) WhereCond = "(名前IDの条件式) AND (名前の条件式) ・・・" という風になります。 その後は、検索(抽出)結果をどうするのかによります。 結果フォームを開いて結果を表示するなら DoCmd.OpenForm フォーム名, acNormal,, WhereCond すでにテーブル1を元にしたフォームを開いているなら Forms!フォーム名.Filter = WhereCond Forms!フォーム名.FilterOn = True これでフォームにフィルタを適用する 結果テーブルを新たに作るなら SQL = "SELECT * INTO 新テーブル名 FROM テーブル1・・・" DoCmd.RunSQL SQL などなどです。 詳細はVBEの画面からヘルプを開いて、"SQL"などで検索して下さい。 では。

KODAMAR
質問者

お礼

再びありがとうございます! 今実際のもので試すのが怖いので(汗)試しに簡単なものをつくって試しています。 「テーブル1」 ・氏名ID[数値型] ・名前[テキスト] ・誕生日[日付] ・チェック欄[Yes/No] となっています。 これから抽出するために検索フォームの実行ボタンに、maruru01さんから教えていただいたものを入力しているところですが、 Dim SQL As String Dim WhereCond As String Dim condName As String Dim condID Dim condName Dim condBirth Dim condCheck '[氏名ID] WhereCond = "" If Me!氏名ID.Value = "" Then condID = "" Else condID = "(テーブル1.氏名ID)" LIKE '*" & Me!氏名ID.Value & "*')" WhereCond = WhereCond & "AND" & condID End If WhereCond = Mid (WhereCond,6) <この「6」は?? SQL = "SELECT * FROM テーブル1"& "WHERE" & WhereCond DoCmd.Run SQL SQL DoCmd.OpenForm 検索結果フォーム,acNormal,, WhereCond End Sub のようになっています。 これに「名前」を付け加えるとしたらどこに入れたらいいんでしょうか? 同じように、 WhereCond = "" If Me!名前.Value = "" Then    : と氏名IDのEnd Ifの下に続ければいいんでしょうか? 何度もすいませんが宜しくお願いします。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 私なら、クエリは作らず、コードで直接SQLステートメントを書いて実行します。 仮に[検索条件入力フォーム]に[検索]というコマンドボタンがあるなら、そのClickイベントに記述します。 そこで、検索条件(WHERE句)は、 Dim SQL As String Dim WhereCond As String Dim condName As String Dim condID ・・・以下略 '[名前]項目は、 WhereCond = "" If Me!名前.Value = "" Then   condName = "" Else   condName = "(テーブル1.名前 LIKE '*" & Me!名前.Value & "*')"   WhereCond = WhereCond & " AND " & condName End If '他の項目、condID、condDate、condCheck1、condCheck2も同じ感じで 'WhereCondの後ろに順番につなげていきます。 '先頭の" AND "を除きます。 WhereCond = Mid(WhereCond, 6) 'それで全体のSQLステートメントは SQL = "SELECT * FROM テーブル1 " & _    "WHERE " & WhereCond 'で、これを実行 DoCmd.RunSQL SQL SQLステートメントは必要に応じて、INSERT文にしたり、INTO句をつけたりして下さい。 では。

KODAMAR
質問者

お礼

すいません、SQLの知識がないのでよくわからないのですが、 これをこのまま入れてしまえばできるのでしょうか? >Dim condID >・・・以下略 のあとはどうすればいいのでしょうか? すいませんが、宜しくお願いします。

すると、全ての回答が全文表示されます。
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

SQLを記述するのが正解ですが、クエリでも何とかなると思いますよ 1:クエリのフィールドに、 氏名条件:Nz([氏名]) という列を追加してください。 2:んで、この列の[表示]チェックボックスを外してください。 3:んで、氏名欄の抽出条件を切り取って、この列の抽出条件をに貼り付けてください これで、検索条件入力フォームの氏名欄が空白のときは氏名での絞込みを(見かけ上)行わなくなるはずです。 ただし、速度的にはかなり低下します。 現実的には、冒頭に書いたようにSQLを使うのがいいですね。 過去の質問を検索すれば、SQLについてもある程度は使いこなせるようになるんじゃないかと思います。 PS.「検索がうまくいきません。」について、どううまくいかなかったのかが分からなかった為、半ば以上推測で回答しています(^^; (上記の解釈で合っているような気はするのですが(気のせい?)) 「検索がうまくいきません。」ではなく例えば、 1:どんな結果が出て来てしまうのか。 2:どんな結果が出て来て欲しいのか。 ってな感じで補足していただけると、更なる回答がつくかもしれませんね。

KODAMAR
質問者

補足

回答ありがとうございます。 このような方法があるんですね、初めて知りました。 >3:んで、氏名欄の抽出条件を切り取って、この列の抽出条件をに貼り付けてください とあるのですが、例えば、上記の例ですと、「氏名ID」のクエリーの抽出条件欄には何も入っていないことになるのですが、 この場合はどうしたら・・・? なんだか自分が勘違いしているような気になってきたのですが、、宜しくお願いします。 >PS.「検索がうまくいきません。」について、どううまくいかなかったのかが分からなかった為、半ば以上推測で回答しています(^^; (上記の解釈で合っているような気はするのですが(気のせい?)) はい、すいませんでした。 「検索がうまくいきません」とは、「検索を行った場合に空欄があるものが検索した時に出てこない」といえばわかっていただけますでしょうか? すべての項目が入っていればいいのですが、入っていないと、検索をかけてもないものとして扱われてしまっているようで。。。 例えば、氏名IDに何も入っていなくて、でも「田中」という名前の人のデータが入っていた場合に、名前で「田中」で検索してもその人は検索結果に反映されないのです。 わかっていただけましたでしょうか?? また何かありましたら補足要求してください。 宜しくお願いしますm(_ _)m

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう