excel - Excel VBA匹配两个不同工作簿中两列的行数据并复制数据
问题描述
我有两个不同的工作簿,wb1 和 wb2。我需要一个 VBA 脚本,它将匹配每个工作簿中两列的行数据,然后将偏移单元格从 wb2 复制到 wb1,循环遍历每一行的整个工作簿。我发现这篇文章非常接近,但是它不会将两列中的数据视为要匹配的单个数据。如果不先将列合并到单个单元格中,这可能吗?任何帮助将不胜感激。
这是我从引用的帖子中修改的代码,许多项目都被注释掉了,因为我一直在努力让它工作和故障排除。
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
解决方案
使用字典对象作为带有复合键的查找。
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
推荐阅读
- c++ - 仅专门化模板类的一部分,同时保持其余部分通用
- python - 仅返回 1 行。但是我有超过 1000 行。我该如何解决?
- gremlin - Gremlin:重复直到断点,并将顶点批处理在一起以产生一个值
- android - 将按钮和搜索栏放入容器中
- javascript - 访问嵌套对象内的数据
- powershell - Invoke-Command 不会返回到本地计算机,但已安装软件
- python - 在python中使用套接字发送https请求
- split - PowerBI - 拆分表(规范化)
- mysql - SQL Join ON 子句对别名的有效引用
- typescript - Inversify 无法注入具有依赖项的类