如何修改VBA代码实现复制值而非公式并累加?
解决VBA复制值并累加的问题
方法一:改进PasteSpecial操作
你的第一段代码未明确指定仅粘贴值,默认会粘贴包括公式在内的全部内容。修改后指定Paste:=xlPasteValues,同时保留累加操作即可:
Book.Sheets(Site).Range("BE19:CN57").Copy OtherBook.Sheets(site).Range("BE19:CN57").PasteSpecial _ Paste:=xlPasteValues, _ Operation:=xlPasteSpecialOperationAdd Application.CutCopyMode = False ' 清理剪贴板,避免弹窗提示
方法二:通过数组直接计算累加(效率更高)
第二段代码未处理空值可能导致的运算错误,且直接操作Range对象不如数组高效。改用数组存储值后遍历累加:
Dim sourceVals As Variant Dim targetVals As Variant Dim i As Long, j As Long ' 读取源区域和目标区域的计算值(自动转为二维数组) sourceVals = Book.Sheets(site).Range("BE19:CN57").Value targetVals = OtherBook.Sheets(site).Range("BE19:CN57").Value ' 遍历数组完成累加,处理空值避免报错 For i = LBound(sourceVals, 1) To UBound(sourceVals, 1) For j = LBound(sourceVals, 2) To UBound(sourceVals, 2) If IsEmpty(targetVals(i, j)) Then targetVals(i, j) = 0 If IsEmpty(sourceVals(i, j)) Then sourceVals(i, j) = 0 targetVals(i, j) = targetVals(i, j) + sourceVals(i, j) Next j Next i ' 将累加结果写回目标区域 OtherBook.Sheets(site).Range("BE19:CN57").Value = targetVals
注意事项
- 确保变量
Site和site的大小写一致(VBA默认不区分大小写,但统一写法更稳妥) - 如果目标区域存在空单元格,直接相加会导致错误,方法二中的空值处理可以避免这个问题
- 数组方法适合大区域操作,比剪贴板操作更快且不会干扰用户剪贴板
内容的提问来源于stack exchange,提问作者ADAN ALEJANDRO RAMIREZ QUINTER
相关产品推荐
相关产品推荐

