我一直试图弄清楚如何使用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
答案 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+RIGHT
和CTRL+SHIFT+DOWN
的组合将为您提供所需的信息。最后,为你的名字命名以表达对所有优秀人物的喜爱,这个简单的习惯可以节省大量的时间。对于我的示例,我将假设您有一个Primary
和Secondary
表。
我们在组合表中的公式看起来像这样:
=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解决方案需要花费数天的时间。