-PR-
解決済み

Accessの検索フォームで。

  • 困ってます
  • 質問No.246449
  • 閲覧数1464
  • ありがとう数10
  • 気になる数0
  • 回答数8
  • コメント数0

お礼率 66% (871/1309)

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です。
通報する
  • 回答数8
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.8
レベル14

ベストアンサー率 51% (1179/2272)

また、間違えました。
なにぶん、実際に書いてないもんで。
チェック欄のところを以下のように修正して下さい。

'[チェック欄]
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

お礼率 66% (871/1309)

すいません、大丈夫じゃなかったです(^^;
名前を入れないでチェックあり(なしも)の場合にエラーが出てしまいます!
名前さえ入れれば3つのどれでも大丈夫なのですが。。。

------------------------
実行時エラー '3075';

クエリ式'テーブル1.チェック欄=True)'の不要な')'があります。
------------------------
です。

どこを直せばいいのでしょうか?
投稿日時 - 2002-04-05 13:15:42
お礼コメント
KODAMAR

お礼率 66% (871/1309)

できました!!
ありがとうございます!!
これでやっと。。。と思ったのですが、更に更に質問してもよろしいでしょうか?

今まで文字を入れる検索フォームはテキストボックスかチェックボックスかラジオボタンでしたよね。
コンボボックスなんていうのはどのようにやるのでしょうか?
テキストボックスと同じようなカンジではもちろんエラーですよね?

何度もすいませんが、宜しくお願いします。。
投稿日時 - 2002-04-05 13:12:53
-PR-
-PR-

その他の回答 (全7件)

  • 回答No.2
レベル14

ベストアンサー率 51% (1179/2272)

こんにちは。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

お礼率 66% (871/1309)

すいません、SQLの知識がないのでよくわからないのですが、
これをこのまま入れてしまえばできるのでしょうか?

>Dim condID
>・・・以下略
のあとはどうすればいいのでしょうか?

すいませんが、宜しくお願いします。
投稿日時 - 2002-04-04 11:41:57


  • 回答No.1
レベル13

ベストアンサー率 46% (643/1383)

SQLを記述するのが正解ですが、クエリでも何とかなると思いますよ

1:クエリのフィールドに、
氏名条件:Nz([氏名])
という列を追加してください。

2:んで、この列の[表示]チェックボックスを外してください。

3:んで、氏名欄の抽出条件を切り取って、この列の抽出条件をに貼り付けてください

これで、検索条件入力フォームの氏名欄が空白のときは氏名での絞込みを(見かけ上)行わなくなるはずです。

ただし、速度的にはかなり低下します。
現実的には、冒頭に書いたようにSQLを使うのがいいですね。
過去の質問を検索すれば、SQLについてもある程度は使いこなせるようになるんじゃないかと思います。


PS.「検索がうまくいきません。」について、どううまくいかなかったのかが分からなかった為、半ば以上推測で回答しています(^^; (上記の解釈で合っているような気はするのですが(気のせい?))

「検索がうまくいきません。」ではなく例えば、
1:どんな結果が出て来てしまうのか。
2:どんな結果が出て来て欲しいのか。
ってな感じで補足していただけると、更なる回答がつくかもしれませんね。
補足コメント
KODAMAR

お礼率 66% (871/1309)

回答ありがとうございます。

このような方法があるんですね、初めて知りました。
>3:んで、氏名欄の抽出条件を切り取って、この列の抽出条件をに貼り付けてください

とあるのですが、例えば、上記の例ですと、「氏名ID」のクエリーの抽出条件欄には何も入っていないことになるのですが、
この場合はどうしたら・・・?

なんだか自分が勘違いしているような気になってきたのですが、、宜しくお願いします。

>PS.「検索がうまくいきません。」について、どううまくいかなかったのかが分からなかった為、半ば以上推測で回答しています(^^; (上記の解釈で合っているような気はするのですが(気のせい?))

はい、すいませんでした。
「検索がうまくいきません」とは、「検索を行った場合に空欄があるものが検索した時に出てこない」といえばわかっていただけますでしょうか?
すべての項目が入っていればいいのですが、入っていないと、検索をかけてもないものとして扱われてしまっているようで。。。
例えば、氏名IDに何も入っていなくて、でも「田中」という名前の人のデータが入っていた場合に、名前で「田中」で検索してもその人は検索結果に反映されないのです。
わかっていただけましたでしょうか??

また何かありましたら補足要求してください。

宜しくお願いしますm(_ _)m
投稿日時 - 2002-04-04 08:39:02
  • 回答No.3
レベル14

ベストアンサー率 51% (1179/2272)

再び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

お礼率 66% (871/1309)

再びありがとうございます!

今実際のもので試すのが怖いので(汗)試しに簡単なものをつくって試しています。
「テーブル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の下に続ければいいんでしょうか?

何度もすいませんが宜しくお願いします。
投稿日時 - 2002-04-04 15:54:43
  • 回答No.4
レベル14

ベストアンサー率 51% (1179/2272)

三度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

お礼率 66% (871/1309)

たびたびありがとうございます。
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「数値型[長整数型]]
もちゃんとなっているようなのですが。。。

何度も何度も本当にすいません。
投稿日時 - 2002-04-04 17:12:20
  • 回答No.6
レベル14

ベストアンサー率 51% (1179/2272)

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

お礼率 66% (871/1309)

追加で質問してもよろしいでしょうか??

チェック欄のところで、両方検索できない、とありますが、
これの両方を検索する方法というのはあるのでしょうか?

お時間あるときで結構ですので、もし方法がありましたらお教えください。

宜しくお願いします。
投稿日時 - 2002-04-04 17:34:21
お礼コメント
KODAMAR

お礼率 66% (871/1309)

あっ!入っていなかったです!
これをやったら、下のエラーも解消しました!

本当に本当にありがとうございました!
やっと完成しました。

なんと言ったらいいかわからないくらいお世話になりました。
貴重な時間を割いていただいて、本当に感謝しています。
ありがとうございました!!
投稿日時 - 2002-04-04 17:32:53
  • 回答No.5
レベル14

ベストアンサー率 51% (1179/2272)

間違えました。

DoCmd.OpenForm 検索結果フォーム, acNormal, , wherecond

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

お礼率 66% (871/1309)

ありがとうございます。無事解消しました。
が!また新たにエラーが!!

名前のところに「持田」と入れてボタンをクリックすると
--------------------
実行時エラー'3075';

クエリ式'ーブル1.名前 like '*持田*')and(テーブル1.チェック欄=False)'の不要な')'があります。
--------------------
と出てしまうのです。

これは一体どこのことでしょうか?

お願いします。。。
投稿日時 - 2002-04-04 17:28:28
  • 回答No.7
レベル14

ベストアンサー率 51% (1179/2272)

まだ締め切っていないようですので。

>チェック欄のところで、両方検索できない、とありますが、
>これの両方を検索する方法というのはあるのでしょうか?

検索条件入力フォームで、条件入力をチェックボックスで行うと、チェックした・しないの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

お礼率 66% (871/1309)

No.8に対する2度目の補足です。
(見ていただけるかどうか・・・)

すいません、こちらのミスでした!
ちゃんとできました。
投稿日時 - 2002-04-05 13:23:59
お礼コメント
KODAMAR

お礼率 66% (871/1309)

何度もご登場いただき、ありがとうございます。。。

試してみました。
できました!やったー!!
と思ったのも束の間!
名前欄に「持田」と入れて、チェック欄を「全て」で検索すると
--------------------
実行時エラー'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
--------------------

申し訳ありませんが、もう一度ご教授願えませんか?
宜しくお願いします。
投稿日時 - 2002-04-05 11:00:51
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ