ACCESS超初心者です。
部署にある書籍の一覧表をACCESSのフォームで作成しています。
3つの検索条件を作成したのですが
検索結果を表示させるIf文がVBAでうまく作れません。。。
ご教授ください。
【例】
テーブル名:Tbl_Test
フィールド名:
分野 (テキスト型)
所在(テキスト型)
所有者(テキスト型)
で、テーブルを作り、
検索用フォーム(フォーム名:Frm_Test)に、非連結の
Ctl検索分野 (コンボボックス)
Ctl検索所在(リストボックス)
Ctl検索所有者(リストボックス)
を作成
「Ctl検索所在(リストボックス)」
「Ctl検索所有者(リストボックス)」
それぞれの更新後処理のイベントプロシージャに
以下の6つのパターンの場合
それぞれ別のクエリを表示させるVBAを作成したい
「分野」:未選択
「所在」:未選択
「所有者」:未選択
の場合・・・クエリ「分野絞込なしの所在所有者未選択」を表示
「分野」:未選択
「所在」:未選択
「所有者」:選択
の場合・・・クエリ「分野絞込なしの所有者選択」を表示
「分野」:未選択
「所在」:選択
「所有者」:未選択
の場合・・・クエリ「分野絞込なしの所在選択」を表示
「分野」:選択
「所在」:未選択
「所有者」:未選択
の場合・・・クエリ「分野絞込ありの所在所有者未選択」を表示
「分野」:選択
「所在」:未選択
「所有者」:選択
の場合・・・クエリ「分野絞込ありの所有者選択」を表示
「分野」:選択
「所在」:選択
「所有者」:未選択
の場合・・・クエリ「分野絞込ありの所在選択」を表示
相変わらず説明が下手で申し訳ありません。
初心者の私にとっては難しすぎて
頭がパンクしてしまいました。
よろしくお願いします!
No.3ベストアンサー
- 回答日時:
> データが連結しているとはどのような意味なのでしょうか?
私は説明べたなので以下を参照してください。
http://oshiete1.goo.ne.jp/qa57126.html
> (2)以下について意味を教えてください
以下でわかりますでしょうか。
sTmp = ""
sTmp = sTmp & OrAnd & "(AAA)"
sTmp = sTmp & OrAnd & "(BBB)"
sTmp = sTmp & OrAnd & "(CCC)"
出来上がった、sTmp の中身は、
" AND (AAA) AND (BBB) AND (CCC)" となります。
sTmp = Mid(sTmp, Len(OrAnd) + 1) とすると、
"(AAA) AND (BBB) AND (CCC)" となります。
AND ではなく OR に変更する場合、
Const OrAnd As String = " AND "
↓
Const OrAnd As String = " OR "
とするだけで、対処できます。
> (3)以下について、
> Select Case Ctl検索分野
> Case 1
> Me.RecordSource = "クエリ01"
コンボボックスの表示には、パターン番号のようなものを表示しているのでしょうか?
> If (Not IsNull(Me.Ctl検索分野)) Then
> sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')"
> End If
上記での前提として、分野そのものが表示され、連結列になっていた場合のものになります。
例えば、値集合ソースの内容が
SELECT DISTINCT 分野 FROM テーブル名 ORDER BY 分野;
リストボックスも同様に、リストボックスの値がそのまま抽出条件に使えることを前提としていました。
また、複数選択:しない となっていることが前提となっています。
> sTmp = ""
> If (Not IsNull(Me.Ctl検索分野)) Then
> sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')"
> End If
> If (Not IsNull(Me.Ctl検索所在)) Then
> sTmp = sTmp & OrAnd & "([所在]='" & Me.Ctl検索所在 & "')"
> End If
> If (Not IsNull(Me.Ctl検索所有者)) Then
> sTmp = sTmp & OrAnd & "([所有者]='" & Me.Ctl検索所有者 & "')"
> End If
>
> If (Len(sTmp) > 0) Then
> sTmp = Mid(sTmp, Len(OrAnd) + 1)
>
>'フォーム自体のレコードソースを変更する場合
> Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");"
> Me.Requery
上記方法では、クエリは使用しません。
クエリに書いてあるものを、状況に応じて作成し、設定することになります。
ここで、クエリ自体が不要になるのか考えるところです。
そのクエリを使ってレポートに、とか、外部出力(ExcelやCSVなど)に使うとか。
>「フォーム自体のレコードソースを変更する場合」
> で自分なりに色々やってみたのですがうまくいきません。。。
今まで作成したクエリを、デザインビューで開いた後、SQLビュー表示にしてみます。
その時、参照テーブル名が2つ以上あった場合、以下の部分でテーブル名を明示的に指定します。
sTmp = sTmp & OrAnd & "([テーブル名].[分野]='" & Me.Ctl検索分野 & "')"
また、
Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");"
の記述は、クエリのSQLビューを参考に、WHERE部分以外まねます。
※ 現状考えられている方向を察するに、#2の方の方法が身近かもしれません。
丁寧に教えていただいてありがとうございます!
時間はかかりましたがなんとか理解することができました。
また質問することもあると思いますが
よろしくおねがいします!
No.2
- 回答日時:
今回ご質問の件に関しては、No.1の方の回答のように、レコードソースか
フィルタ式をVBA上で直接編集してしまった方が楽なのですが・・・
「頭がパンクしてしまいました」とのことなので、場合分けの仕方の参考
としての回答をします。
Private Sub ReflectSelect()
Dim rsl As Integer, strQry As String
'IsNull関数により、選択状況を確認(未選択で-1、選択済で0が返される)
'※下の「 * 1」は表記形式を揃えるためだけに入れています(=省略可)
rsl = - (IsNull(Ctl検索分野) * 1 + IsNull(Ctl検索所在) * 2 + IsNull(Ctl検索所有者) * 4)
Select Case rsl '全部で8パターン(【追加】の2件は不要?)
Case 0 '未選択なし(=-{(0*1)+(0*2)+(0*4)})
strQry = "分野絞込ありの所在所有者選択" '【追加】
Case 1 '分野のみ未選択(=-{(-1*1)+(0*2)+(0*4)})
strQry = "分野絞込なしの所在所有者選択" '【追加】
Case 2 '所在のみ未選択(=-{(0*1)+(-1*2)+(0*4)})
strQry = "分野絞込ありの所有者選択"
Case 3 '分野・所在が未選択(=-{(-1*1)+(-1*2)+(0*4)})
strQry = "分野絞込なしの所有者選択"
Case 4 '所有者のみ未選択(=-{(0*1)+(0*2)+(-1*4)})
strQry = "分野絞込ありの所在選択"
Case 5 '分野・所有者が未選択(=-{(-1*1)+(0*2)+(-1*4)})
strQry = "分野絞込なしの所在選択"
Case 6 '所在・所有者が未選択(=-{(0*1)+(-1*2)+(-1*4)})
strQry = "分野絞込ありの所在所有者未選択"
Case 7 'すべて未選択(=-{(-1*1)+(-1*2)+(-1*4)})
strQry = "分野絞込なしの所在所有者未選択"
Case Else
MsgBox "不明", , "Error"
End Select
Me.RecordSource = strQry
End Sub
・・・以上、参考まで。
(なお、推奨されるのは、あくまでNo.1の方の方法です)
ご回答ありがとうございました!
caseの使い方ってこうゆうふうになってるんですね!!
フォームの別の部分でもっと単純なcaseを使用したVBAを
わけもわからずコピペで使っていましたが
今回この回答をいただいたおかげで
理解することができとてもうれしいです!
また質問することもあると思いますが
その際はよろしくお願いします!
No.1
- 回答日時:
実際に動かした検証していないので、雰囲気だけでも
コンボ/リストボックスがクリックされた時に、有効なものだけを使って抽出条件を作ります。
(表示するデータは連結していることが前提です)
Private Sub WhereMakeSet()
Dim sTmp As String
Const OrAnd As String = " AND "
sTmp = ""
If (Not IsNull(Me.Ctl検索分野)) Then
sTmp = sTmp & OrAnd & "([分野]='" & Me.Ctl検索分野 & "')"
End If
If (Not IsNull(Me.Ctl検索所在)) Then
sTmp = sTmp & OrAnd & "([所在]='" & Me.Ctl検索所在 & "')"
End If
If (Not IsNull(Me.Ctl検索所有者)) Then
sTmp = sTmp & OrAnd & "([所有者]='" & Me.Ctl検索所有者 & "')"
End If
If (Len(sTmp) > 0) Then
sTmp = Mid(sTmp, Len(OrAnd) + 1)
'フォーム自体のレコードソースを変更する場合
Me.RecordSource = "SELECT * FROM テーブル WHERE (" & sTmp & ");"
Me.Requery
'フォームの Filter 機能を使う場合
Me.Filter = sTmp
Me.FilterOn = True
Else
'フォーム自体のレコードソースを変更する場合
Me.RecordSource = "SELECT * FROM テーブル;"
Me.Requery
'フォームの Filter 機能を使う場合
Me.FilterOn = False
Me.Filter = ""
End If
End Sub
Private Sub Ctl検索分野_Click()
Call WhereMakeSet
End Sub
Private Sub Ctl検索所在_Click()
Call WhereMakeSet
End Sub
Private Sub Ctl検索所有者_Click()
Call WhereMakeSet
End Sub
ご回答ありがとうございます!
「フォーム自体のレコードソースを変更する場合」
で自分なりに色々やってみたのですがうまくいきません。。。
こちらかなりの初心者のため理解できない部分が多いせいで
VBAをうまく編集できていないのだと思います。
参考書やネットで色々調べてみたのですが
やっぱり分からないところだらけでした。。
以下の部分について詳細教えていただけると助かります!
(1)初っぱなですが以下の一文
「(表示するデータは連結していることが前提です)」
データが連結しているとはどのような意味なのでしょうか?
(2)以下について意味を教えてください!
(何をしようとしているのかが分かりません。。)
・Dim sTmp As String
Const OrAnd As String = " AND "
・If (Len(sTmp) > 0) Then
sTmp = Mid(sTmp, Len(OrAnd) + 1)
(3)以下について、
Private Sub Ctl検索分野_Click()
Call WhereMakeSet
End Sub
Private Sub Ctl検索所在_Click()
Call WhereMakeSet
End Sub
Private Sub Ctl検索所有者_Click()
Call WhereMakeSet
End Sub
現在のところ
コンボボックスについては
Private Sub Ctl検索分野_Click()
Select Case Ctl検索分野
Case 1
Me.RecordSource = "クエリ01"
Case 2
Me.RecordSource = "クエリ02"
・
・
・
リストボックスについては
Private Sub Ctl検索所在_AfterUpdate()
Me.RecordSource = "クエリ03"
Private Sub Ctl検索所有者_AfterUpdate()
Me.RecordSource = "クエリ04"
というように検索結果を表示させるよう
それぞれVBAを作成してあるのですが
それらについてはすべて必要なくなるということなのでしょうか・・??
そもそも
Dim sTmp As String
Const OrAnd As String = " AND "
についてまったく理解できていないので
VBAをどのように編集していったらいいかが分かりません。。。
ご教授お願いいたします!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access 複数条件検索の設定が上手く行きません 1 2022/07/22 20:37
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- Amazon Amazonコンビニ受け取り AmazonでSwitchのソフトの予約商品をコンビニ受け取りにして注 1 2022/03/31 15:45
- 確定申告 確定申告をe-Tax(スマホ)で行う時の入力方法について 1 2023/02/12 15:38
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- USBメモリー・SDカード・フラッシュメモリー メディアプレーヤーの字幕データ読み込みについて。 3 2023/08/16 13:14
- 年賀状作成・はがき作成 エクセルで作った住所録をワードの差し込み印刷ではがきに印刷したい 3 2022/09/26 15:47
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Androidのスマホで毎回毎回ホー...
-
エクセルである行以下全部を削...
-
EXCEL VBAで全選択範囲の解除
-
ipadのpagesでMS明朝を使う方法...
-
「無」と「未」の使い方
-
VBAでファイルを開くときにファ...
-
教えてgooのマイカテゴリを一つ...
-
「これが」「これで」いいです...
-
Simejiで作ったきせかえを消す...
-
言語の選択や国の選択をする時...
-
初心者です! カテゴリを選択出...
-
教えてgooのマイカテゴリを一つ...
-
EXCELピボットテーブル(複数ア...
-
Excel VBA あるセルでENTERを押...
-
WORDでテキストを全て選択し一...
-
リストボックス(複数選択しな...
-
ACアダプターの選択について
-
Keepaの使い方に付いての質問で...
-
Wordでドロップダウンリスト連動
-
Word差込印刷で「テーブルを選...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルである行以下全部を削...
-
EXCEL VBAで全選択範囲の解除
-
Androidのスマホで毎回毎回ホー...
-
VBAでファイルを開くときにファ...
-
Excel VBA あるセルでENTERを押...
-
ipadのpagesでMS明朝を使う方法...
-
「無」と「未」の使い方
-
Excel 行列が選択出来ない
-
Jw-cadの範囲指定で文字が選択...
-
「これが」「これで」いいです...
-
Google Earth Pro(グーグルア...
-
Excel VBAでn行毎に行の選択
-
シフトキーを使った範囲選択が...
-
Excel2003にて(ツール→オプシ...
-
Wordでドロップダウンリスト連動
-
Simejiで作ったきせかえを消す...
-
大至急!
-
戸惑う、惑うの違いはなんですか。
-
Word差込印刷で「テーブルを選...
-
ピボットテーブル 矢印が出な...
おすすめ情報