链接不同工作表中的数据字段

时间:2015-10-05 18:11:28

标签: excel vba excel-vba columnsorting

我有报告说我经常从两个不同的来源运行,这两个来源都有一个唯一的标识符,用于链接两个报告中的数据(我将调用字段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

1 个答案:

答案 0 :(得分:1)

这是我能得到的。我假设你的表单是#A;"是您希望将数据复制到 的原始工作表,以及" VM"是您正在搜索要从复制的数据的工作表(如果它向后更改,则更改此选项)。我还将变量名称更改为更清晰:

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",您的"链接ID"全部在F列中。在" VM"中,"链接ID"都在A栏。

这将在" VM"中找到匹配项,将数据从A列复制到L,然后将其粘贴到" AY",G到S栏中。注意它&#39 ; s不完全是你问的(你要求更换原始表格中的整行),但我这样做是因为它在你的代码中。

而是替换原作中的整行" AY"工作表,将复制目标更改为Destination:=.Cells(i,"A")。 (您可能希望在该行之前添加.Rows(i).Clear以清除该行中的任何数据。)