【发布时间】:2016-09-01 15:01:59
【问题描述】:
我有两个包含数据的 Excel 电子表格。这两张表都包含一个 ID 号,然后是其他相应的数据。表 1 本质上是包含所有现有 ID 号(和其他相应数据)的主表,而表 2 是一组特定的数据,仅包含表 1 中的一些 ID 号(表 2 中的所有 ID 号都存在在表 1 中,但不是相反)。目前,工作表 1 包含从 A 到 F 列的数据,ID 号在 C 列,而工作表 2 包含从 A 到 C 列的数据,ID 号在 A 列上。另请注意,随着我们移动,ID 号按递增顺序排列在工作表下方,其相应工作表中的每个 ID 号都是唯一的。
我想要的是,如果工作表 2 中的 ID 等于工作表 1 中的 ID,那么我想将工作表 2 中的 B 列和 C 列粘贴到工作表 1 中相应行的末尾,并且然后还删除工作表 1 中的任何行,其中工作表 2 中不存在相同的 ID 号。为了澄清,工作表 1 如下所示:
+-------+----------+--------+--------------+
|Year |Country | ID #: |Columns D,E,F |
+-------+----------+--------+--------------+
|2012 |CA |123456 |data |
+-------+----------+--------+--------------+
|2015 |US |565382 |data |
+-------+----------+--------+--------------+
|2008 |US |765382 |data |
+-------+----------+--------+--------------+
|2012 |CA |956471 |data |
+-------+----------+--------+--------------+
表 2 如下所示:
+-------+----------+--------+
|ID #: |Quantity |Value |
+-------+----------+--------+
|123456 |435 |12523 |
+-------+----------+--------+
|765382 |1136 |52342 |
+-------+----------+--------+
|956471 |49 |5562 |
+-------+----------+--------+
然后在组合具有相同 ID 号的行并从工作表 1 中删除所有不包含工作表 2 中相应 ID 的行后,我们得到:
+-------+----------+--------+--------------+-----------+---------+
|Year |Country | ID #: |Columns D,E,F |Quantity |Value |
+-------+----------+--------+--------------+-----------+---------+
|2012 |CA |123456 |data |435 |12523 |
+-------+----------+--------+--------------+-----------+---------+
|2008 |US |765382 |data |1136 |52342 |
+-------+----------+--------+--------------+-----------+---------+
|2012 |CA |956471 |data |49 |5562 |
+-------+----------+--------+--------------+-----------+---------+
由于我的工作表包含数十万行,我无法手动执行此操作,因此我需要一个可以更有效地完成此任务的宏。
这是我目前所拥有的:
Sub mergeSheets()
Dim c As Range, cfind As Range, x, dest As Range, cfind1 As Range
On Error Resume Next
Worksheets("sheet3").Cells.Clear
With Worksheets("Sheet1")
.UsedRange.Copy Worksheets("sheet3").Range("a1")
For Each c In Range(.Range("a2"), .Range("c2").End(xlDown))
x = c.Value
With Worksheets("sheet2")
Set cfind = .Cells.Find(what:=x, lookat:=xlWhole)
If cfind Is Nothing Then GoTo line1
.Range(cfind.Offset(0, 1), cfind.End(xlToRight)).Copy
With Worksheets("sheet3")
Set cfind1 = .Cells.Find(what:=x, lookat:=xlWhole)
If cfind1 Is Nothing Then GoTo line1
cfind1.End(xlToRight).Offset(0, 1).PasteSpecial
End With 'sheet3
End With 'sheet2
line1:
Next
End With 'Sheet 1
Application.CutCopyMode = False
End Sub
谢谢
【问题讨论】:
-
你试过什么? SO 不是“我的代码”网站,而是“帮助我编写代码”。请阅读How to Ask 了解如何提问。请发布您迄今为止尝试过的任何代码/宏/公式。
-
为什么选择 VBA?为什么不简单地在 sheet1 上使用
VLOOKUP,然后过滤掉#N/A的? -
那你去哪儿了?