VBA excel,比较两个工作簿中的字符串

时间:2011-08-19 10:59:23

标签: string excel vba compare

我再次遇到excel文件中混合格式数据的问题。我有一个名为“用户名”列的文件。我要解决的最大问题是此列中的数据包含完全混合格式的姓氏和名字。例如:

  

“用户名”
  约翰史密斯   卡特迈克   加菲猫,汤姆

等等......

我有第二个文件包含正确格式的数据,我有3列:“姓氏”,“名字”和“Id”。我需要做的是将与第二个文件中的人匹配的Id复制到第一个文件。

我的想法是遍历“用户名”列并使用InStr函数与第一个“姓氏”列进行比较,如果匹配则与“名字”列进行比较。然后,如果匹配,我会将Id复制到第一个文件中的列“B”。但事实证明我在VBA中太弱了。

这是我写的。它根本不起作用,但可能会帮助你理解我的问题:

Option Explicit

Sub FindID()

Dim rLastCell, rFirstCell, rUserCell As Range
Dim LastCell, FirstCell, UserCell As Range
Dim file As Workbook
Dim i As Long

'open file to compare
Set file = Workbooks.Open(Filename:=ThisWorkbook.Path & "\gooddata.xls")

'set last used cell
Set rLastCell = file.Worksheets("Sheet1").Range("A65536").End(xlUp)
Set rFirstCell = file.Worksheets("Sheet1").Range("B65536").End(xlUp)
Set rUserCell = ThisWorkbook.Worksheets("Sheet1").Range("C65536").End(xlUp)

With ThisWorkbook.Sheets("Sheet1")

For Each UserCell In .Range("C2:C" & rUserCell.Row)
    For Each LastCell In file.Sheets("Sheet1").Range("A2:A" & rLastCell.Row)
        If InStr(0, UserCell.Value, LastCell.Value, vbTextCompare) <> 0 Then
            For Each FirstCell In file.Sheets("Sheet1").Range("B2:B" & rFirstCell.Row)
                If InStr(0, UserCell.Value, FirstCell.Value, vbTextCompare) <> 0 Then
                    'copy id from gooddata.xls to baddata.xls
                End If
            Next FirstCell
        End If
    Next LastCell
Next UserCell

End With

file.Close savechanges:=True
Set file = Nothing

End Sub

感谢您的任何建议。

1 个答案:

答案 0 :(得分:3)

鉴于:

  • 需要运行有限的次数
  • 源数据格式错误,需要对结果进行一些校对
  • 可能会有一些案例需要手动“纠正”

我的建议是使用excel本身而不是VBA。特别是VLOOKUP()函数。 如果你这样做有两种方法可以用这个

第一个:

  • 在gooddata和一些新列中,以不同的格式连接lastname / firstname,您希望“Firstname Lastname”,“Lastname,Firstname”等
  • 然后在带有VLOOKUP()的列的baddata表中查找查找值为id的不同格式
  • 现在,您可以获得包含匹配格式的ID的多列,以及可以评估并在需要时进行更正的错过查找的空白

第二种方法是反过来:

  • 在您从名称列填充的baddata excelsheet中添加firstname和lastname列(需要大量的left / instr内容)
  • 创建一个组合(一致格式化)名称列,您可以在gooddata中执行vlookup

如果您确保创建正确的公式,则只需在后续数据集的用户名栏中粘贴新的“错误数据”