Excel VBA-如果自动筛选不包含任何记录,则MsgBox
我试图过滤一个特定的条件,在这种情况下,类似于-服务代码,我在列名中过滤它,而不是用a:a表示的列。代码的第一部分工作正常,If语句就是我遇到问题的地方。我创建了If语句,以便在有实际数据行显示服务代码过滤器时能够执行某些操作。在本例中,如果至少有一行被过滤,那么它应该显示“数据”。问题是,即使过滤时没有显示任何内容,它也会显示“数据”消息 我试图弄明白,当没有与筛选条件匹配的内容时,如何正确显示无数据的消息 谢谢,Excel VBA-如果自动筛选不包含任何记录,则MsgBox,excel,vba,Excel,Vba,我试图过滤一个特定的条件,在这种情况下,类似于-服务代码,我在列名中过滤它,而不是用a:a表示的列。代码的第一部分工作正常,If语句就是我遇到问题的地方。我创建了If语句,以便在有实际数据行显示服务代码过滤器时能够执行某些操作。在本例中,如果至少有一行被过滤,那么它应该显示“数据”。问题是,即使过滤时没有显示任何内容,它也会显示“数据”消息 我试图弄明白,当没有与筛选条件匹配的内容时,如何正确显示无数据的消息 谢谢, Sub Filter results() Dim rng As Range,
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()
您可以使用
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
子过滤器结果()
作为变体的Dim-res
使用ActiveSheet.Rows(1)
res=Application.Match(“错误”,.Cells,0)
如果不是IsError(res),则
.AutoFilter字段:=res,标准1:=*-服务代码*
如果Application.WorksheetFunction.Subtotal(103,.Resize(,1))>1,那么使用代码,我定义了使用范围的最后一行(假设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
所以你总是在rng
中有单元格?如果是这样,Count
函数返回单元格的数量,而不管其中是否包含数据?不确定,只是一个建议。您能评论一下rng.SpecialCells(xlCellTypeVisible)
返回的内容吗?看起来rng
是标题行,因此它总是可见的,并且总是返回超过1。将正在计数的可见单元格的范围更改为A:A
,它应该可以正常工作。@AER Hello,如果条件不匹配,它只返回标题行。进行了编辑,测试并在我的机器上运行:.cells.count
这起作用了,我必须更改计数后的数字以与列的编号相关联,在这种情况下,U列为“21”。接下来的问题是,有没有一种基于列名的方法来实现这一点?这些列经常更改,当新用户使用报告时,我希望维护最少,因此,没有引用列U1:U,有方法按名称引用它吗?非常感谢您的帮助。移动了lrow
计算并使其影响res
列号,它现在将最后一条错误消息计为最后一行,但由于这就是您要查找的全部内容,因此它可以正常工作。if语句已被修改为对列res
也进行计数。在lrow中添加+1可在列中完全没有数据的情况下停止错误。非常感谢你@洛克特先生,你试过这个吗?