【问题标题】:Excel Macro to Combine two excel spreadsheets based on duplicate dataExcel 宏根据重复数据组合两个 Excel 电子表格
【发布时间】: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 的?
  • 那你去哪儿了?

标签: vba excel


【解决方案1】:

可能是与您的代码不同的方法,遍历 sheet1 中的 C 列并在 sheet2 的 A 列中找到 ID#,然后获取信息,不需要复制和粘贴。

Sub Get_It()
    Dim sh As Worksheet, ws As Worksheet
    Dim LstRw As Long, Rng As Range, c As Range, Fx As Range

    Set sh = Sheets("Sheet1")
    Set ws = Sheets("Sheet2")

    With sh

        LstRw = .Cells(.Rows.Count, "C").End(xlUp).Row
        Set Rng = .Range("C2:C" & LstRw)

        For Each c In Rng.Cells

            Set Fx = ws.Columns(1).Find(what:=c, lookat:=xlWhole)

            If Not Fx Is Nothing Then
                c.Offset(, 4) = Fx.Offset(, 1)
                c.Offset(, 5) = Fx.Offset(, 2)

            Else: MsgBox c & " is Not Found"' remove msgbox if desired, just an example

            End If

        Next c

    End With

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多