#474 フォームを参照するクエリを使ったフォームのフィルタの注意点 フォーム、VBA

抽出処理を行うフォームでは、「抽出条件をフォーム上のコントロールから取得しそれをWhere条件とするクエリをレコードソースとする」という方法がよく使われます。
たとえば、下図の場合、「frm商品」フォーム上の「cbo抽出仕入先」というコンボボックスの値をWhere条件としたクエリを使っています。

クエリ:
クエリのデザイン
フォーム:コンボボックスに合わせてフォームにフィルタがかかります
実行結果
フォームのコード:

Private Sub cbo抽出仕入先_AfterUpdate()
'[仕入先の抽出条件]コンボボックスの更新後処理

  'フォームを再クエリ
  Me.Requery

End Sub



このような形式のフォームにおいて、VBAを使ってさらにそれにフィルタを掛ける場合があります。たとえば、「単価」フィールドの値が、「txt抽出単価」テキストボックスに入力された金額以上のレコードをさらに抽出するには、次のようなコードを実行します。

Private Sub cmd単価抽出_Click()
'[単価抽出]ボタンクリック時

  With Me
    .Filter = "単価 >= " & Me!txt抽出単価
    .FilterOn = True
  End With
  
End Sub


このようなフィルタ処理は、上述のようなクエリを使ったフォームでも動作します。下図では、仕入先が”三友”であるレコードをコンボボックスで抽出したあと、さらに単価が”2000円”以上のレコードのみを抽出しています。
さらに単価で抽出


しかし問題は、フィルタの解除処理です。通常は次のようなコードを実行することによってフィルタを解除できるのですが、フォーム上のコントロールをWhere条件とするクエリをレコードソースにしているフォームでは、それと同時にクエリのWhere条件も無視されるようになってしまい、以降、クエリで設定された抽出処理が実行されなくなってしまいます。

Private Sub cmd抽出解除_Click()
'[抽出解除]ボタンクリック時

  With Me
    .Filter = ""
    .FilterOn = False
  End With

End Sub


[抽出解除]ボタンクリックでいったんすべてのレコードが表示されるのですが.....
[抽出解除]ボタンをクリック
コンボボックスを切り替えてもそれがフォームに反映されません
コンボボックスを切り替え後


それを回避するためには、フィルタを解除する際、まず「FilterOn」プロパティは”False”にしないようにします。もちろんこれではフィルタが掛ったままになってしまいますので、「Filter」プロパティに「レコードソースの全レコードが抽出されるようなWhere条件を指定する」ようにします。つまり、『フィルタを解除するのではなく、全レコード抽出のフィルタを実行する』わけです。

これを実際にプログラムで表わすと次のようになります。ここでは、「商品コード」フィールドには0以下の値が設定されることはないということが前提となります。

Private Sub cmd抽出解除_Click()
'[抽出解除]ボタンクリック時

  With Me
    .Filter = "商品コード > 0"
    .FilterOn = True
  End With

End Sub


実行結果:今度はコンボボックスの切り替えが反映されています。
実行結果
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved