Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-如果自动筛选不包含任何记录,则MsgBox_Excel_Vba - Fatal编程技术网

Excel VBA-如果自动筛选不包含任何记录,则MsgBox

Excel VBA-如果自动筛选不包含任何记录,则MsgBox,excel,vba,Excel,Vba,我试图过滤一个特定的条件,在这种情况下,类似于-服务代码,我在列名中过滤它,而不是用a:a表示的列。代码的第一部分工作正常,If语句就是我遇到问题的地方。我创建了If语句,以便在有实际数据行显示服务代码过滤器时能够执行某些操作。在本例中,如果至少有一行被过滤,那么它应该显示“数据”。问题是,即使过滤时没有显示任何内容,它也会显示“数据”消息 我试图弄明白,当没有与筛选条件匹配的内容时,如何正确显示无数据的消息 谢谢, Sub Filter results() Dim rng As Range,

我试图过滤一个特定的条件,在这种情况下,类似于-服务代码,我在列名中过滤它,而不是用a:a表示的列。代码的第一部分工作正常,If语句就是我遇到问题的地方。我创建了If语句,以便在有实际数据行显示服务代码过滤器时能够执行某些操作。在本例中,如果至少有一行被过滤,那么它应该显示“数据”。问题是,即使过滤时没有显示任何内容,它也会显示“数据”消息

我试图弄明白,当没有与筛选条件匹配的内容时,如何正确显示无数据的消息

谢谢,

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可在列中完全没有数据的情况下停止错误。非常感谢你@洛克特先生,你试过这个吗?