Excel:比较两个不同工作表中的名称

时间:2016-02-22 16:10:32

标签: excel excel-vba vba

我有两张excel表,每张约500行。工作表A具有名称列E),工作表B具有两个名称列,用于小型和大型名称(H& I)。我想创建一个循环并对这些列进行比较,如果找到匹配将此匹配粘贴到新工作表上。

进一步澄清:

在工作表B上,两个名称列类似于Cigna和Cigna Co,因此它们并不总是重复相同的名称,而在工作表A上,名称可能是Cigna,因此它们并不总是精确的。但是,工作表A的名称必须与工作表B上的1个或两个名称匹配。

2 个答案:

答案 0 :(得分:1)

像这样的东西是一个简单的循环和记录,然后看第一张纸上的任何东西是否在第二张。

不确定您的大小名称是什么情况,所以我检查了两个列

在您的VBA IDE中,转到工具菜单并选择参考。选择" Microstoft ActiveX数据对象2.8库。这将用于记录集。

Private Sub CommandButton1_Click()
    Dim rs As New ADODB.Recordset
    Dim ws As Excel.Worksheet
    Dim ws2 As Excel.Worksheet
    Dim lRow As Long
    Dim lRowOut As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")
    ws.Activate

    Set ws2 = ActiveWorkbook.Sheets("Sheet3")

    'Add fields to your recordset for storing data.
    With rs
        .Fields.Append "Row", adInteger
        .Fields.Append "Name", adChar, 25
        .Open
    End With

    'Loop through and record the name
    lRow = 1
    Do While lRow <= ws.UsedRange.Rows.count

        rs.AddNew
        rs.Fields("Row").Value = lRow
        rs.Fields("Name").Value = ws.Range("E" & lRow).Value
        rs.Update

        lRow = lRow + 1
        ws.Range("A" & lRow).Activate
    Loop

    If rs.EOF = False Then
        rs.MoveFirst
    End If

    'Switch to the second worksheet
    Set ws = Nothing
    Set ws = ActiveWorkbook.Sheets("Sheet2")
    ws.Activate

    'Loop through and see if anything on this sheet was on the first sheet.
    lRow = 1
    lRowOut = 1
    Do While lRow <= ws.UsedRange.Rows.count

        'Check if the column H name was recorded from the first sheet
        rs.Filter = ""
        rs.Filter = "Name='" & ws.Range("H" & lRow).Value & "'"
        If rs.RecordCount = 0 Then
            rs.Filter = ""
            rs.Filter = "Name='" & ws.Range("I" & lRow).Value & "'"
            If rs.RecordCount > 0 Then
                'It has a date, delete the current row
                ws2.Range("A" & lRowOut).Value = rs.Fields("Name").Value
                lRowOut = lRowOut + 1
            End If
        ElseIf rs.RecordCount > 0 Then
            'It has a date, delete the current row
            ws2.Range("A" & lRowOut).Value = rs.Fields("Name").Value
            lRowOut = lRowOut + 1
        End If

        lRow = lRow + 1
        ws.Range("A" & lRow).Activate
    Loop
End Sub

如果您想在评论中查找名称的一部分,可以使用类似名称。将过滤器行更改为类似的内容。

rs.Filter = "Name LIKE '%" & ws.Range("I" & lRow).Value & "%'"

答案 1 :(得分:0)

使用公式代替VBA,我会在新工作簿的A1中粘贴一个公式,如下所示。假设你的&#34;工作表A&#34;在Sheet1上的Book1和#34;工作表B&#34;中的H和I列中是Sheet1上的Book2:

=if(countif([Book2]Sheet1!H:I, [Book1]Sheet1!E1)>1, [Book1]Sheet1!A1, "")

这说&#34;如果,在Book2的Sheet1的H和I列中,Book1的Sheet1中的Cell E1的名称最后有一个匹配,那么从Book1的Sheet1上的Cell E1中获取名称&# 34;

这将留下大量空白,但此时您可以对其进行过滤或排序。

如果要求比这更复杂,就像三列中的任何一列匹配一样,那么您只需添加多个CountIf()公式的结果并测试它们的&gt; 1,或为每列做一个Countif(),然后将结果,排序/过滤和Bob的叔叔联合起来。

如果这是你经常做的事情,那么可能值得投资VBA路线,因为这将需要一点点的手工工作。