VBA技术求助:DATA工作表列末3单元格相乘后写入Report工作表
修正VBA代码:实现两列最后3个单元格相乘并写入Report表
首先咱们先拆解原代码里的几个关键问题:
- 未定义/赋值
lRow变量:你用到了lRow - 2但没先获取DATA工作表的最后一行行号,这会直接触发运行错误 - 错误复用
lRow到Report表:lRow是DATA表的行号,直接拿来用在Report表的单元格引用上逻辑完全不对 - AutoFill逻辑偏离需求:原代码的AutoFill没有实现“两列最后3个单元格相乘”的核心目标,反而只是复制B列内容
- 不必要的
Activate/Select操作:这些步骤不仅拖慢代码,还容易因为工作表切换出现意外问题
修正后的完整代码
Sub CalculateAndTransferData() Dim wsData As Worksheet Dim wsReport As Worksheet Dim lastRowData As Long Dim i As Integer ' 定义工作表对象,彻底避免Activate/Select操作 Set wsData = ThisWorkbook.Sheets("DATA") Set wsReport = ThisWorkbook.Sheets("Report") ' 获取DATA表数据区域的最后一行行号(这里默认用A列,你可以改成实际数据列) lastRowData = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row ' 提前检查数据量,避免行数不足时报错 If lastRowData < 3 Then MsgBox "DATA表中数据不足3行,无法执行操作!" Exit Sub End If ' 1. 将DATA表A列最后3个单元格复制到Report的B9:B11 wsData.Range("A" & lastRowData - 2 & ":A" & lastRowData).Copy wsReport.Range("B9").PasteSpecial Paste:=xlPasteValues ' 只粘贴值,避免格式干扰 ' 2. 设置Report表的表头文本 wsReport.Range("B8").Value = "Month" wsReport.Range("C8").Value = "Production Cost" wsReport.Range("D8").Value = "Inventory Cost" wsReport.Range("E8").Value = "Total Cost" wsReport.Range("B12").Value = "Total" ' 3. 核心逻辑:计算两列最后3个单元格的乘积(这里假设是A列和B列相乘,可按需修改列号) For i = 0 To 2 wsReport.Cells(9 + i, "C").Value = wsData.Cells(lastRowData - 2 + i, "A").Value * _ wsData.Cells(lastRowData - 2 + i, "B").Value Next i ' (可选)添加Total行的合计公式 wsReport.Range("C12").Formula = "=SUM(C9:C11)" ' 清除剪贴板,避免后续弹出粘贴提示 Application.CutCopyMode = False End Sub
关键修改说明
- 用工作表对象替代Activate:直接绑定
wsData和wsReport,不用频繁切换工作表,代码更稳定高效 - 准确获取数据最后一行:通过
Cells(Rows.Count, "A").End(xlUp).Row精准定位DATA表的数据末尾,还加了数据量校验 - 实现相乘核心需求:用循环遍历最后3行数据,计算指定两列的乘积并写入Report表,完全匹配你的需求
- 优化复制粘贴逻辑:如果只需要数值,直接赋值比复制粘贴更高效,还能避免格式冲突
- 添加错误防护:提前判断数据行数,防止因数据不足导致的运行错误
内容的提问来源于stack exchange,提问作者PaperCupStraw
相关产品推荐
相关产品推荐

