【问题标题】:Excel VBA Autofilter using array - multiple values in same column使用数组的Excel VBA自动过滤器 - 同一列中的多个值
【发布时间】:2019-12-27 04:40:18
【问题描述】:

我觉得答案就在那里,但经过大量搜索和试验后,我仍然做不到。

因此可以在第一张图片中看到 O 列有一个逗号分隔的值列表。当用户双击包含列表的单元格时,我希望我的例程使用整个列表过滤列 A 上的数据。

我的代码如下:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Not Intersect(Target, Range("O:O")) Is Nothing Then
    Sheet1.Cells.AutoFilter 'clear existing filters
    Dim idArray() As String
    idArray = Split(Target.Value, ",") 'store cell contents in array
    Dim newIDArray(0 To 100) As String
    Dim i As Long
    For i = 0 To UBound(idArray)
     newIDArray(i) = """" & CStr(idArray(i)) & """"   'wrap elements with quotes ... not sure if needed
    Next
    Sheet1.Range("$A$8").AutoFilter Field:=1, Criteria1:=newIDArray
End If

Cancel = False
End Sub

但是结果如下图。我看起来它正在使用 A 列中的过滤器,取消选择所有并显示结果....它根本没有使用逗号分隔列表中的值。

对正在发生的事情有什么想法吗?感谢阅读。

【问题讨论】:

  • 我会通过在过滤之前检查最终数组的值来调试它。您加载它的方式可能有问题

标签: arrays excel vba autofilter


【解决方案1】:

关于我的设置:

  • 逗号分隔值对应Range("J1:J3")
  • 要过滤的范围对应于Range("A1:A18")

请参阅下面的正确调整数组大小 (ReDim) 的方法以及如何为其添加值


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Arr          'Array to SPLIT string
Dim i As Long    'Index to loop through Arr
Dim Filt         'Array to filter range

If Not Intersect(Target, Range("J1:J3")) Is Nothing Then
    Arr = Split(Target, ",")
    ReDim Filt(LBound(Arr) To UBound(Arr))
        For i = LBound(Arr) To UBound(Arr)
            Filt(i) = CStr(Arr(i))
        Next i
    Range("A1:A18").AutoFilter 1, Filt, xlFilterValues
End If

End Sub

【讨论】:

  • 我一开始就去掉了过滤器,只是为了解决问题。
  • @Saladsamurai 您还可以添加一个条件,例如“如果不相交...”之后的“And Len(Target.Value) > 0”以防止有人单击空单元格时出错,或者添加更高级的检查以确保正确的目标值
  • True @RafałB - 如果 OP 将相交限制在一个范围内而不是一整列,则可能没有必要进行检查,但拥有它并没有什么坏处!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多