VBA计算列数据最值、均值异常求助(WorksheetFunction不可用)
VBA统计代码错误排查与修正
核心错误点
- 变量未初始化:
fMax、fMin声明后未赋初始值,正常运行时默认值为0,调试时可能因残留值导致结果“看似正确”,实际逻辑失效。 - 范围引用错误:
With块内的Range未加.,导致引用当前活动工作表而非指定的wbTarget.Sheet1,数据来源混乱。 - 循环越界:
i从6到22时,i+1会指向23行(超出数据范围),引发无效单元格引用。 - 最值逻辑混乱:通过“当前行与下一行比较”更新最值的逻辑,无法覆盖所有数据场景(比如最大值出现在中间行时会被遗漏)。
- 均值计算错误:除以
NewLastRow(22)而非实际数据行数(17行);用Long类型存储均值会丢失小数精度。 - 变量重定义:Sub参数与内部声明的
fMax、fMin、fMean重名,引发作用域冲突。 - 冗余代码:
For循环本身有结束条件,额外的If i>NewLastRow Then Exit For完全多余。
修正后的代码
Sub Stats(NewLastRow As Integer, ByRef fMax As Long, ByRef fMin As Long, ByRef fMean As Double, fMedian As Variant, fSpread As Variant) ' 固定起始行 Const START_ROW As Integer = 6 Dim i As Integer Dim ws As Worksheet Dim total As Double Dim rowCount As Integer ' 绑定目标工作表,避免引用错误 Set ws = wbTarget.Worksheets("Sheet1") ' 计算实际数据行数 rowCount = NewLastRow - START_ROW + 1 ' 用第一个数据初始化最值和总和 fMax = CLng(ws.Range("E" & START_ROW).Value) fMin = CLng(ws.Range("E" & START_ROW).Value) total = CLng(ws.Range("E" & START_ROW).Value) ' 遍历剩余数据,同步计算最值与总和 For i = START_ROW + 1 To NewLastRow Dim currentVal As Long currentVal = CLng(ws.Range("E" & i).Value) If currentVal > fMax Then fMax = currentVal If currentVal < fMin Then fMin = currentVal total = total + currentVal Next i ' 计算均值(用Double保留精度) fMean = total / rowCount ' 输出结果 MsgBox "最大值: " & fMax & vbCrLf & "最小值: " & fMin & vbCrLf & "均值: " & Round(fMean, 2) End Sub
调用示例
Sub TestStats() Dim lastRow As Integer Dim maxVal As Long Dim minVal As Long Dim meanVal As Double lastRow = 22 Call Stats(lastRow, maxVal, minVal, meanVal, Empty, Empty) End Sub
内容的提问来源于stack exchange,提问作者Ven
相关产品推荐
相关产品推荐

