#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 実行結果:今度はコンボボックスの切り替えが反映されています。 |
|||
|
Copyright © T'sWare All rights reserved |