2017-04-07 6 views
1

"after_update"を実行するフィルター検索を作成したフォームがあります。フィルタにレコードがない場合、フォームは失敗し、空白になります。これを回避するために、私は "RecordCount"を追加し、それが< 1または= 0でない場合に "if"ステートメントを使用してフィルタをトリガすることを推奨するいくつかの投稿を見つけました。私の問題は、RecordCountの値が、現在のフィルタではなく、最後に実行されたフィルタの選択肢からレコード数を表示しているようです。私はいくつかのメソッドを "再クエリ"しようとしていると、フィルタが適用された後のRecordCountの値を更新するが、私はそれを動作させるように更新することはできません。VBAフィルターにアクセスするRecordCountが値を正しく更新しない

例:

フィルタ1:14件のレコードでの結果、のDebug.PrintのRecordCountディスプレイ1つの

フィルタ2:22件のレコードでの結果、14

フィルタ3を表示したRecordCountのDebug.Print

Private Sub ApplyFilterBtn_Click() 
On Error GoTo Err_ApplyFilterBtn_Click 

Dim stFilter As String 

stFilter = "" 

If Nz(Me.FilterOwner, "") <> "" Then 
    stFilter = stFilter & "[MachineOwner] = " & Me.FilterOwner & " AND " 
End If 

If Nz(Me.FilterType, "") <> "" Then 
    stFilter = stFilter & "[MachineType] = " & Me.FilterType & " AND " 
End If 

If Nz(Me.FilterSubType, "") <> "" Then 
    stFilter = stFilter & "[MachineSubType] = " & Me.FilterSubType & " AND " 
End If 

If Nz(Me.FilterMake, "") <> "" Then 
    stFilter = stFilter & "[Make] Like '" & Me.FilterMake & "' AND " 
End If 

If Nz(Me.FilterModel, "") <> "" Then 
    stFilter = stFilter & "[Model] Like '*" & Me.FilterModel & "*' AND " 
End If 

If Nz(Me.FilterSN, "") <> "" Then 
    stFilter = stFilter & "[SN] Like '" & Me.FilterSN & "' AND " 
End If 

If Nz(Me.FilterStatus, "") <> "" Then 
    stFilter = stFilter & "[NewStatus] = " & Me.FilterStatus & " AND " 
End If 



If stFilter <> "" Then 
    stFilter = Left(stFilter, Len(stFilter) - 5) 'Remove the extra AND 

'<<<<<<<Issue starts here<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    Me.Recordset.Clone 

     Me.RecordsetClone.Filter = stFilter 
     Me.RecordsetClone.MoveLast 
'  Me.RecordsetClone.MoveNext 'Tried this - did not help 
'  Me.RecordsetClone.Requery 'tried this - did not help 

'  Me.Filter = stFilter ' Tries this - did not help 

     'debugging to see value of RecordCount 
     Debug.Print stFilter 
     Debug.Print Me.RecordsetClone.RecordCount 

'>>>>>> Recordsetclone.RecordCount value not refreshing properly above, shows previously called filter record count 

    If Me.RecordsetClone.RecordCount < 1 Then ' no records, don't filter 
     'If Not (Me.RecordsetClone.BOF And Me.RecordsetClone.EOF) Then 'work around attempt 2 - failed 
     'If Me.NoMatch Then            'Work around Attempt 3 - failed 
      RemoveFilterBtn_Click ' Call sub that Clears filter 
      MsgBox "Filter Results in No records", vbOKOnly, "No Results" 
     Else ' there are records, turn on filter 
      Me.Filter = stFilter 
      Me.FilterOn = True 
     End If 'Me.RecordCount < 1 
    Else 
     Me.FilterOn = False 
     RemoveFilterBtn_Click ' Clears filter 
    End If 'stFilter <> "" 

Exit_ApplyFilterBtn_Click: 
     Exit Sub 

Err_ApplyFilterBtn_Click: 
     MsgBox Err.Description 
     Resume Exit_ApplyFilterBtn_Click 

End Sub 


Private Sub RemoveFilterBtn_Click() 
On Error GoTo Err_RemoveFilterBtn_Click 

    'Sets Filter Field Values to Blank 
    Me.FilterOwner = "" 
    Me.FilterType = "" 
    Me.FilterMake = "" 
    Me.FilterModel = "" 
    Me.FilterSN = "" 
    Me.FilterStatus = "" 
    Me.FilterSubType = "" 

    'Removes Filter 
    Me.Filter = "" 
    Me.FilterOn = False 

Exit_RemoveFilterBtn_Click: 
    Exit Sub 

Err_RemoveFilterBtn_Click: 
    MsgBox Err.Description 
    Resume Exit_RemoveFilterBtn_Click 

End Sub 
::0記録、フォームが失敗し、22

コードが表示されたRecordCountます。Debug.Printでの結果

+1

rs.MoveLastはTHEN :) –

+0

私はあなたが何を意味するかわからないがrs.recordcount。 recordsetclone.recordcountは.MoveLastの後にありますか? – Kelly

+0

レコードがない場合、 'MoveLast'は失敗します。だから... – Gustav

答えて

0

それは簡単ですが、あなたは右の構文が必要です

Dim rst As DAO.Recordset 
Dim rstFiltered As DAO.Recordset 

Set rst = Me.RecordsetClone 
rst.Filter = stFilter 

Set rstFiltered = rst.OpenRecordset() 
If rstFiltered.RecordCount > 0 Then 

    ' Do stuff. 

End If 
rstFiltered.Close 

Set rstFiltered = Nothing 
Set rst = Nothing 
+0

ありがとうございます!この解決法はうまくいくと思われる。以前は "OpenRecordset"を使っていなかった。私はそれが何をしているのか分からないが、その行動が正しいことを知っている! – Kelly

+0

素晴らしい!それから答えてください。 – Gustav

関連する問題