【问题标题】:Excel VBA to match row data from two columns in two different workbooks and copy dataExcel VBA匹配两个不同工作簿中两列的行数据并复制数据
【发布时间】:2021-09-08 04:03:25
【问题描述】:

我有两个不同的工作簿,wb1 和 wb2。我需要一个 VBA 脚本,它将匹配每个工作簿中两列的行数据,然后将偏移单元格从 wb2 复制到 wb1,循环遍历每一行的整个工作簿。我发现this post 非常接近,但是它不会将两列中的数据视为要匹配的单个数据。如果不先将列合并到单个单元格中,这可能吗?任何帮助将不胜感激。

我需要的样本

我需要什么的清晰图片

这是我从引用的帖子中修改的代码,许多项目都被注释掉了,因为我一直在努力使它工作和故障排除。

Dim w1 As Worksheet, w2 As Worksheet
Dim c As Range
Dim FR As Variant '<-- use Variant to allow catching a Error value
Dim ws1Range As Range, ws2Range As Range

Set w1 = Workbooks("Job Number with Labor Code.xlsx").Worksheets("LaborData")
Set w2 = Workbooks("Labor Report Project Hours.xlsx").Worksheets("Sheet1")
Set ws1Range1a = w1a.Range("C4", w1.Range("C" & w1.Rows.Count).End(xlUp))
Set ws1Range1b = w1b.Range("D4", w1.Range("D" & w1.Rows.Count).End(xlUp))
Set ws2Range = w2.Range("A8", w2.Range("B" & w1.Rows.Count).End(xlUp))

'w1.Activate
'ws1Range.Select
'w2.Activate
'ws2Range.Select

For Each c In ws1Range
MsgBox (c.Value)
    FR = Application.Match(c.Value, ws2Range, 0)
    If Not IsError(FR) Then
      'MsgBox (c.Value)

'        ' To copy formula and format
'        'ws1Range.Cells(FR, 2).Resize(, 2).Copy Destination:=c.Cells(1, 2).Resize(, 2)
            
'        ' to copy only values
'        'c.Cells(1, 2).Resize(, 2) = ws1Range.Cells(FR, 2).Resize(, 2)
         'c.Cells.Select

'        ' To copy values and format
'        c.Cells(1, 2).Resize(, 2) = ws1Range.Cells(FR, 2).Resize(, 2)
'        ws1Range.Cells(FR, 2).Resize(, 2).Copy
'        c.Cells(1, 2).Resize(, 2).PasteSpecial Paste:=xlPasteFormats
    End If
Next c

【问题讨论】:

  • 您能否修改您的图像以获取更有意义的数据并更清楚地说明您想要实现的目标?我看到了您的图表,但不清楚您在第二列中想要什么?和第一列一样吗?使用不同的值来说明目标(用一堆零值很难分辨)。
  • 您好,我添加了一个清晰的图像,要匹配的数据样本被突出显示,要复制的数据显示得更好。谢谢。
  • "如果不先将列合并到一个单元格中,这是否可行?"是的,是的。您可以将字符串(例如 stringOfTwoCells = Cells(a,1).Value &amp; Cells(a,2).Value)与 if 语句或许多其他方式进行比较。即使没有 VBA,您也可以使用公式数组来执行此操作,例如 ={Match(A2&amp;B2", Sheet2!A:A&amp;Sheet2!B:B,0)}

标签: excel vba


【解决方案1】:

使用Dictionary Object 作为带有复合键的查找。

Option Explic
Sub macro1()

    Dim w1 As Worksheet, w2 As Worksheet
    Dim iLastRow As Long, r As Long
    Dim dict As Object, key As String, ar
    Set dict = CreateObject("Scripting.Dictionary")

    ' build lookup from sheet2
    Set w2 = Workbooks("Labor Report Project Hours.xlsx").Worksheets("Sheet1")
    iLastRow = w2.Cells(Rows.Count, "A").End(xlUp).Row
    ar = w2.Range("A1:C" & iLastRow).Value2
    
    For r = 8 To UBound(ar)
        key = ar(r, 1) & vbTab & ar(r, 2)
        If Len(key) > 1 Then ' skip blanks
            If dict.exists(key) Then
                MsgBox "Duplicate key '" & key & "'", vbCritical, "Row " & r
                Exit Sub
            Else
                dict.Add key, ar(r, 3)
            End If
        End If
    Next

    ' update sheet1
    Set w1 = Workbooks("Job Number with Labor Code.xlsx").Worksheets("LaborData")
    iLastRow = w1.Cells(Rows.Count, "C").End(xlUp).Row
    For r = 4 To iLastRow
        key = w1.Cells(r, "C") & vbTab & w1.Cells(r, "D")
        If dict.exists(key) Then
            w1.Cells(r, "F") = dict(key)
        End If
    Next
    MsgBox "Ended"
    
End Sub

【讨论】:

  • 效果很好,非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多