【问题标题】:How to use Wildcards in VBA Array Filter Function to find non-empty strings in array?如何在 VBA 数组过滤函数中使用通配符来查找数组中的非空字符串?
【发布时间】:2021-11-24 05:17:06
【问题描述】:

概述 我正在尝试创建一个用户定义函数,我想在其中传递三个字符串(单元格值)——Value1、Value2 和 Value3,将它们传递给一个数组,然后使用 Join 函数使用换行符连接它们并添加一个自定义文本作为每个字符串之前的前缀。

目标

但在加入他们之前,我想确保传递的参数都不是空字符串。我正在尝试使用 VBA Filter 函数来检测数组中传递的非空字符串,然后加入它们。

我在哪里卡住了

但是,如果我将 ""vbNullString 作为 Match 参数并将 Include 参数设置为“False”,则 VBA Filter 函数无法检测到非空字符串.我还使用了 Trim 函数来确保数组中传递的所有字符串都不包含空格。

我可以使用一些通配符来确保字符串至少包含一个或多个字符吗?我试过传递“*?” Match 参数中的字符并将 Include 参数设置为 'True' 但它不起作用。

问题

有没有可能使用 VBA Filter 函数的方法,可能带有通配符?

【问题讨论】:

  • 也许你只是用len(value1) > 0检查传递的字符串的len。
  • 我知道可以有不同的方法来检查传入数组的字符串是否为空。我只想知道在默认的 VBA 过滤器函数中是否有一种方法可以识别和过滤掉数组中的任何空字符串。
  • 根据您的帖子,不清楚您的目标是什么或您的问题是什么。请相应地编辑您的帖子并显示您遇到问题的代码。 stackoverflow.com/help/how-to-ask
  • @ARINDAMMOITRA 发布了如何解决您的(核心)问题的方法,演示了如何通过VBA.Filter() 过滤掉空字符串 - 如果您找到答案,请勾选答案旁边的绿色复选标记,随时接受有帮助。

标签: arrays excel vba user-defined-functions


【解决方案1】:

通过函数GetInfotext()我演示如何

  • 使用ParamArray 参数,
  • 通过帮助程序RemoveEmpty(见a)过滤掉空字符串,
  • 将自定义前缀与找到的非空字符串连接起来(参见 b)。

调用示例

Sub ExampleCall()
    Debug.Print GetInfotext("Intro", "", "bla bla")
End Sub

Function GetInfotext(ParamArray s()) As String
    Dim tmp: tmp = s
'a) get non-empty elements
    RemoveEmpty tmp
'b) add custion prefixes
    AddPrefixes tmp, s
'c) return entire text
    GetInfotext = Join(tmp, vbNewLine)
End Function

VB 编辑器的即时窗口中的结果:

X: Intro
Z: bla bla

求助程序到GetInfoText

OP中的主要要求是过滤掉空字符串元素;由于在 any 元素中可以找到空白并且它们没有特殊的通配符,因此有必要通过 未使用的唯一字符,例如$,因此最终的否定过滤允许删除这些标记的元素。

请注意,双重替换是必要的,以允许用 $ 标记标记连续的空元素,因为 VBA 会在这里跳过几个替换字符。

Sub RemoveEmpty(arr)
    Dim tmp
    tmp = Replace(Replace(Join(arr, "|"), "||", "|$|"), "||", "|$|")
    arr = Filter(Split(tmp, "|"), "$", False)
End Sub

为了检查如何将找到的元素添加到您的自定义前缀中,您可以使用以下帮助过程:

Sub AddPrefixes(tmp, ParamArray s())
    'define custom prefixes -- change to your needs
    Dim prfx() As Variant
    prfx = Array("X: ", "Y: ", "Z: ")
    'concatenate them with passed non-empty elements
    Dim i As Long, ii As Long
    For i = LBound(prfx) To UBound(prfx)
        If Len(s(0)(i)) Then tmp(ii) = prfx(i) & tmp(ii): ii = ii + 1
    Next
End Sub

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 2021-12-05
    • 2023-01-27
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2022-07-04
    相关资源
    最近更新 更多