Excel VBA – 如果自动筛选器包含没有logging,MsgBox

我试图过滤一个特定的标准,在这种情况下, 任何东西像服务代码我正在过滤列名称,而不是列A:A表示。 代码的第一部分工作正常,If语句是我有问题的地方。 我创build了If语句,如果有一个实际的数据行显示了-SERVICE CODE的filter,那么在这种情况下,如果至less有一行被过滤,它应该显示“Data”问题在于,即使在过滤时没有显示任何内容,它也会显示“数据”消息。

我想弄清楚如何没有数据的消息正确显示,当没有什么是符合筛选条件。

谢谢,

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() 

使用你的代码,我定义了你已经使用的范围的最后一行(假设A列中总是有数据,如果没有,则更改为另一列),因为超出最后一行的任何单元格都将显示为可见。 然后可见计数只在该列上执行,直到最后一行。

 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 

您可以使用Application.WorksheetFunction.Subtotal(103, rng.Resize(, 1))来testing有多less个单元格已被过滤,并检查列中是否有不止一个(标题总是被过滤)

就像在你的代码的这个小重构中一样

 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