You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VBA中结合Application.Match与数组实现通配符匹配?

VBA数组通配符模糊匹配的高效解决方案

为啥原代码的通配符没用?

Application.Match 只允许在要查找的目标值里使用通配符,你把"Circle:*"写进待匹配的数组中时,Match会将其当作完整字符串进行精确匹配,自然无法触发模糊匹配逻辑。

两种高效解决办法

办法1:用CountIf批量匹配(贴合原代码高效思路)

直接借助Excel内置的CountIf函数,将数组中的通配符规则作为匹配条件,无需循环数组元素,效率拉满:

Dim ArrDataType As Variant
Dim i As Long
Dim CurrentCellValue1 As String
Dim mybook As Workbook
Dim SourceSh As String

' 提前给mybook和SourceSh赋值(示例:Set mybook = ThisWorkbook,SourceSh = "Sheet1")
ArrDataType = Array("Circle:*", "Point:*")

For i = 1 To 10 Step 1
    CurrentCellValue1 = Trim(mybook.Sheets(SourceSh).Range("A" & i).Value)
    ' CountIf会自动识别数组内的通配符,返回匹配到的规则数量
    If Application.CountIf(ArrDataType, CurrentCellValue1) > 0 Then
        Debug.Print "Match Found!: " & CurrentCellValue1
    End If
Next i

办法2:正则表达式(适配复杂规则场景)

如果你的匹配规则更复杂(比如多模式组合、特殊字符匹配),可以用VBScript正则表达式,提前编译模式后循环匹配,处理数千行数据毫无压力:

Dim ArrDataType As Variant
Dim i As Long
Dim CurrentCellValue1 As String
Dim mybook As Workbook
Dim SourceSh As String
Dim regEx As Object

' 初始化正则对象,开启编译模式提升效率
Set regEx = CreateObject("VBScript.RegExp")
regEx.IgnoreCase = False ' 需要忽略大小写可改为True
regEx.Global = False

' 把VBA通配符转成正则语法(VBA的*对应正则的.*)
ArrDataType = Array("Circle:*", "Point:*")
regEx.Pattern = "^(" & Replace(Join(ArrDataType, "|"), "*", ".*") & ")"

' 提前赋值mybook和SourceSh
For i = 1 To 10 Step 1
    CurrentCellValue1 = Trim(mybook.Sheets(SourceSh).Range("A" & i).Value)
    ' 测试当前值是否匹配正则模式
    If regEx.Test(CurrentCellValue1) Then
        Debug.Print "Match Found!: " & CurrentCellValue1
    End If
Next i

Set regEx = Nothing ' 用完释放对象

效率提示

  • 办法1的CountIf是Excel底层优化的函数,处理数千行数据几乎无感知;
  • 办法2的正则仅需编译一次模式,循环中仅做简单匹配测试,效率远高于逐字符遍历。

内容的提问来源于stack exchange,提问作者XCELLGUY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:52:48