3

在 Mac Excel 2011 中,我有两个字符串,每个字符串由空格分隔的更小、无空格字符串的串联组成。例如:

《红绿蓝粉红》《马苹果红猴粉红》

从中,我想提取交集字符串:

“红粉红”

我可以在 VB 中完成,但我更愿意留在 Excel 中。现在我知道我可以通过假设每个较大字符串中较小组件字符串的数量来一起破解一些东西(在 Excel 中)。然后我可以将其中一个较大的字符串切割成这些组件,然后在第二个大字符串上为每个组件执行 FIND(),然后将结果连接起来。

问题是,虽然这里我只给出了两个字符串,但实际上我有两组字符串,每组包含 20 个大字符串。因此,就 Excel 中的空间而言,“砍和走”方法感觉就像 O(N^2),我正在寻找一种更简单的方法。

有任何想法吗?

4

1 回答 1

1

我不认为你可以在不使用多个单元格或 VBA 的情况下在单个单元格函数中执行此操作。定义一个像下面这样的 UDF,并在一个单元格中使用新函数,语法如下

=StringIntersect("a b c","d e b f")

这将返回“b”

这个函数确实有嵌套循环,但在字符串数组上我想它会足够快

Function StringIntersect(s1 As String, s2 As String) As String
Dim arys1()  As String
Dim arys2() As String
Dim arysub() As String
Dim i as integer
Dim j as integer

arys1 = Split(s1, " ")
arys2 = Split(s2, " ")
For i = LBound(arys1) To UBound(arys1)
    For j = LBound(arys2) To UBound(arys2)
        If arys1(i) = arys2(j) Then StringIntersect = StringIntersect & arys1(i) & " "
    Next
Next
StringIntersect = Trim(StringIntersect) 'remove trailing space
End Function

如果你不想做这两个循环,你应该可以用 inStr 做一些非常快的事情。我没有进行任何速度测试,但我怀疑下面的函数更快,但是你会得到意想不到的结果,即字符串在第一个输入中重复,或者第一个输入中的字符串是第二个输入中的子字符串。这可以通过更多检查来避免,但您可能会失去速度优势。

Function StringIntersect(s1 As String, s2 As String) As String
Dim arys1()  As String

arys1 = Split(s1, " ")
For i = LBound(arys1) To UBound(arys1)
    If InStr(1, s2, arys1(i), vbBinaryCompare) > 0 Then StringIntersect = StringIntersect & arys1(i) & " "
Next
StringIntersect = Trim(StringIntersect) 'remove trailing space

End Function
于 2013-06-08T21:33:00.260 回答