识别Excel VBA中的字符串模式

时间:2019-01-09 04:26:04

标签: excel vba

我正在尝试识别其中包含特殊字符串的列。为了简化问题,这里是我正在使用的列的一小部分样本。

pic1

该列包含人员姓名,但是我们看到某些记录在单元格的最后7到8位数字中具有特殊的键ID。我感兴趣的是一个以大写字母“ C”开头,后跟6个数字的数字。

我正在尝试获得与此类似的结果。

pic2

B列(Cab ID)仅从右边取7位数字,这可以通过vba中的excel函数轻松完成。我正在尝试获取列C(标志),在这里我确定它们是否是我感兴趣的记录,这些记录以大写“ C”开头,后跟6个数字。如果是,我将它们标记为“ Y”,否则标记为“ N”。

如果需要添加任何其他详细信息,请告诉我,我将尽快对问题进行快速编辑。

3 个答案:

答案 0 :(得分:1)

没有RegExp

检查后七个字符中的第一个是否为大写“ C”。如果是这样,请检查最后6个字符是否为数字。只有这样才能返回“ Y”。

代码

Sub LeftRightArray()

    Const cSheet1 As Variant = "Sheet1"  ' Sheet Name/Index
    Const cFirst As Integer = 2          ' Source First Row
    Const cSourceC As Variant = "A"      ' Source Column
    Const cTargetC As Variant = "B"      ' Target Column
    Const cSearch As String = "C"        ' Search String

    Dim lastR As Long     ' Source Last Row Number
    Dim i As Long         ' Array Row Counter
    Dim j As Integer
    Dim vnt As Variant    ' Array
    Dim strCompare        ' Compare String

    ' Paste Source Range into Array
    With Worksheets(cSheet1)
        lastR = .Cells(.Rows.Count, cSourceC).End(xlUp).Row
        vnt = .Range(.Cells(cFirst, cSourceC), .Cells(lastR, cSourceC))
    End With

    ' Change data in Array.
    For i = 1 To UBound(vnt)
        ' Check if C is the first char of last 7 chars.
        If Left(Right(vnt(i, 1), 7), 1) = cSearch Then
            ' Check if last 6 chars are numeric.
            If IsNumeric(Right(vnt(i, 1), 6)) Then
                vnt(i, 1) = "Y"
              Else
                vnt(i, 1) = "N"
            End If
          Else ' C is not the first letter of last 7 chars.
            vnt(i, 1) = "N"
        End If
    Next

    ' Paste Array into Target Range
    With Worksheets(cSheet1).Cells(cFirst, cTargetC)
        .Resize(UBound(vnt), UBound(vnt, 2)) = vnt
    End With

End Sub

答案 1 :(得分:1)

在列C中使用以下公式: =IFERROR(IF(AND(MID(A2,FIND("*",A2)+1,1)="C",LEN(A2)-(FIND("*",A2)+1)=6),"Y","N"),"N")

替代: 将此公式放在B列中
=IFERROR(IF(AND(MID(A2,FIND("*",A2)+1,1)="C",LEN(A2)-(FIND("*",A2)+1)=6),MID(A2,FIND("*",A2)+1,7),""),"")

以及列C中的此公式
=IF(LEN(B2)<>0,"Y","N")

答案 2 :(得分:1)

您也可以直接使用以下excel公式。只需稍加修改,即可在VBA代码中使用此公式。

=IF(COUNT(FIND({0,1,2,3,4,5,6,7,8,9},A2))=0,"N",IF(EXACT(LEFT(B2,1),"C"),"Y","N"))

注意:A2是包含数据的单元格,例如:Joe * C5464647。请参考快照。

Excel Snapshot with data