如何在VBA Array Filter函数中使用通配符查找数组中的非空字符串?
核心问题答复
VBA 原生Filter函数不支持*、?这类通配符匹配,仅支持普通的包含匹配,这是你尝试用"*?"筛选非空字符串失效的根本原因。
问题原因说明
你尝试传入""、设置Include=False筛选非空值不生效,是因为Filter函数的匹配逻辑是判断数组元素是否包含指定的匹配值:所有字符串都包含空字符串"",所以设置Include=False会把所有元素都过滤掉,自然无法得到非空结果。
实现方案
方案1:通用循环实现(兼容所有Excel版本)
直接通过循环筛选非空值,符合你要做自定义函数的需求,完整代码如下:
Function 拼接非空单元格(Value1 As String, Value2 As String, Value3 As String, Optional 自定义前缀 As String = "自定义前缀: ") As String ' 将传入参数存入数组并提前做Trim处理 Dim arr As Variant arr = Array(Trim(Value1), Trim(Value2), Trim(Value3)) Dim resArr As Variant ReDim resArr(-1 To -1) Dim i As Integer ' 循环筛选非空元素并添加前缀 For i = LBound(arr) To UBound(arr) If arr(i) <> vbNullString Then ReDim Preserve resArr(0 To UBound(resArr) + 1) resArr(UBound(resArr)) = 自定义前缀 & arr(i) End If Next i ' 非空则用换行符拼接,否则返回空 If UBound(resArr) >= 0 Then 拼接非空单元格 = Join(resArr, vbNewLine) Else 拼接非空单元格 = vbNullString End If End Function
方案2:调用工作表Filter函数实现(仅支持Excel 2021/365及以上版本)
如果要使用通配符匹配逻辑,可以调用Excel工作表的Filter函数,该函数支持通配符匹配:
' 筛选非空数组示例 Dim arr As Variant arr = Array(Trim(Value1), Trim(Value2), Trim(Value3)) ' 用通配符?*匹配至少包含1个字符的非空字符串 Dim nonEmptyArr As Variant nonEmptyArr = WorksheetFunction.Filter(arr, WorksheetFunction.IsNumber(Application.Match(arr, "?*", 0)), vbNullString)
内容的提问来源于stack exchange,提问作者ARINDAM MOITRA
相关产品推荐
相关产品推荐

