为什么“平均”的 VBA 代码生成的结果不同于 Excel SUM()?

问题描述 投票:0回答:3

VBA 代码 Worksheet 函数的结果。平均值与 Excel +SUM(range) 函数得到的结果不同。

我已经编写了如下的 VBA 脚本,以计算一个名为“tart”的范围内特定值的出现次数,然后计算相关的平均值、最大值和最小值:

为了仔细检查生成的平均值,我使用了 Excel 的 SUM()/35 函数。我期望相同的平均值,但是这两种方法带来了不同的结果。

而且指定范围内的Max和Min值实际上是不正确的

Sub freq()

Worksheets("feldolg").Activate
Dim tart As Range
    Set tart = Range("B2:H1222")
Dim nums As Byte
    nums = InputBox("blabla ?", "blabla")
    
    For szam = 1 To nums
Cells(2, 11).Offset(0, szam - 1) = WorksheetFunction.CountIf(tart, szam)
Cells(2, 11).Offset(0, nums + 1) = WorksheetFunction.Average(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1))
Cells(2, 11).Offset(0, nums + 3) = WorksheetFunction.Max(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1))
Cells(2, 11).Offset(0, nums + 5) = WorksheetFunction.Min(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1))
    Next szam

         'MsgBox Range(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1)).Cells.Count
         'MsgBox Cells(2, 11).Offset(0, nums - 1).Address
End Sub

代码参数已经检查了好几次,对我来说它们似乎是正确的。我做错了什么?

vba sum average
3个回答
0
投票

您没有给平均值、最大值或最小值范围,而是给它两个单元格。它不是在单元格之间搜索,它只是查看这两个单元格。您可能打算将这两个单元格作为

Range()
中的参数,例如
Range(Cells(...), Cells(...))

Cells(2, 11).Offset(0, szam - 1) = WorksheetFunction.CountIf(tart, szam)
Cells(2, 11).Offset(0, nums + 1) = WorksheetFunction.Average(Range(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1)))
Cells(2, 11).Offset(0, nums + 3) = WorksheetFunction.Max(Range(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1)))
Cells(2, 11).Offset(0, nums + 5) = WorksheetFunction.Min(Range(Cells(2, 11), Cells(2, 11).Offset(0, nums - 1)))

我建议使用变量清理代码

Dim c As Range: Set c = Cells(2, 11)
Dim data As Range: Set data = c.resize(1, nums)

c.Offset(0, szam - 1) = WorksheetFunction.CountIf(tart, szam)
c.Offset(0, nums + 1) = WorksheetFunction.Average(data)
c.Offset(0, nums + 3) = WorksheetFunction.Max(data)
c.Offset(0, nums + 5) = WorksheetFunction.Min(data)

0
投票

你说得对,这就是我的目的。上面建议的解决方案可行,谢谢 Toddleson。 然而,这给我带来了一个新问题要解决,但我无法成功: 错误消息说:“当前范围内的重复声明” 并且“Dim nums as Byte”表达式被标记。但我看不到它在任何地方重复。

Sub freq()
Worksheets("feldolg").Activate
Dim c As Range: Set c = Cells(2, 11)
Dim data As Range: Set data = c.Resize(1, nums)
Dim tart As Range:    Set tart = Range("B2:H1222")
Dim nums As Byte:   Set nums = InputBox("bla", "blabla")

    For szam = 1 To nums
        c.Offset(0, szam - 1) = WorksheetFunction.CountIf(tart, szam)
        c.Offset(0, nums + 1) = WorksheetFunction.Average(data)
        c.Offset(0, nums + 3) = WorksheetFunction.Max(data)
        c.Offset(0, nums + 5) = WorksheetFunction.Min(data) 
    Next szam
End Sub

-2
投票

我对VBA不熟悉,无法检查代码是否有问题。 单元格中的值是某种东西的比率吗?您可能已经熟悉:比率平均值的计算方式必须不同于数字平均值。也许 Worksheet 函数很“聪明”,使用了不同的平均值。

© www.soinside.com 2019 - 2024. All rights reserved.