vba代码匹配1st& 2列之间的最后一个字符串,并在excel的第三列中获得结果

时间:2018-03-19 20:42:15

标签: vba excel-vba excel

VBA代码新手。在使用宏匹配字符串时需要帮助。在Col A中有一个系统名称“John Jerome Doss”,在B列中的“John J Doss”中输入名称。我想比较A列和A列中的第一个和最后一个字符串。 B,如果第一个和最后一个字符串匹配,则列C中的结果应为“OK”,否则列C应为“Check”。

PS:A列中的格式是“FirstName-MiddleName-LastName”& B列中的格式为“FirstName-Intial-LastName”。

我不确定这个的编码。有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:0)

从逻辑上讲,您想要做的只是从字符串中取出第一个和最后一个单词,并将它们与其他值进行比较。

实际上,InStrInStrRev的组合将允许您在分隔符上拆分空格(“”)。

这样做的示例函数如下:

Function FormateName(str As String) As String
  FormateName = Left(str, InStr(1, str, " ") - 1) & " " & Right(str, Len(str) - InStrRev(str, " "))
End Function

为了理解上述内容,第一部分将单元格的值返回到第一个空格。下一个连接带有可读性空间(这是可选的)。最后一部分向后扫描最后一个空格,然后将最后x个字符返回到姓氏。

该函数的返回将是“FirstName LastName”。从上面的函数中,您应该能够在数据集上构建一个循环,然后使用上面的函数去除中间名,然后执行查找以填充C列。

如果您在创建下一步时遇到任何问题,请告知我们。

答案 1 :(得分:0)

在空格字符上拆分的几个数组应该这样做。

Option Explicit

Sub firstLastCheck()
    Dim vals As Variant, n1 As Variant, n2 As Variant, chk As Variant, i As Long

    With Worksheets("sheet1")
        vals = .Range(.Cells(2, "A"), Cells(.Rows.Count, "B").End(xlUp)).Value2
        ReDim chk(LBound(vals, 1) To UBound(vals, 1), 1 To 1)
        For i = LBound(vals, 1) To UBound(vals, 1)
            n1 = Split(vals(i, 1), Chr(32))
            n2 = Split(vals(i, 2), Chr(32))
            If LCase(n1(LBound(n1))) = LCase(n2(LBound(n2))) And _
               LCase(n1(UBound(n1))) = LCase(n2(UBound(n2))) Then
                chk(i, 1) = "OK"
            Else
                chk(i, 1) = "Check"
            End If
        Next i
        .Cells(2, "C").Resize(UBound(chk, 1), UBound(chk, 2)) = chk
    End With
End Sub