我有一些包含5000行的数据,其中一列代表一个组的大小。它们都是文本,其值范围如下:
"0 - 4", "5 - 9", "10 - 49", "50 - 99", "100 - 249", "250 or more"
这些都存储为文本。
我已经编写了一些VBA,以使用自动过滤器来显示除所需项目以外的所有内容,以便可以删除其他行。喜欢:
activesheet.range("a1:a5000").autofilter field:=1, criteria1:="<>" & strValue
strValue
填充有每个值,并声明为字符串。
"10 - 49"
以外,其他所有方法都工作正常。它不会
显示时排除"10 - 49"
。Filters>Does Not Equal
,然后
然后为"10 - 49"
选择下拉选项(或直接输入),然后
按OK
,它将不适用。它仍然显示10-49行。Filters>Custom
过滤器时,它显示
不等于18172
。
18172
是"Oct-1949"
的日期值。
即使我将代码明确设置为:
activesheet.range("a1:a5000").autofilter field:=1, criteria1:="<>10 - 49"
它将10-49转换为日期值。如果您录制了一个宏并通过自动过滤器下拉菜单进行了手动操作,则它将在记录的代码中将标准1显示为"<>Oct-1949"
。
我通过使用criteria1:="<>*" & strValue
使它起作用,但这恰好适用于此数据,但是如果其中包含10 - 49
的值不同,则可能不起作用。
所以我的问题是,是否有阻止它进行转换
"<>10 - 49"
到
"<>Oct-1949"
是否需要以某种方式将其转义以将其视为真实文本?还是仅仅是Excel的一个怪癖?它与criteria1:="=10 - 49"
一起使用(即使在录制宏时也是如此)。
它发生在 Excel 2010、2013和2016中。
答案 0 :(得分:0)
您会认为有一种方法,尤其是10 - 49
中的空格。
直到/除非有人提出答案,否则您可以尝试一下。
strvalue
strValue
以外的所有条目下面仅是一个示例,其中strValue
具有单个值。您应该能够使用该原理以其他方式应用该技术。
例如,用整个列表填充集合,然后用arrVals
以外的所有内容填充strValue
,这对于用不同值填充strValue
的情况可能会更好>
Option Explicit
Sub filterTest()
Dim R As Range, WS As Worksheet
Const strValue As String = "10 - 49" 'value to exclude
Dim colVals As Collection, vVals As Variant
Dim arrVals() As String, I As Long
Set WS = Worksheets("sheet1")
With WS
Set R = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
WS.ShowAllData
'Get list of values to include
Set colVals = New Collection
'read the range into variant array for speed of execution
vVals = R.Offset(1, 0).Resize(R.Rows.Count - 1)
On Error Resume Next 'to skip the duplicates
For I = 1 To UBound(vVals, 1)
If Not vVals(I, 1) = strValue Then 'exclude if strValue
colVals.Add vVals(I, 1), vVals(I, 1)
End If
Next I
On Error GoTo 0
ReDim arrVals(1 To colVals.Count)
For I = 1 To colVals.Count
arrVals(I) = colVals(I)
Next I
R.AutoFilter field:=1, Criteria1:=arrVals, Operator:=xlFilterValues
End Sub