2016-12-06 288 views
3

我想篩選一個特定條件,在這種情況下任何類似服務代碼我正在篩選此列內的名稱,而不是A:一個。代碼的第一部分工作正常,If語句就是我遇到問題的地方。我創建了If語句,如果有一個實際的數據行顯示爲-SERVICE CODE的過濾器,那麼在這種情況下,如果至少有一行被過濾,它應該顯示「Data」問題在於即使Filtered時沒有顯示任何內容,它也會顯示「Data」消息。Excel VBA - 如果自動篩選器不包含任何記錄,MsgBox

我想弄清楚如何沒有數據的消息顯示正確,當沒有什麼是符合篩選條件。

謝謝

Sub Filter results() 

Dim rng As Range, res As Variant 

Set rng = ActiveSheet.AutoFilter.Range.Rows(1) 
res = Application.Match("Errors", rng, 0) 
rng.AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 

If rng.SpecialCells(xlCellTypeVisible).Count > 1 Then 
    MsgBox "Data" 
Else 
    MsgBox "No Data" 
End If 

End Sub() 
+0

所以你總是在'rng'中有單元格?如果是這樣的話,Count函數返回單元格的數量,而不管它們中是否有數據?不確定,只是一個建議。你可以評論'rng.SpecialCells(xlCellTypeVisible)'返回什麼? – AER

+0

看起來'rng'是標題行,因此它總是可見的,並且總是返回大於1.將您正在計數的可見單元格的範圍更改爲'A:A',它應該可以正常工作。 –

+0

@AER你好,它只返回標題行,如果條件沒有匹配。 – MrLockett

回答

1

使用代碼的重構,我定義了使用範圍的最後一行(假設總有在列A中的數據,改變爲其它C如果不是,則任何超出最後一行的單元格都將顯示爲可見。然後,可視計數只在該列上執行,直到最後一行。

Sub FilterResults() 

Dim rng As Range, res As Variant, lrow As Long 

Set rng = ActiveSheet.AutoFilter.Range.Rows(1) 
res = Application.Match("Errors", rng, 0) 
rng.AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 

lrow = ActiveSheet.Cells(Rows.Count, res).End(xlUp).Row + 1 

If ActiveSheet.Range(Cells(1, res), Cells(lrow, res)).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then 
    MsgBox "Data" 
Else 
    MsgBox "No Data" 
End If 

End Sub 
+0

做了一個編輯,測試,並在我的機器上工作:'.cells.count' –

+0

這工作,我不得不改變計數之後的數字與列的數量相關聯,在這種情況下,列U是「21」 。後續問題,有沒有辦法根據列名進行這項工作?這些列經常發生變化,當新用戶使用報告時,我希望維護量最小,因此,而不是引用Columns U1:U有沒有一種方法可以按名稱引用它?非常感謝你的幫助。 – MrLockett

+0

移動'lrow'計算並使其影響'res'列號,它現在將最後一條錯誤消息計數爲最後一行,但是因爲這是您正在尋找的所有功能。 if語句已被修改以計算列「res」。 –

1

你可以使用Application.WorksheetFunction.Subtotal(103, rng.Resize(, 1))來考多少細胞已被過濾,並檢查有不止一個(頭總是得到過濾)在一列

喜歡在這個小代碼

Sub FilterResults() 
    Dim res As Variant 

    With ActiveSheet.Rows(1) 
     res = Application.Match("Errors", .Cells, 0) 
     If Not IsError(res) Then 
      .AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 
      If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then '<--| if any cell filtered other than header (which is in row 3) 
       MsgBox "Data" 
       With .SpecialCells(xlCellTypeVisible) 
        ' code 
       End With 
      Else 
       MsgBox "No Data" 
      End If 
     End If 
    End With 
End Sub 
+0

@MrLockett,你試過這個嗎? – user3598756