防止自动筛选条件从字符串更改为日期

时间:2019-06-23 09:57:53

标签: excel vba autofilter

我有一些包含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中。

1 个答案:

答案 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