You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个Workbook指定列,匹配后迁移三列数据至目标Workbook

多列匹配的数据迁移VBA代码修改

原代码仅支持源工作簿与目标工作簿的单列对比,并迁移两列数据。现修改为基于两列匹配,匹配成功时将源工作簿的三列数据写入目标工作簿指定列。

修改后的完整代码

Sub LookupDataByTwoColumns()

' 定义常量:适配两列匹配、三列数据迁移需求
Const SRC_FILE_NAME As String = "Source.xlsx"
Const SRC_WORKSHEET_ID As Variant = 1
Const SRC_LOOKUP_COLUMNS As String = "A,B" ' 源工作簿用于匹配的两列
Const SRC_VALUE_COLUMNS As String = "C,D,E" ' 源工作簿要迁移的三列

Const DST_FILE_NAME As String = "Destination.xlsx"
Const DST_WORKSHEET_ID As Variant = 1
Const DST_LOOKUP_COLUMNS As String = "D,E" ' 目标工作簿用于匹配的两列
Const DST_VALUE_COLUMNS As String = "H,I,J" ' 目标工作簿接收数据的三列

Dim FolderPath As String: FolderPath = Application.DefaultFilePath & "\"

' 引用源工作簿及数据区域
Dim swb As Workbook: Set swb = Workbooks.Open(FolderPath & SRC_FILE_NAME)
Dim sws As Worksheet: Set sws = swb.Sheets(SRC_WORKSHEET_ID)

Dim srg As Range, srCount As Long
With sws.Range("A1").CurrentRegion
    srCount = .Rows.Count - 1 ' 排除表头行
    Set srg = .Resize(srCount).Offset(1)
End With

' 读取源工作簿两列匹配数据,生成复合键存入字典
Dim slCols() As String: slCols = Split(SRC_LOOKUP_COLUMNS, ",")
Dim slData1() As Variant: slData1 = srg.Columns(slCols(0)).Value
Dim slData2() As Variant: slData2 = srg.Columns(slCols(1)).Value

Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = vbTextCompare

Dim sr As Long, sCompositeKey As String
For sr = 1 To srCount
    ' 用分隔符拼接两列值,生成唯一复合匹配键
    sCompositeKey = CStr(slData1(sr, 1)) & "|" & CStr(slData2(sr, 1))
    If Not dict.Exists(sCompositeKey) Then
        dict(sCompositeKey) = sr ' 存储对应数据行号
    End If
Next sr

Erase slData1: Erase slData2

' 读取源工作簿要迁移的三列数据到数组
Dim sValCols() As String: sValCols = Split(SRC_VALUE_COLUMNS, ",")
Dim nUpper As Long: nUpper = UBound(sValCols)

Dim sJag() As Variant: ReDim sJag(0 To nUpper)
Dim n As Long
For n = 0 To nUpper
    sJag(n) = srg.Columns(sValCols(n)).Value
Next n

' 引用目标工作簿及数据区域
Dim dwb As Workbook: Set dwb = Workbooks.Open(FolderPath & DST_FILE_NAME)
Dim dws As Worksheet: Set dws = dwb.Sheets(DST_WORKSHEET_ID)

Dim drg As Range, drCount As Long
With dws.Range("A1").CurrentRegion
    drCount = .Rows.Count - 1 ' 排除表头行
    Set drg = .Resize(drCount).Offset(1)
End With

' 读取目标工作簿两列匹配数据
Dim dlCols() As String: dlCols = Split(DST_LOOKUP_COLUMNS, ",")
Dim dlData1() As Variant: dlData1 = drg.Columns(dlCols(0)).Value
Dim dlData2() As Variant: dlData2 = drg.Columns(dlCols(1)).Value

' 初始化目标数据存储数组
Dim dValCols() As String: dValCols = Split(DST_VALUE_COLUMNS, ",")
Dim dJag() As Variant: ReDim dJag(0 To nUpper)

Dim dHelp() As Variant: ReDim dHelp(1 To drCount, 1 To 1)
For n = 0 To nUpper
    dJag(n) = dHelp
Next n
Erase dHelp

' 对比复合键,匹配时写入对应数据
Dim dr As Long, dCompositeKey As String
For dr = 1 To drCount
    dCompositeKey = CStr(dlData1(dr, 1)) & "|" & CStr(dlData2(dr, 1))
    If dict.Exists(dCompositeKey) Then
        For n = 0 To nUpper
            dJag(n)(dr, 1) = sJag(n)(dict(dCompositeKey), 1)
        Next n
    End If
Next dr

' 将迁移数据写入目标工作簿指定列
For n = 0 To nUpper
    drg.Columns(dValCols(n)).Value = dJag(n)
Next n

' 保存并关闭工作簿
dwb.Close SaveChanges:=True
swb.Close SaveChanges:=True

MsgBox "数据匹配迁移完成。", vbInformation

End Sub

关键改动说明

  • 常量适配:将原单列匹配的常量改为双列配置,同时扩展值列数量为三列,直接对应新需求。
  • 复合匹配键:把源/目标工作簿的两列值用|拼接成唯一键,确保只有两列同时匹配时才触发数据迁移。
  • 数组逻辑调整:修改匹配数据的读取逻辑,从单列数组改为双列数组,同时扩展值列数组的长度以支持三列数据的存储与写入。

内容的提问来源于stack exchange,提问作者Rokas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:15:54