【问题标题】:Ubound(Filter()) Function returns true for partial string matchesUbound(Filter()) 函数对部分字符串匹配返回 true
【发布时间】:2016-07-22 21:36:39
【问题描述】:

下面的函数返回true进行部分匹配,我如何修改它以仅在匹配整个字符串时才返回True。

例如如果数组有AAAABBB

如果我通过 AAA,它也会为 A 返回 True。

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1)
End Function

是否有一个简单的修改或者我应该编写单独的代码来实现它?

【问题讨论】:

  • 我添加了一个替代的Filter 函数来最接近到你原来的问题'有一个简单的修改吗?以及用于整个字符串搜索和排除空字符串的可选参数。

标签: vba excel filter


【解决方案1】:

您可以使用标记从以下位置删除任何部分匹配项:

ary = Array("AAA", "A", "BB", "B")

让我们假设 $ 字符没有出现在数组中的任何位置。
我们制作如下字符串:

st = "$" & Join(ary, "$") & "$"

这是 $AAA$A$BB$B$

如果我们想查看 A 是否在数组中,请检查 @987654324 @
如果我们想查看 AAA 是否在数组中,请检查 InStr(st,$AAA$) > 0
等。

如果 $ 在数组中,使用 Chr(1) 之类的东西作为标记。

编辑#1:


实施:

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim st As String, M As String

    M = "$"
    st = M & Join(arr, M) & M
    IsInArray = InStr(st, stringToBeFound) > 0
End Function

编辑#2:

用法:

所以如果我们想查看字符串 AA 是否在数组中:

Sub MAIN()
    ary = Array("AA", "BB", "CC", "", "DD")
    MsgBox IsInArray("$AA$", ary)
End Sub

如果我们想查看数组元素是否为空:

Sub MAIN()
    ary = Array("AA", "BB", "CC", "", "DD")
    MsgBox IsInArray("$$", ary)
End Sub

【讨论】:

  • 谢谢,我明白你在说什么,但如果你能将它应用到我的问题中的函数中,那真的很有帮助。
  • @newguy 查看我的EDIT#1
  • imgur.com/7m4oCH4 请看一下为什么 stringtobeFound (tbf) 为空时它与1 匹配?我应该在匹配之前检查字符串是否为空吗?
  • @newguy 查看我的EDIT#2
  • 我在 arr 中有 StrawberryStrawberry - 4 punnets 以及许多其他字符串。当我在 arr 中搜索 Strawberry 时,我只得到 Strawberry,但是当我搜索 Strawberry - 4 punnets 时,我得到 StrawberryStrawberry - 4 punnets 的匹配项。这是唯一的问题。
【解决方案2】:

这个替代方案最接近原来的问题'有简单的修改吗?'。它没有使用不同的方法,而是使用应用于相同 (1dim) 数组的相同 Filter 函数:

语法过滤器(sourcearray, match[,include [,compare]])

       Used compare argument: vbTextCompare, not case sensitive
                              (use vbBinaryCompare if CaseSensitive)

其他功能

此外,它允许在之间进行选择

  • i) 整个字符串搜索。
  • ii) 部分匹配,

代码经过测试和执行不会损失性能

代码

Public Function IsInArray(stringToBeFound As String, arr As Variant, Optional bFull = False) As Boolean
'  Purpose: search strings in 1dim arrays using the Filter function
'           i)  whole strings   (bFull = True) or
'           ii) partial matches (bFull = False, default)
'  Exclude empty strings "" (Note: if not wanted, comment the next line out!)
   If stringToBeFound = "" Then Exit Function
If bFull Then             ' i)  search whole strings
   IsInArray = (UBound(Filter(Split(Join(arr, ".|") & ".|", "|"), stringToBeFound & ".", , vbTextCompare)) > -1)
Else                      ' ii) partial match
   IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1)
End If
End Function

注意

需要注意的是,Filter 函数也可以接受 empty ""-strings。这也是我在 IsInArray 函数中排除它们的原因;如果您不想这样,只需将第一行代码注释掉即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2016-05-15
    • 2022-06-15
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多