【问题标题】:Excel filter a column by the first letters for more than 2 valuesExcel 按首字母过滤列以获取超过 2 个值
【发布时间】:2018-08-23 14:44:44
【问题描述】:

我是 vba 的新手,现在使用一个宏来过滤第一个确切字母的列(例如,我有一个列 N -“城市”,因此我必须拥有所有条目,例如以“温哥华”、“温哥华。BC”、“温哥华加拿大”开头——所以我想按第一个字母对这一列进行排序——VANCOU——以确保我不会错过任何信息。

下面的代码对于 3 个值根本不起作用——可能我选择了错误的方式。请你指教——在这种情况下哪个函数或运算符可以工作?我找到的所有 - 为 2 个值工作(在这种情况下,我可以在列表“开始于”时使用)。我有 5-6 个值,它们可能会有所不同(我不知道下次我会使用哪种格式的城市名称)。

提前致谢!

Dim rng01 As Range
Set rng01 = [A1:Z5048]
    rng01.Parent.AutoFilterMode = False
    rng01.Columns(14).AutoFilter Field:=1, Criteria1:=Array("Vancou*", "Brampt*", "Halifa*"), Operator:= _
        xlFilterValues

更新: 这是一个改编的代码,它不起作用

Option Explicit
Sub AutoFilterWorkaround()

Dim sht As Worksheet
Dim filterarr As Variant, tofindarr As Variant
Dim lastrow As Long, i As Long, j As Long, k As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells(sht.Rows.Count, "N").End(xlUp).Row

'List the parts of the words you need to find here
tofindarr = Array("Vancou", "Brampt", "Halifa")

ReDim filterarr(0 To 0)
j = 0

For k = 0 To UBound(tofindarr)

    For i = 2 To lastrow
        If InStr(sht.Cells(i, 14).Value, tofindarr(k)) > 0 Then
            filterarr(j) = sht.Cells(i, 14).Value
            j = j + 1
            ReDim Preserve filterarr(0 To j)
        End If
    Next i

Next k

'Filter on array
sht.Range("$N$1:$N$" & lastrow).AutoFilter Field:=14, Criteria1:=Array(filterarr), Operator:=xlFilterValues

End Sub

【问题讨论】:

  • 就像你说的,AutoFilter 仅限于数组中的两个通配符项目 - 我相信有一个解决方法,但我无法挖掘它自从上次有人问这个问题以来。
  • 感谢您的回复!我已经搜索了几天的解决方案 - 根本没有结果 - 一切都适用于 2 个值或数字......
  • 在下面查看我的答案。

标签: vba excel excel-formula


【解决方案1】:

好的,所以我重写了解决方法 - 基本上我们避免使用通配符,只需找到每个单独的匹配案例,将其加载到数组中,然后在最后过滤整个数组。

此示例适用于 A 列 - 只需将 lastrow 中的 A 更改为 N,并将最后一行中的 As 更改为 Ns。还要在Set sht 行中指定您的工作表名称。在您的情况下,对于第 N 列,Field:=1 也需要更改为 Field:=14

Option Explicit
Sub AutoFilterWorkaround()

Dim sht As Worksheet
Dim filterarr As Variant, tofindarr As Variant
Dim lastrow As Long, i As Long, j As Long, k As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

'List the parts of the words you need to find here
tofindarr = Array("Vancou", "Brampt", "Halifa")

ReDim filterarr(0 To 0)
j = 0

For k = 0 To UBound(tofindarr)

    For i = 2 To lastrow
        If InStr(sht.Cells(i, 1).Value, tofindarr(k)) > 0 Then
            filterarr(j) = sht.Cells(i, 1).Value
            j = j + 1
            ReDim Preserve filterarr(0 To j)
        End If
    Next i

Next k

'Filter on array
sht.Range("$A$1:$A$" & lastrow).AutoFilter Field:=1, Criteria1:=Array(filterarr), Operator:=xlFilterValues

End Sub

【讨论】:

  • 非常感谢您提供此解决方案!很奇怪:您的代码运行良好,但是如果我更改值 (Column,Field) 并且我有大约。 3000 行,它过滤结果,除顶行外的所有内容都被突出显示。我昨天试图修复它,但它有问题。无论如何,谢谢你的帮助!
  • 不确定你的意思 - 你能用修正后的代码编辑你的上述问题吗?
  • @IrinaTitovets 立即尝试 - 必须将 InStr 行的 A 列更改为 N。我编辑了您重新发布的代码
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多