Excel 使用我不知道的值筛选范围';我不想要 ThisWorkbook.Sheets(1).范围(“A1:AR1”)。自动筛选字段:=27_ 准则1:=数组(“DRCA”、“DREX”、“DRFU”、“DRIN”_ “DRIR”、“DRND”、“DRPN”、“DRPR”、“DRRE”、“DRUN”_ “REXC”、“EXCD”、“RFUR”、“RINV”、“RIRC”、“RNDR”_ “RPNA”、“RPRO”、“RRET”、“RUND”、“RUNF”、“EXC”、“C”)_ 运算符:=xlFilterValues
这没有返回我想要的正确的筛选器数据。我想要的是,如果数组没有找到任何Excel 使用我不知道的值筛选范围';我不想要 ThisWorkbook.Sheets(1).范围(“A1:AR1”)。自动筛选字段:=27_ 准则1:=数组(“DRCA”、“DREX”、“DRFU”、“DRIN”_ “DRIR”、“DRND”、“DRPN”、“DRPR”、“DRRE”、“DRUN”_ “REXC”、“EXCD”、“RFUR”、“RINV”、“RIRC”、“RNDR”_ “RPNA”、“RPRO”、“RRET”、“RUND”、“RUNF”、“EXC”、“C”)_ 运算符:=xlFilterValues,excel,vba,Excel,Vba,这没有返回我想要的正确的筛选器数据。我想要的是,如果数组没有找到任何值,那么跳过它并检查下一步 我该怎么做?Excel不允许您在自动筛选中使用所需的数组。但还有其他选择吗?对! 逻辑如果我要求您在0和10之间选择数字,包括0和10,但您不能选择0、5、8和10。因此,你可以说我想要1,2,3,4,6,7,9,而不是过滤掉数字,然后说我不想要0、5、8和10 同样,在您的情况下,我们不会过滤我们不想要的值。我们将筛选我们想要的值 那么,我们如何找到该列表并将其存储在数组中呢 在相关列中查找最后一行
值
,那么跳过它并检查下一步
我该怎么做?Excel不允许您在
自动筛选中使用所需的数组。但还有其他选择吗?对!
逻辑如果我要求您在0
和10
之间选择数字,包括0
和10
,但您不能选择0
、5
、8
和10
。因此,你可以说我想要1,2,3,4,6,7,9
,而不是过滤掉数字,然后说我不想要0
、5
、8
和10
同样,在您的情况下,我们不会过滤我们不想要的值。我们将筛选我们想要的值
那么,我们如何找到该列表并将其存储在数组中呢
在相关列中查找最后一行
将该列中的所有记录存储在唯一的集合中
检查该集合中的哪些项不在“排除”列表中,并创建一个数组
筛选所需值(数组)的范围!这样我们就不必过滤我们不想要的值
代码(在Excel 2013中测试,记录数为50k)
我已经对代码进行了注释,但如果您还有任何问题,请随时提问:)
将数组作为变量
Const deLim As String=“|”
子样本()
将Ws设置为工作表
暗淡的lRow尽可能长,i尽可能长,n尽可能长,lCol尽可能长
Dim Col作为新系列,itm
暗淡的光线作为变体
变暗rng As范围
将tmpString设置为字符串
“~~>此数组包含所有要忽略的值
忽略数组=数组(“DRCA”、“DREX”、“DRFU”、“DRIN”、“DRIR”、“DRND”_
“DRPN”、“DRPR”、“DRRE”、“DRUN”、“REXC”、“EXCD”、“RFUR”_
“RINV”、“RIRC”、“RNDR”、“RPNA”、“RPRO”、“RRET”、“RUND”_
“RUNF”、“EXC”、“C”)
“~~>这是要筛选出的列
lCol=27
“~~>将此更改为相关工作表
设置Ws=ThisWorkbook.Sheets(“Sheet1”)
与Ws
“~~>查找最后一行
lRow=.Range(“A”&.Rows.Count).End(xlUp).Row
“~~>这是应用过滤器的范围
设置rng=.Range(“A1:AR”和lRow)
“~~>将第27列中的所有值保存到唯一的集合中
对于i=2至lRow
出错时继续下一步
列加单元格(i,lCol).Value,CStr(.Cells(i,27).Value)
错误转到0
接下来我
“~~>现在循环遍历集合并将值存储在字符串中
“~~>用“忽略数组”中不存在的分隔符分隔
对于每个itm,以Col为单位
如果不是IsInArray(itm,省略数组),则
如果tmpString=“”,则
tmpString=itm
其他的
tmpString=tmpString&deLim&itm
如果结束
如果结束
下一个itm
如果tmpString“”则
“~~>根据分隔符拆分值以创建数组
INCLUDEARY=拆分(tmpString,deLim)
“~~>删除任何筛选器
.AutoFilterMode=False
“~~>对其余值进行筛选
带rng
.AutoFilter字段:=lCol,准则1:=includeArray,运算符:=xlFilterValues
以
如果结束
以
端接头
“~~>函数检查数组中是否有项
函数IsInArray(StringToBeford作为变量,arr作为变量)作为布尔值
Dim bDimen作为字节,i作为长度
出错时继续下一步
如果IsError(UBound(arr,2))则bDimen=1,否则bDimen=2
错误转到0
选择案例bDimen
案例1
出错时继续下一步
IsInArray=Application.Match(StringToBeford,arr,0)
错误转到0
案例2
对于i=1至UBound(arr,2)
出错时继续下一步
IsInArray=Application.Match(stringToBeFound,Application.Index(arr,i),0)
错误转到0
如果IsInArray=True,则退出以获取
下一个
结束选择
端函数
Excel不允许您在自动筛选中使用所需的数组。但还有其他选择吗?对!
逻辑如果我要求您在0
和10
之间选择数字,包括0
和10
,但您不能选择0
、5
、8
和10
。因此,你可以说我想要1,2,3,4,6,7,9
,而不是过滤掉数字,然后说我不想要0
、5
、8
和10
同样,在您的情况下,我们不会过滤我们不想要的值。我们将筛选我们想要的值
那么,我们如何找到该列表并将其存储在数组中呢
在相关列中查找最后一行
将该列中的所有记录存储在唯一的集合中
检查该集合中的哪些项不在“排除”列表中,并创建一个数组
筛选所需值(数组)的范围!这样我们就不必过滤我们不想要的值
代码(在Excel 2013中测试,记录数为50k)
我已经对代码进行了注释,但如果您还有任何问题,请随时提问:)
将数组作为变量
Const deLim As String=“|”
子样本()
将Ws设置为工作表
像我一样昏暗
ThisWorkbook.Sheets(1).Range("A1:AR1").AutoFilter Field:=27, _
Criteria1:=Array("<>DRCA", "<>DREX", "<>DRFU", "<>DRIN", _
"<>DRIR", "<>DRND", "<>DRPN", "<>DRPR", "<>DRRE", "<>DRUN", _
"<>REXC", "<>EXCD", "<>RFUR", "<>RINV", "<>RIRC", "<>RNDR", _
"<>RPNA", "<>RPRO", "<>RRET", "<>RUND", "<>RUNF", "<>EXC", "<>C"), _
Operator:=xlFilterValues
Dim OmitArray As Variant
Const deLim As String = "|"
Sub Sample()
Dim Ws As Worksheet
Dim lRow As Long, i As Long, n As Long, lCol As Long
Dim Col As New Collection, itm
Dim includeArray As Variant
Dim rng As Range
Dim tmpString As String
'~~> This array has all the values that you want to ignore
OmitArray = Array("DRCA", "DREX", "DRFU", "DRIN", "DRIR", "DRND", _
"DRPN", "DRPR", "DRRE", "DRUN", "REXC", "EXCD", "RFUR", _
"RINV", "RIRC", "RNDR", "RPNA", "RPRO", "RRET", "RUND", _
"RUNF", "EXC", "C")
'~~> This is the column where you want to filter out
lCol = 27
'~~> Change this to the relevant worksheet
Set Ws = ThisWorkbook.Sheets("Sheet1")
With Ws
'~~> Find lastrow
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
'~~> This is the range where the filter will be applied
Set rng = .Range("A1:AR" & lRow)
'~~> All all the values from col 27 to a unique collection
For i = 2 To lRow
On Error Resume Next
Col.Add .Cells(i, lCol).Value, CStr(.Cells(i, 27).Value)
On Error GoTo 0
Next i
'~~> Now loop though the collection and store the values in a string
'~~> delimited with a delimiter which arenot present in the "OmitArray"
For Each itm In Col
If Not IsInArray(itm, OmitArray) Then
If tmpString = "" Then
tmpString = itm
Else
tmpString = tmpString & deLim & itm
End If
End If
Next itm
If tmpString <> "" Then
'~~> Split the values based on the delimiter to create array
includeArray = Split(tmpString, deLim)
'~~> Remove any filters
.AutoFilterMode = False
'~~> Filter on the rest of the values
With rng
.AutoFilter Field:=lCol, Criteria1:=includeArray, Operator:=xlFilterValues
End With
End If
End With
End Sub
'~~> Function to check if there is an item in the array
Function IsInArray(stringToBeFound As Variant, arr As Variant) As Boolean
Dim bDimen As Byte, i As Long
On Error Resume Next
If IsError(UBound(arr, 2)) Then bDimen = 1 Else bDimen = 2
On Error GoTo 0
Select Case bDimen
Case 1
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, arr, 0)
On Error GoTo 0
Case 2
For i = 1 To UBound(arr, 2)
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, Application.Index(arr, , i), 0)
On Error GoTo 0
If IsInArray = True Then Exit For
Next
End Select
End Function
Public Sub Demo()
Const HIDE = ".DRCA.DREX.DRFU.DRIN.DRIR.DRND.DRPN.DRPR.DRRE.DRUN.REXC.EXCD.RFUR.RINV.RIRC.RNDR.RPNA.RPRO.RRET.RUND.RUNF.EXC.C."
Dim c As Range
With ThisWorkbook.Sheets(1)
For Each c In .Range("AR1:AR" & .Range("AR" & .Rows.Count).End(xlUp).Row)
If InStr(HIDE, "." & c & ".") Then
c.EntireRow.Hidden = True
End If
Next
End With
End Sub