检查字符串(单词)是否是另一个字符串(单词)的子集,与序列无关

时间:2017-01-20 12:33:02

标签: excel excel-vba vba

我想检查字符串是否是另一个字符串的子集。但不是按顺序。

即“BAC”中的“ABC”=真。

到目前为止我所做的是按字母顺序对两个字符串进行排序(一旦在vba中完成运动),然后检查“find(a,b)”但这不是很有效:

“小时”不是“dffhioru”的子集,因为我找到了“小时”,但字母序列是hioru,而小时则是分类时的horu。

我理想地希望在这里使用vba用于速度目的,但是如果没有这样的功能那么就这样吧。

2 个答案:

答案 0 :(得分:1)

您可以在没有VBA的情况下执行此操作,方法是在单独的列中查找每个字母,然后在字符串长度与原始字符串匹配时加入它们。

在单元格E1中查找公式,然后自动填充到O?

=IFERROR(IF(FIND(MID($B2,E$1,1),$A2,1) > 0,MID($B2,E$1,1),""),"")

在C2中汇总公式并自动填充到单词列表的末尾。

=IF(COUNTA(E2:O2)-COUNTBLANK(E2:O2)=LEN(A2),CONCATENATE(E2,F2,G2,H2,I2,J2,K2,L2,M2,N2,O2),"")

screenshot

答案 1 :(得分:0)

看看这个:

var list = cauldron.getElements();
foreach (Element remElem in a)
{
    var elems = list.Where((e) => e.Id == remElem.Id);
    if (elems.Any())
    {
        list.Remove(elems.ElementAt(0));
        Debug.Log("Removed " + remElem + " from cauldron");
        counter++;
    }
}

它基本上做的是循环遍历第一个字符串中的每个字符(这里是单元格A1)并检查它是否在第二个字符串(单元格B1)中。如果未找到char,则代码停止,如果找到所有字符,则将“OK”置于单元格C1中。这应该让你去。

编辑:为了解决Storax的观点,我已经改变了一些代码。

首先它检查两个字符串的长度 - 如果第一个字符串自动更长,它不是一个子集。如果不是这种情况,它会将第二个字符串作为myText存储在内存中,并逐个取出字符。现在,如果可以取出所有字符,则意味着第一个字符串是一个子集,代码将“OK”放入单元格C1中。

Sub CheckString()
Dim myChar As String
Dim i As Long

Range("C1").Value = ""

For i = 1 To Len(Range("A1"))
    myChar = Mid(Range("A1").Text, i, 1)
    If InStr(1, Range("B1").Text, myChar, vbTextCompare) = 0 Then
        Exit Sub
    End If
Next i


Range("C1").Value = "OK"

End Sub