Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2016)
VBAを使用した複数条件下での全件抽出の方法
投稿日時: 22/12/22 21:21:34
投稿者: tomachan

お世話になります。
 
VBAを使用した複数条件下での全件抽出の方法についてです。
 
 
例えば
書籍の販売実績を検索・抽出するフォームだとします。
 
販売日(テキストボックス)  販売した日付を入力
購入者(コンボボックス)   購入者の年齢層をプルダウンで選択
・10〜20代
・30〜40代
・50〜60代
・70代〜
・(空白) 
 
(空白)はちょっと事情があり敢えて設けています。
 
 
販売日を入力して購入者を選んで検索実行すると
その日、その年代のデータが抽出できます。
 
希望としましては
販売日を入力して購入者を選択しなかった場合に
(空白)を含めた全年代のデータを抽出したいのですが
うまく作れません。
 
検索実行のVBAの記述ですが
 
If IsNull(販売日) then
else
Filter = Filter and 販売日=入力した日付
End If
 
If IsNull(購入者) then
else
Filter = Filter and 購入者=選択した年代
End If
 
として、最後にRunSQLを実行しています。
 
このようなVBAの記述に全件を抽出するためには
どのようなコードを書いていけばいいでしょうか。
 
ご指南よろしくお願い致します。

回答
投稿日時: 22/12/23 08:15:31
投稿者: Suzu

Null と (空白) は 別です。
 
ですので、
Filter = Filter and 購入者=選択した年代
が実施され、購入者が (空白) である レコードを抽出しているのではないでしょうか。
 
 
IsNull の 判定以外に、(空白)である判定を行いましょう。

投稿日時: 22/12/24 22:37:22
投稿者: tomachan

解決しました。
 
購入年代のまったくデータのない空っぽの(空白)の検索のために
「ブランク」という項目名を設定しました。
また、IsNll以下のVBAによる検索のためのコーディングにおいて
それを頭のほうにもってくることで、空白の検索と全件の検索が可能となりました。
 
コーディング自体はとてもシンプルなものでしたが
当たり前ですが、アプリというのは書いたコードの通りに動くものなんですね。
安易に考えていましたが、奥が深いなと思いました。
 
有難うございましたm(_ _)m

回答
投稿日時: 22/12/26 14:40:17
投稿者: Suzu

引用:
解決しました。

それは何よりです。
 
 
引用:
書いたコードの通りに動くものなんですね。

それが当たり前と言えば当たり前なのですが
イメージしていた動作と違う動作の時があって、
 「なんで?」と調べると 自分の認識が間違っている事の多い事。。
 
そんな中でも、思い通りに動いたら嬉しいものですね。がんばってください。
 
 
-----------------------------------------
直接質問とは関係ないですが、
引用:
購入者の年齢層をプルダウンで選択

これは
購入時に年代を記録するのでしょうか。
それとも誕生日を登録しておいて、誕生日から計算するのでしょうか?
 
もし、誕生日から、○○代 を計算していて、そこから、10〜20代 を抽出しているなら
逆に考えた方が良いと思います。 つまり、誕生日 が ○○ 〜 ××まで のレコードを抽出
 
全レコードに対し、年代を計算 し そこから 抽出する では
・全レコードの年代計算
・そこから抽出(年代計算を行っているので 演算フィールドへはインデックスは適用されない)
となりますが
 
対象となる日付の 適用日の始まりと終わりを計算で算出しそれを、抽出条件に渡します。
これなら、年代計算は要りませんし、インデックスが適用されているなら、インデックスも適用され
抽出に要する時間が短縮できます。
 
参考にどうぞ。
Dim strFilter As String

If IsNull(Me![販売日]) = False Then
  strFilter = strFilter & " AND [入力した日付] = " & Format(Me![販売日], "\#yyyy/mm/dd\#")
End If

If IsNull(Me![購入者]) = False Then
  If Len(Me![購入者]) = 0 Then
    strFilter = strFilter & " And [選択した年代] Is Null"
  Else
    If Me![購入者] = "70代〜" Then
      strFilter = strFilter & " AND (誕生日 <=" & Format(DateAdd("yyyy", -70, Date), "\#yyyy/mm/dd\#") & ")"
    Else
      strFilter = strFilter & " AND (誕生日 BETWEEN " & _
          Format(DateAdd("yyyy", "-" & Mid(Me![購入者], 4, 2), Date + 1), "\#yyyy/mm/dd\#") & " AND " & _
          Format(DateAdd("yyyy", "-" & Mid(Me![購入者], 1, 2), Date), "\#yyyy/mm/dd\#") & ")"
    End If
  End If
End If

If Len(strFilter) > 0 Then
  strFilter = Mid(strFilter, 6)
End If

Debug.Print strFilter

トピックに返信