Excel VBA中使用单元格引用调用SUM函数报错问题求助
Excel VBA中使用单元格引用调用SUM函数报错问题求助
嘿,我一眼就瞅到你代码里的问题啦——这是VBA里超常见的工作表上下文不匹配坑!
咱们来拆解下出错的那行代码:
Range("AP3") = WorksheetFunction.Sum(Worksheets("Results").Range(Cells(3, AEPC), Cells(LR, AEPC)))
你以为Cells(3, AEPC)和Cells(LR, AEPC)是属于Results工作表的,但实际上没指定工作表的Cells会默认指向当前激活的工作表(也就是你代码里激活的Counts_Tables_Macro)。这就导致你试图让Results表的Range去引用另一张表的单元格,VBA当然会报错啦!
解决方案:给所有单元格对象加明确的工作表限定
你已经定义了Set desiredSheetName = ThisWorkbook.Worksheets("Results"),直接用这个变量来限定所有Cells就行:
修改关键行代码为:
' 方式1:直接用变量限定 Range("AP3") = WorksheetFunction.Sum(desiredSheetName.Range(desiredSheetName.Cells(3, AEPC), desiredSheetName.Cells(LR, AEPC))) ' 方式2:用With块简化代码(更推荐,可读性更高) With desiredSheetName Range("AP3") = WorksheetFunction.Sum(.Range(.Cells(3, AEPC), .Cells(LR, AEPC))) End With
额外优化建议
- 尽量别用
Activate和Select操作——这俩是VBA错误的高发区,还会拖慢代码运行速度。比如你可以直接指定工作表来写入结果,不用先激活:' 替换掉 ActiveWorkbook.Sheets("Counts_Tables_Macro").Activate ' 直接指定工作表写入 ThisWorkbook.Worksheets("Counts_Tables_Macro").Range("AP3") = ... - 可以加个调试输出,确认
AEPC和LR的值是否符合预期:
运行后打开VBA的立即窗口(Ctrl+G)就能看到输出,帮你排查参数是否正确。Debug.Print "AEPC列号:" & AEPC, "最后行数LR:" & LR
修改后的完整示例代码
Sub Functions() Dim desiredSheetName As Worksheet Dim NewName As Worksheet ' 注:这个变量你定义了但没使用,可根据需求清理或补全逻辑 Set desiredSheetName = ThisWorkbook.Worksheets("Results") 'Finding the corresponding AEP box in Results Tab AEPC = WorksheetFunction.Match("5YR", desiredSheetName.Rows(2), 0) 'Finding the residential property Column in Results Tab PropNumC = WorksheetFunction.Match(ThisWorkbook.Worksheets("DATA IN").Range("D2"), desiredSheetName.Rows(2), 0) 'Finding the 'Class' column in Results Tab ** Requires change if column name changes ** ClassC = WorksheetFunction.Match("Class", desiredSheetName.Rows(2), 0) 'Getting last row in Results Tab Dim LR As Long With desiredSheetName LR = .Range("B" & .Rows.Count).End(xlUp).Row End With '测试固定范围求和(保留你的测试代码) ThisWorkbook.Worksheets("Counts_Tables_Macro").Range("AP1") = Application.WorksheetFunction.Sum(Range("AA10:AA12")) ThisWorkbook.Worksheets("Counts_Tables_Macro").Range("AP2") = WorksheetFunction.Sum(desiredSheetName.Range("DU3:DU17079")) '修复后的动态范围求和 With desiredSheetName ThisWorkbook.Worksheets("Counts_Tables_Macro").Range("AP3") = WorksheetFunction.Sum(.Range(.Cells(3, AEPC), .Cells(LR, AEPC))) End With End Sub
备注:内容来源于stack exchange,提问作者Matthew Farnham
相关产品推荐
相关产品推荐

