2017-05-26 1 views
0

フィルタリング後にレコードがない場合、VBAを使用してDatagridviewのフィルタを無効にするにはどうすればよいですか?ここでAccess 2010 - エラー処理フィルタサブフォーム

私の最初の試み:最初のコードは、「作品」が、3061は最終的にではない、私はエラーを取得する第二のコードで

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer) 
    Dim rs As DAO.Recordset 

    Set rs = Me.RecordsetClone 
    rs.Filter = Replace(Me.Filter, "[Tabelle1].", "") 
    Set rs = rs.OpenRecordset() 

    If rs.EOF Then 
     Cancel = True 
    End If 
End Sub 

:ここ

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer) 
    If Me.RecordsetClone.RecordCount = 0 Then 
     MsgBox ("Kein Datensatz gefunden. Filter wird entfernt.") 
     Me.Form.FilterOn = False 
     Me.Form.Requery 
    End If 
End Sub 

は2回目の試行で私は必要としたい。

理由:

私は3つのフォームを持っています。 MAIN、Sub1およびSub2。

MAINには、Sub1、Sub2、および単一のTextBoxがあります。 TextBoxは "psoudoID"と呼ばれます。 Sub1は、さまざまなレコードセットの詳細を表示する通常のFormで、MAINの上部に配置されます。 Sub1の下はSub2です。 Sub2はDatagridviewです。ユーザーがSub2のレコードセットをクリックすると、Sub2からのIDはpsoudoIDに、そしてそこからSub1に移動します。分かるでしょう?

ここで、ユーザーはDatagridのすべての列をフィルタリングして、ここで必要なレコードセットを見つけ出し、上のすべての詳細を示すことができます。しかし、フィルタリング後にDataGridが空の場合、Sub2はpsoudoIDにIDを与えることができず、Sub1はMAINにもっと長く表示されません。その場所の画面は空です。グリッドの[フィルタ]ボタンをクリックすると、Sub1が画面上に再び表示されます。

MsgBoxの[OK]をクリックしてフィルタを無効にするか、グリッドビューの[フィルタ]ボタンをクリックせずにフィルタを無効にします。

私の賛否両論を理解できたら幸いです。そして私の悪い英語のために申し訳ありません:-)

THX。

ベジータ

+0

最初の行でエラー3061が発生するのは、どの行ですか? 'Me.FilterOn'を' False'に設定したり、 'Cancel'を' True'に設定する代わりにフィルタを修正する理由はありますか? ( 'Cancel'は現在のフィルタアクションをキャンセルし、もしあれば前のフィルタに戻り、' Me.FilterOn = False'はフィルタをオフにします、 'Cancel'はあなたが望むものに対して適切です) –

+0

最初のコードが動作します。しかし、私は正しい場所でそれを "発射"できません。エラー3061は2番目のコードにあります。交換時に。 –

+0

'Set rs = rs.OpenRecordset()'を 'Dim rsf As Recordset_ Set rsf = rs.OpenRecordSet'に置き換えてみてください。それは役に立ちますか? –

答えて

0

私はあなたがフィルタがNullであること、及びフィルタの前にMe.Filterを使用して実際に適用されるとの問題を抱えていると信じています。また、オブジェクトをプロパティ/メンバ自体に再割り当てすると、以前は問題が発生していました。そのため、これを回避しようとしています。

次は動作するはず

Dim strOldFilter As String 
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer) 
    Me.TimerInterval = 50 
    strOldFilter = Nz(Me.Filter, "") 
End Sub 

Private Sub Form_Timer 
     Me.TimerInterval = 0 
     If Me.Filter = strOldFilter Then Exit Sub 
     Dim rs As DAO.Recordset 
     Dim strFilter As String 
     strFilter = Nz(Me.Filter, "") 
     If strFilter = "" Then 
      'Handle this specific scenario 
      Exit Sub 
     End if 
     Set rs = Me.RecordsetClone 
     rs.Filter = Replace(strFilter, "[Tabelle1].", "") 
     Dim rsf as DAO.Recordset 
     Set rsf = rs.OpenRecordset 

     If rsf.EOF Then 
      Me.Filter = strOldFilter 
     End If 
End Sub 

注意あなたが0の記録が得られ、他のフィルタに0レコードに結果のフィルタを変更する(しかし、あなたはいけない場合は50msec毎に繰り返して無限ループを引き起こす可能性関数が機能する場合は0レコードになるフィルタを持つことができます)

+0

このエラーはもう発生しません。しかし、あなたが書いたように、Loopには時間がかかります。私はそれをしばらく試してから、私はあなたに答えます。 THX。 –

+0

それは混乱している!私は両方のコードを使用すると、適切な値(既存のレコードセットへのユーザーフィルタ)で動作します。しかし、私が間違った値でフィルタリングすると、Access-Messageは出ません!グリッドは空です。 私は2番目のコードのみを使用します。既存の値でフィルタリングするとAccess-Msgが来る。しかし、値を適切な値に変更すると、タイムラグがあり、Access-Msgは何度も繰り返されます。 2番目のコードを見て、 "Exit Exit Function"を "Exit Sub"に変更する必要があります。 –

+0

あなたは 'Exit Sub'であるべき' Exit Function'について正しいです。それ以降のエラーは修正されましたか? –