Excel VBA - 查找一组字符并设置为字符串

时间:2013-05-22 06:32:39

标签: search excel-vba find vba excel

我有一组描述,其中包含排列在列中的ID号。例如:

A栏

这是ID12345中ID号的描述。

这是ID66666的描述,其中包含ID号。

这是ID99999描述中包含ID号。

Id编号始终采用“IDXXXXX”格式我想以某种方式删除每个单元格中的所有文本,并留下该ID编号。

我的想法: 这可以通过找到像“ID ?????”这样的字符串来完成并将其设置为变量,然后用该变量替换单元格的内容?或者通过删除单元格中的所有字符 - 除了“ID ?????”

任何帮助都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:2)

我为您编写的代码将遍历A列中的所有项目。它会将每个单元格中的所有单词拆分为一个数组。如果单词长度为7或8个字符,那么它可能是IDxxxxx。它将执行一些检查以查看它是否真正匹配IDxxxxx语法。如果是这样,它将替换单元格的内容,只删除所有剩余文本的ID。

Sub ReplaceContentWithIDs()

    Dim ws As Worksheet
    Set ws = Sheets("Sheet1") ' or your sheet name
    Dim rng As Range
    Dim i&, lr&, j&
    Dim arr
    Dim str$

    lr = ws.Range("A" & Rows.Count).End(xlUp).Row
    ' starting from 1 - if you have headers change to 2
    For i = 1 To lr
        Set rng = ws.Range("A" & i)
        arr = Split(CStr(rng.Value), " ")
        For j = LBound(arr) To UBound(arr)
            str = arr(j)
            If (Len(str) = 7) Or (Len(str) = 8) Then
                If (StrComp(Left(str, 2), "ID", vbTextCompare) = 0) And _
                IsNumeric(Right(Left(str, 7), 5)) Then
                    ' found it
                    If Len(str) = 8 Then
                        rng.Value = Left(str, 7)
                    ElseIf Len(str) = 7 Then
                        rng.Value = str
                    End If
                End If
            End If
        Next j
        Set rng = Nothing
    Next i

End Sub

答案 1 :(得分:1)

我认为这是对我的智力的挑战,并且鉴于这是一天的结束,在Excel论坛上看到Aladdinpgc01的公式后,我做了一些工作,想出了这个CSE(数组公式):

=IF(ISNUMBER(LOOKUP(9.99999999999999E+307,SEARCH({"ID0","ID2","ID3","ID4","ID5","ID6","ID7","ID8","ID9"},A1))),MID(A1,LOOKUP(9.99999999999999E+307,SEARCH({"ID0","ID2","ID3","ID4","ID5","ID6","ID7","ID8","ID9"},A1)),7),"")

我对这个CSE数组公式也有好运:

=IF(ISNUMBER(SEARCH("ID"&{1,2,3,4,5,6,7,8,9},$A$1)),MID(A$1,SEARCH("ID"&{1,2,3,4,5,6,7,8,9},$A$1),7))