【问题标题】:Linking Data Fields from Different Worksheets链接来自不同工作表的数据字段
【发布时间】:2016-01-02 11:51:29
【问题描述】:

我经常从 2 个不同的来源生成报告,这两个来源都有一个唯一标识符,用于链接两个报告中的数据(我将字段 ID 称为“LINK ID”)。此字段出现在两组导出中(但是导出来自填充不同数据点的 2 个不同系统)。我通常将每个报告剪切并粘贴到新创建的工作簿中的单独工作表中,然后将它们匹配起来。

有一次,我编写了一个子例程,该例程将循环浏览一张工作表中包含“LINK ID”的列,然后循环浏览另一张工作表中包含相同“LINK ID”的另一列,并且如果找到匹配项,它将复制链接到该匹配项的整行数据并将其粘贴到第一个工作表上。

我编写的代码从未完全完成,但我正在尝试看看我是否可以一劳永逸地解决这个问题,因为如果我不必用我的眼睛筛选这些代码,那就太棒了一次。

这是我所拥有的:

Private Sub Find_And_Link()

Dim rw As Long

Dim mr2 As Long

Dim ws3 As Worksheet

Set ws3 = Sheets("VM")   

With Sheets("AY")

For rw = 2 To .Cells(Rows.Count, "F").End(xlUp).Row

If CBool(Application.CountIf(ws3.Columns(1), .Cells(rw, "F").Value)) Then

mrw = Application.Match(.Cells(rw, "F"), ws3.Columns(1), 0)

ws3.Cells(mrw, "A").Resize(1, 12).Copy _
Destination:=.Cells(rw, "G")
ws3.Rows(mrw).EntireRow.Delete
'getting rid of the row if match found

End If

Next rw

End With

Set ws3 = Nothing

End Sub

【问题讨论】:

  • 快速说明:使用With 时,请确保所有范围类型引用都是明确的。我注意到您可能想要更新您的 For rw = 2 ... 行,因为目前尚不清楚要使用哪个工作表的 Rows.Count...所以将其更改为 For rw = 2 to .Cells(.Rows.Count,"F").End(xlUp).Row 以确保它正在计算“AY”工作表的行。使用您当前的代码,它有什么问题?它没有完全循环,还是出现错误?
  • 谢谢。所以......为了清楚起见,我应该在For rw = 2... 行中的某处包含 .Sheets 引用吗?目前,当我运行代码时,它绝对什么都不做。它没有给我任何错误,但似乎也没有改变任何东西。

标签: vba excel columnsorting


【解决方案1】:

这是我能得到的。我假设您的工作表“AY”是您希望将数据复制到 的原始工作表,而“VM”是您正在搜索要复制的数据的工作表 /em> (如果向后更改,请更改它)。我还更改了变量名称以使其更清晰:

Sub Find_And_Link()

Dim i As Long, copyRow As Long

Dim origWS As Worksheet, copyWS As Worksheet

Set copyWS = Sheets("VM")
Set origWS = Sheets("AY")

With origWS
    For i = 2 To .Cells(.Rows.Count, "F").End(xlUp).Row
        If CBool(Application.CountIf(copyWS.Columns(1), .Cells(i, "F").Value)) Then
            copyRow = Application.Match(.Cells(i, "F"), copyWS.Columns(1), 0)
            Debug.Print "Match found in row " & copyRow & "."
            copyWS.Cells(copyRow, "A").Resize(1, 12).Copy Destination:=.Cells(i, "G")
            copyWS.Rows(copyRow).EntireRow.Delete 'getting rid of the row if match found
        Else
            Debug.Print "No match found for Link ID " & .Cells(i, 6) & " :("
        End If
    Next i
End With

Set copyWS = Nothing

End Sub

我试过了,效果很好。注意:在“AY”中,您的“Link IDs”都在 F 列中。在“VM”中,“Link IDs”都在 A 列中。

这将在“VM”中找到匹配项,将数据从 A 列复制到 L,然后将其粘贴到“AY”中,从 G 到 S 列。请注意,这与您要求的不完全一致(您要求替换整个原始表中的行),但我这样做是因为它在您的代码中。

要替换原始“AY”表中的整行,请将复制目标更改为Destination:=.Cells(i,"A")。 (您可能需要在该行之前添加.Rows(i).Clear 以清除该行中的所有数据。)

【讨论】:

  • 哇,这太棒了。感谢您的所有帮助。我仍然遇到同样的问题(我在模块中运行代码,它说它已经运行但没有任何改变)。我检查了肯定有应该匹配的项目,但是我不确定为什么它不会运行任何东西。我检查了我的参考图书馆,但它似乎是最新的。
  • 你能张贴两张纸的截图示例吗?我将用一些调试行更新我的 OP,至少检查一切是否正常。 (您将在 VB 窗口中的即时窗口中看到“debug.print”内容(按 CTRL+G 来查看))。另外,确保工作表名称正确 - 也许我把它们颠倒了?另一个提示是使用键盘上的F8 逐步浏览您的宏,它将逐行执行。然后,您可以查看它是否完全跳过了If 语句,这将导致没有任何事情发生。
  • 谢谢指点!最后,这完全是我的错。一个系统导出带有前导空格的数据,而另一个不导出。我使用了 Trim 功能并运行了您的代码,它运行良好。非常感谢您的工作和帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多