スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

Filter / FilterOn の順って 


VBA で Filter を設定する時、Filter / FilterOn の記述順ってあるのだろうか。

私は今まで
  If (Len(sWhereCondition) = 0) Then
    Me.FilterOn = False
    Me.Filter = ""
  Else
    Me.Filter = sWhereCondition
    Me.FilterOn = True
  End If
って記述してきたのですが、

    Me.Filter = sWhereCondition
    Me.FilterOn = True
で、こと足りそうです。

追記あり 2012/6/9
 
kEnt104
の様な確認用フォームを作りました。
ヘッダ部のラベルの背景色がケバイのですが、Form_Current が呼ばれる毎に変更しました。
(一応レコードがあるので、再クエリで呼ばれるはず・・・)

右上のボタンは、次のボタンをクリックした時に FilterOn に設定する True / False を選択しておきます。
「Filter設定」では、左で選んだ「グループ」「氏名部分」を使って、Filter を設定します。

ここで記述した VBA は以下
Dim iCnt As Long

Private Sub btn1_Click()
  Me.cbx1 = Null
  Me.txt1 = Null
  Me.tg1 = False
  Me.Filter = ""
  Me.FilterOn = False
End Sub

Private Sub btn2_Click()
  Me.FilterOn = Me.tg1
End Sub

Private Sub btn3_Click()
  Dim sWhere As String
  Const sAndOr As String = " AND "

  sWhere = ""
  If (Not IsNull(Me.cbx1)) Then
    sWhere = sWhere & sAndOr & "グループ = " & Me.cbx1
  End If
  If (Not IsNull(Me.txt1)) Then
    sWhere = sWhere & sAndOr & "氏名 Like '*" & Me.txt1 & "*'"
  End If
  Me.Filter = Mid(sWhere, Len(sAndOr) + 1)
End Sub

Private Sub ColSet(iC As Long)
  Dim ctl As Control

  For Each ctl In Me.Section(acHeader).Controls
    With ctl
      If (.ControlType = acLabel) Then
        .BackColor = iC
      End If
    End With
  Next
End Sub

Private Sub Form_Current()
  Dim iCary() As Variant

  iCary = Array(RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255), RGB(100, 100, 100))
  iCnt = iCnt + 1
  Call ColSet(CLng(iCary(iCnt Mod (UBound(iCary) + 1))))
End Sub

これでやってみて、

Filter = ""
と設定すると、FilterOn = False に自動変更され、FilterOn = True にできない。

FilterOn = True の時には、Filter = XXXX を設定した時に再クエリされる。
また、さらに FilteOn = True しても何も起こらない。

・・・・・
なので、極論的には
    Me.Filter = sWhereCondition
    Me.FilterOn = True

sWhereCondition = "" の時には FilterOn は自動で False になり、True にできない。

sWhereCondition <> "" の時には、
FilterOn = True であったのなら、その時点で再クエリが起こる。
が、次の FilterOn = True では、何も起きない。
FilterOn = False であったのなら、次の FilterOn = True で再クエリされる。

ってな感じに見えたけど・・・・・


あ、そうそう
順ですが、
    Me.FilterOn = True
    Me.Filter = sWhereCondition
ってことをやったら、
これをやる前に Filter = "" だったら FilterOn = True にできないので・・・・後は想像できますね

でも、今までの書き方を変えることはしないかな・・・・・

サンプルは以下
 バージョン 20002003 (2002)2007
 ファイル kEnt104_2000.zipkEnt104_2003.zipkEnt104_2007.zip
 サイズ 19,88020,00618,183
※ ファイルは zip 形式
※ 2007 以外は、2007 保存時に変換 & 各バージョンで動作確認 & 最適化


追記 2012/6/9

確認漏れだったと思います。
上記は 2007 での動きをまとめたもので、後日確認していたら以下が判明しました。

Me.Filter = "" でかつ Me.FilterOn = False の時、Me.FilterOn = True を代入した場合、
Access 2007 では、Me.FilterOn = True になることはありませんでした。
2000 / 2003 では、Me.FilterOn = True に設定されてしまいます。( Me.Filter = "" なのに)
仕様がどちらなのかわかりませんが、2007 の動きの方が私にはシックリきます。
この辺の動きが違っているとは思っていなかったし、確認していたつもりが、していなかった・・・

ご自分の環境でしっかりと検証してください。
関連記事

2011/11/26

Category: サンプルかな

TB: 0  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △

トラックバック

トラックバックURL
→http://kikutips.blog13.fc2.com/tb.php/104-9d460b3c
この記事にトラックバックする(FC2ブログユーザー)

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。