VBA如果过滤器显示/未显示值

时间:2017-06-28 11:30:19

标签: vba excel-vba filter excel

我一直在努力解决这个问题,并且想知道我在哪里做错了。 我有一些源数据,最后一列(AG)是一个excel函数,用于评估某些列中是否存在某些N / As。如果是,则显示“错误”,否则显示“确定”。 在我的代码中,我希望宏能够填充R到AG列中的公式(工作正常)并评估是否存在一些过滤错误。如果有一些错误,我希望它停止(以便用户看到那些过滤错误),如果只有“ok”,我想显示所有值(没有过滤器)。 这是我的代码:

Sub macro()
With Worksheets("Source")
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
End With

Sheets("Source").Select
Range("R2:AG2").Select
Selection.AutoFill Destination:=Range("R2:AG" & LastRow)

ActiveSheet.Range("$A$1:$AG$" & LastRow).AutoFilter Field:=33, Criteria1:="error"

Counter = Range("$A$1:$AG$" & 
LastRow).SpecialCells(xlCellTypeVisible).Rows.Count
If Counter = 1 Then
ActiveSheet.Range("$A$1:$AG$" & LastRow).AutoFilter Field:=33
Else
End If

End Sub

这个想法是,如果计数器(可见行数,所以只有标题)等于1,则没有错误,应该禁用过滤器,如果有其他可见行,则过滤器停留(空白)在“else”语句之后,用户然后看到那些错误。 问题是,即使存在一些错误,计数器也始终为1。

1 个答案:

答案 0 :(得分:0)

这是因为SpecialCells(xlCellTypeVisible)是多区域范围,因此.Rows.Count将仅返回第一个区域中的行数!

您需要滚动区域并将它们的行数相加。

Dim area As Range
For each area in Range("$A$1:$AG$" & LastRow).SpecialCells(xlCellTypeVisible)
  counter = counter + area.Rows.Count
Next

或者,由于您只想检查是否所有内容都已过滤,只需检查一个双重条件:仅一个区域和一行:

With ActiveSheet.Range("$A$1:$AG$" & LastRow).SpecialCells(xlCellTypeVisible)
  If .Areas.Count = 1 And .Rows.Count = 1 Then
    'All is filtered ! no error, remove filter
    Range("$A$1:$AG$" & LastRow).AutoFilter
  End If
End with

还有第三种方式,甚至更简单:

With ActiveSheet.Range("$A$1:$AG$" & LastRow)
  .AutoFilter Field:=33, Criteria1:="error"
  If .SpecialCells(xlCellTypeVisible).Count = .Columns.Count Then .AutoFilter 'no error
End with