SumIfs函数返回异常:Q3/Q4细分数据为0,总计结果正常
问题分析与修复方案
你遇到的问题核心是季度细分数据的Prime Model匹配条件引用了错误的单元格,导致Q3、Q4的SumIfs找不到符合条件的数据,返回0;而总计数据因为没有Prime Model的筛选条件,所以不受影响,结果正确。
问题根源
看你代码里的季度细分循环,比如Q3的这段:
'Q3 breakdown For r = 60 To 76 For c = 2 To 11 wsSnapshot.Cells(r, c) _ = Application.WorksheetFunction.SumIfs(CrtRgnQ3, CrtRgnPrime, CrtQ3Prime.Offset(r - 3, 0), _ CrtRgnCat, CrtCat.Offset(0, c - 2), CrtRgnYr, CrtYrList) Next c Next r
CrtQ3Prime是$A$60,你用Offset(r - 3, 0)来获取当前行的Prime Model值。当r=60时,r-3=57,相当于引用了A60往下偏移57行的单元格(也就是A117),这个单元格大概率是空的或者没有匹配的Prime Model值,自然SumIfs返回0。
而Q1、Q2看似正确,大概率是巧合:比如A3:A19(年度Prime Model列表)的内容和A22:A38(Q1的Prime Model列表)完全一致,而你用r-3时,Q1的r=22对应A22+19=A41,但如果A41的内容刚好和A22一致,就会误打误撞得到正确结果——但这是错误的逻辑。
修复后的代码
把每个季度细分循环里的Offset(r - 3, 0)改成对应循环起始行的偏移量,也就是用当前行号减去循环的起始行,这样就能正确引用当前行的Prime Model值:
'Q1 breakdown For r = 22 To 38 For c = 2 To 11 wsSnapshot.Cells(r, c) _ = Application.WorksheetFunction.SumIfs(CrtRgnQ1, CrtRgnPrime, CrtQ1Prime.Offset(r - 22, 0), _ CrtRgnCat, CrtCat.Offset(0, c - 2), CrtRgnYr, CrtYrList) Next c Next r 'Q2 breakdown For r = 41 To 57 For c = 2 To 11 wsSnapshot.Cells(r, c) _ = Application.WorksheetFunction.SumIfs(CrtRgnQ2, CrtRgnPrime, CrtQ2Prime.Offset(r - 41, 0), _ CrtRgnCat, CrtCat.Offset(0, c - 2), CrtRgnYr, CrtYrList) Next c Next r 'Q3 breakdown For r = 60 To 76 For c = 2 To 11 wsSnapshot.Cells(r, c) _ = Application.WorksheetFunction.SumIfs(CrtRgnQ3, CrtRgnPrime, CrtQ3Prime.Offset(r - 60, 0), _ CrtRgnCat, CrtCat.Offset(0, c - 2), CrtRgnYr, CrtYrList) Next c Next r 'Q4 breakdown For r = 79 To 95 For c = 2 To 11 wsSnapshot.Cells(r, c) _ = Application.WorksheetFunction.SumIfs(CrtRgnQ4, CrtRgnPrime, CrtQ4Prime.Offset(r - 79, 0), _ CrtRgnCat, CrtCat.Offset(0, c - 2), CrtRgnYr, CrtYrList) Next c Next r
额外优化建议
为了避免类似的偏移量错误,你可以把循环的起始行定义成变量,比如:
Dim q1StartRow As Integer: q1StartRow = 22 Dim q1EndRow As Integer: q1EndRow = 38
然后用Offset(r - q1StartRow, 0),这样代码可读性更高,也不容易出错。
内容的提问来源于stack exchange,提问作者Jane H
相关产品推荐
相关产品推荐

