合并两个Excel表(使用VBA)

时间:2018-01-10 13:48:02

标签: excel vba excel-vba

我一直试图弄清楚如何使用VBA将同一工作簿中的两个表合并到第三个表中。示例:

Worksheet1:

From     To     Value
Italy    Japan  1000
France   Japan  500
Canada   Japan  0
France   Italy  700

Worksheet2:

From     To     Value
Italy    Japan  5555
France   Japan  1111
Canada   Japan  777
Canada   France 333

Disired output(worksheet3):

From     To     Value1  Value2
Italy    Japan  1000    5555
France   Japan  500     1111
Canada   Japan  0       777
France   Italy  700
Canada   France         333

我需要一个VBA解决方案,因为原始表大约有400行,我需要对几个工作簿执行相同的操作。关于这个问题的任何建议,我将非常感激!

编辑:

如果对任何人感兴趣,我设法制作了一个有效的代码。 Worksheet1是" List Import"的昵称。和Worksheet2是"列出导出"。在这两张纸中,我插入了一个列(C)列,表示两个国家/地区。我使用了新的列和值来构建Worksheet3中的表(现在" Combolist")。

Sub combolist()
    Dim lastRowImp As Long, lastRowExp As Long, startPaste As Long, endPaste As Long
    Dim ws As Worksheet, Lookup_Range As Range, i As Integer
    Dim lastRow As Long

    lastRowImp = Sheets("List Import").Cells(Rows.Count, 1).End(xlUp).Row
    lastRowExp = Sheets("List Export").Cells(Rows.Count, 1).End(xlUp).Row
    startPaste = lastRowImp + 1
    endPaste = lastRowImp + lastRowExp - 1

    'add a new sheet and headers
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Combolist"
    Sheets("Combolist").Range("B1") = "Import"
    Sheets("Combolist").Range("C1") = "Export"
    Sheets("Combolist").Range("C1").EntireRow.Font.Bold = True

    'copy flows from import and export list
    Sheets("Combolist").Range("A1:A" & lastRowImp) = Sheets("List Import").Range("C1:C" & lastRowImp).Value
    Sheets("Combolist").Range("A" & startPaste & ":A" & endPaste) = Sheets("List Export").Range("C2:C" & lastRowExp).Value

    'remove duplicates
    lastRow = Sheets("Combolist").Cells(Rows.Count, 1).End(xlUp).Row
    Sheets("Combolist").Range(Cells(1, 1), Cells(lastRow, 1)).RemoveDuplicates Columns:=Array(1), Header:=xlYes

    Set ws = ActiveWorkbook.Sheets("Combolist")
    lastRow = Sheets("Combolist").Cells(Rows.Count, 1).End(xlUp).Row

    'populate Import values
    Set Lookup_Range = Sheets("List Import").Range("C1:D" & lastRowImp)

    With ws
        For i = 2 To lastRow
            On Error Resume Next
                If Application.WorksheetFunction.VLookup(ws.Cells(i, 1), Lookup_Range, 2, False) = "" Then
                ws.Cells(i, 2) = 0
                Else
                ws.Cells(i, 2) = Application.WorksheetFunction.VLookup(ws.Cells(i, 1), Lookup_Range, 2, False)
                End If
        Next i
    End With

    'populate Export values
    Set Lookup_Range = Sheets("List Export").Range("C1:D" & lastRowExp)

    With ws
        For i = 2 To lastRow
            On Error Resume Next
                If Application.WorksheetFunction.VLookup(ws.Cells(i, 1), Lookup_Range, 2, False) = "" Then
                ws.Cells(i, 3) = 0
                Else
                ws.Cells(i, 3) = Application.WorksheetFunction.VLookup(ws.Cells(i, 1), Lookup_Range, 2, False)
                End If
        Next i
    End With

End Sub

1 个答案:

答案 0 :(得分:1)

虽然可以通过VBA解决这个问题,但使用公式可能会更好(除非你必须经常这样做)。 VBA解决方案需要一些技术诀窍,如果您希望能够维护解决方案,还需要更多知识。

Excel公式非常简单。首先,创建一个UniqueID列:

UniqueID        From     To     Value
Italy_Japan     Italy    Japan  1000  
France_Japan    France   Japan  500   
Canada_Japan    Canada   Japan  0     
France_Italy    France   Italy  700
Canada_France   Canada   France     

你会对两个表做同样的事情。接下来,获取所有唯一的UniqueID。为此,您可以使用Data> Remove Duplicates,只需确保在删除重复项之前复制,否则您将从源中删除记录。将此UniqueID列表放入新的Table。请注意,如果您的所有数据都采用Table格式,则所有这些都会更容易(当您在表格范围内时,您会在功能区中看到Table标签。

如果您需要将数据格式化为表格,请转到工作表,按CTRL+HOME(这将转到第一个单元格)。如果您的第一个单元格位于其他位置,则只需在那里导航即可。如果您的表格是工作表中的唯一数据,请尝试使用此处的CTRL+SHIFT+END突出显示上次使用的单元格。否则,CTRL+SHIFT+RIGHTCTRL+SHIFT+DOWN的组合将为您提供所需的信息。最后,为你的名字命名以表达对所有优秀人物的喜爱,这个简单的习惯可以节省大量的时间。对于我的示例,我将假设您有一个PrimarySecondary表。

我们在组合表中的公式看起来像这样:

=IfError(Vlookup([UniqueID], Primary, Column(Primary[Value]), False), "")

或者,如果您的Primary表未在第一列中开始,请使用:

=IfError(Vlookup([UniqueID], Primary, 4, False), "")

这里的不同之处在于前者会在移动列时更改索引,后者则不会,如果编辑了表,则必须进行编辑。

在另一个表的下一列中执行相同的操作:

=IfError(Vlookup([UniqueID], Secondary, Column(Primary[Value]), False), "")

=IfError(Vlookup([UniqueID], Secondary, 4, False), "")

这将基于共享UniqueID“合并”两个集合,如果记录不存在,将留下空白。学习如何做可能比学习如何在VBA中学习更方便,但如果你不能使用这样的实现,我会强烈劝你不要试图学习VBA。

要明确的是,在这种情况下,公式方法理想的原因是您要求帮助的任务是非常简单,您将更好地发展您的Excel技能,因为,这样做,将允许您在将来解决类似的任务更快。即使是初学者也可以在15分钟左右的时间内实施此解决方案,在那里学习可扩展的VBA解决方案需要花费数天的时间。