我的目标是创建一个过程,它始终对一个条件进行过滤(在 I 列中),但如果条件存在,则对下一个条件进行过滤(在 T 列中)。
首先,我是初学者,感谢您的耐心和理解。
这篇文章很长,因为我介绍了屏幕如何工作以及我希望它如何工作。它帮助我解释我的问题。 我想对这个简单的单元格范围实现我的程序:
因此,我们有这个单元格范围,我们需要根据条件过滤来选择一些值:
Sub Filter1()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Sheet1")
sh.AutoFilterMode = False
sh.Range("C7:U7").AutoFilter Field:=7, Criteria1:="Lukasz"
If WorksheetFunction.CountIf(sh.Range("T:T"), "Check") > 0 Then
sh.Range("C7:U7").AutoFilter Field:=18, Criteria1:="Check"
End If
End Sub
如果在 I 列中我们有值(例如“Lukasz”)并且在 T 列中我们有值“Check”,因为我的程序已创建,则它可以正常工作。
然后,这是主要问题,正如您在 I 列中看到的 Lukasz,T 列中没有“检查”值: 不幸的是,运行我的宏后,它显示空单元格,如果我们在 I 列中有名称“Lukasz”的数据,但在“数据”的 T 列中没有条件“Lukasz”的数据,我运行宏并结果是:
但是,在这种情况下,我想实现它:
因此,如果该列中没有“检查”值,我不知道如何修改或创建我的程序来停止根据标准过滤列 T。
是否可以修改我的宏或创建新的宏来实现我的目标?如果是这样,您能否修改我的程序并分享以实现我的目标?我会测试一下。
如果您能做到,我将不胜感激。
最佳答案
问题是 WorksheetFunction.CountIf(sh.Range("T:T"), "Check")
对 T 列中的所有
不仅仅是可见的。Check
进行计数
Sub Filter1()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Sheet1")
sh.AutoFilterMode = False
sh.Range("C7:U7").AutoFilter Field:=7, Criteria1:="Lukasz"
Dim FilteredRange As Range 'get only visible cells in column T
Set FilteredRange = sh.Range("T:T").SpecialCells(xlCellTypeVisible)
'search if Check can be found (we don't need to count them, one is enough!)
If Not FilteredRange.Find(What:="Check", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=True) Is Nothing Then
sh.Range("C7:U7").AutoFilter Field:=18, Criteria1:="Check"
End If
End Sub
请注意,CountIf
不适用于非连续范围,例如 FilteredRange
返回。但我们可以使用Range.Find method因为我们只对 Check
的存在感兴趣,而不对 Check
的数量感兴趣。如果未找到 Check
,Find
将返回 Nothing
。
关于excel - 按条件自动筛选,如果特定列中没有数据,应停止继续执行其中一项条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65952156/