带求和功能的VLOOKUP实现:跨工作表数据匹配粘贴问题
嘿,我懂你要的是带求和功能的VLOOKUP——就是把Sheet1里的数据匹配到Sheet2对应条目,把数值累加后精准放到目标单元格对吧?你说现有脚本能算出总和,但没法对应粘贴到正确位置,我给你两个靠谱的解决方案:
方案1:用Excel内置公式快速实现(无需写代码)
这是最省心的方式,直接用SUMIF公式就能完美实现你的需求:
在Sheet2的B2单元格(假设你要把求和结果放在B列,对应A列的条目)输入:
=SUMIF(Sheet1!$A:$A, Sheet2!$A2, Sheet1!$B:$B)
然后把这个公式下拉填充到Sheet2的所有行。
公式解释:
Sheet1!$A:$A:要匹配的关键字区域(Sheet1的A列)Sheet2!$A2:当前行要匹配的目标关键字(Sheet2的A列单元格)Sheet1!$B:$B:要求和的数值区域(Sheet1的B列)
这个公式会自动找到Sheet1中所有和Sheet2当前A列单元格匹配的行,把对应的B列数值加起来,直接显示在Sheet2的B列对应位置,完全不需要手动粘贴。
方案2:修正VBA脚本实现对应粘贴
如果你更倾向用VBA来做,那核心问题应该是你的脚本没正确定位Sheet2的目标单元格。下面这个示例脚本会先把Sheet1的数据按A列关键字分组求和,再逐个匹配Sheet2的条目,把结果写入对应位置:
Sub SumAndMatch() Dim ws1 As Worksheet, ws2 As Worksheet Dim lastRow1 As Long, lastRow2 As Long Dim sumDict As Object Dim i As Long, key As Variant ' 指定工作表 Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") Set sumDict = CreateObject("Scripting.Dictionary") ' 获取Sheet1的最后一行数据 lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row ' 遍历Sheet1,用字典存每个关键字的总和 For i = 2 To lastRow1 ' 假设第一行是表头,要是没有表头就改成i=1 key = ws1.Cells(i, "A").Value If sumDict.Exists(key) Then sumDict(key) = sumDict(key) + ws1.Cells(i, "B").Value Else sumDict(key) = ws1.Cells(i, "B").Value End If Next i ' 获取Sheet2的最后一行数据 lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row ' 遍历Sheet2,把求和结果写入对应B列 For i = 2 To lastRow2 ' 同样,没有表头就改成i=1 key = ws2.Cells(i, "A").Value If sumDict.Exists(key) Then ws2.Cells(i, "B").Value = sumDict(key) Else ws2.Cells(i, "B").Value = 0 ' 要是想留空就改成"" End If Next i ' 清理对象 Set sumDict = Nothing Set ws1 = Nothing Set ws2 = Nothing MsgBox "匹配求和完成!", vbInformation End Sub
脚本逻辑说明:
- 用
Scripting.Dictionary来存储每个关键字对应的总和,避免重复计算 - 先遍历Sheet1,把所有相同关键字的数值累加起来
- 再遍历Sheet2的每一行,找到字典里对应的总和,直接写入该行的B列
这样就彻底解决了“结果没法对应粘贴”的问题——每一行的结果都会精准对应到Sheet2的目标单元格。
如果你的表格结构不一样(比如数值列不是B列、没有表头),只要调整代码里的列号和循环起始行就行。
内容的提问来源于stack exchange,提问作者KiKu
相关产品推荐
相关产品推荐

