我一直在努力解决这个问题,并且想知道我在哪里做错了。 我有一些源数据,最后一列(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。
答案 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