使用范围或数组进行简单操作的结果不同

Psp*_*spl 6 arrays excel vba

我工作VBA了很长时间,我对它很有经验.然而,有时候,它仍然让我的思绪充满了他的异想天开......为了给我的所有同事创建一个具有一些可访问功能的文件,我选择在脚本上进行每一次计算.为此,我使用一些double数据填充数组:

Dim DT01() As Double: ReDim DT01(1 To N03) As Double
Dim R As Long: R = 1: Dim N As Long: Dim P As Double
For x = 1 To N01
    N = SH01.Cells(x + 4, 15).Value: P = SH01.Cells(x + 4, 14).Value
    For y = 1 To N: DT01(R) = P: R = R + 1: Next y
Next x
Run Code Online (Sandbox Code Playgroud)

DT01阵列是相当长的(N03 = 495258)和前一程序填充,正如我预期的阵列.我甚至做了以下事情:

For x = 1 To 495258
    SH01.cells(x, 1).FormulaR1C1 = DT01(x)
Next x
Run Code Online (Sandbox Code Playgroud)

检查我是否在脚本上填写了数组错误.这段代码可以正确地写入工作表的第一列,并SH01使用正确的数组值.

如果我计算列的总和,我得到了292547224.4,这是正确的值.不过,如果我使用Application.Sum(DT01)VBA,我得到了1535172.8.当我看到这个时,我试图计算其他东西,结果总是不同的:

'On Excel:
    =AVERAGE(A1:A495258) = 598,6
'On VBA:
    Application.Average(DT01) = 42.1

'On Excel:
    =MAX(A1:A495258) = 3622.7
'On VBA:
    Application.Max(DT01) = 186.8    

'On Excel:
    =COUNT(A1:A495258) = 495258
'On VBA:
    Application.Count(DT01) = 36506
Run Code Online (Sandbox Code Playgroud)

当我看到最后的结果时,我立刻知道我不得不问别人这个......有谁知道这里发生了什么?

更新:

我尝试loop通过所有它的术语来计算数组的总和:

Dim SIGMA As Double: SIGMA = 0
For x = 1 To UBound(DT01)
    SIGMA = SIGMA + DT01(x)
Next x
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果(292547224.4),为什么我还能和他1535172.8在一起Application.Sum(DT01)

QHa*_*arr 5

这不是一个理想的答案,所以有人可以通过体面的文档充实.我发现VBA中的数组上的SUM仅适用于长度36506(从1开始).

但是,您可以将值数组写入范围,然后将该范围引用传递给 Application.Sum并获取正确的值.

Option Explicit
Public Sub test()
    Dim rng As Range, c As Range, i As Long
    Set rng = Range("A1:A495258") 'A1 has value 1, A2 has 2 etc.

    Debug.Print "Application.Sum(rng) " & Application.Sum(rng)   '<==  122640490911
    Debug.Print " Application.Sum(Application.Transpose(rng.Value)) " & Application.Sum(Application.Transpose(rng.Value))   '<== 666362271

    Dim arr3()
    ReDim arr3(1 To 495258)
    For Each c In rng
        i = i + 1
        arr3(i) = c.Value
    Next

    Debug.Print " Application.Sum(arr3) with  arr3(1 To 495258) " & Application.Sum(arr3)
    Debug.Print "Application.WorksheetFunction.Sum(arr3) " & Application.WorksheetFunction.Sum(arr3)
End Sub
Run Code Online (Sandbox Code Playgroud)

或者编写自己的自定义1d和函数:

Option Explicit

Public Sub test()
    Dim arr3(), c As Range, rng As Range, i As Long
    Set rng = Range("A1:A495258")
    ReDim arr3(1 To 495258)
    For Each c In rng
        i = i + 1
        arr3(i) = c.Value
    Next
    Debug.Print SumArray(arr3)
End Sub

Public Function SumArray(ByVal arr As Variant) As Variant ' double
    Dim i As Long
    For i = LBound(arr, 1) To UBound(arr, 1)
        SumArray = SumArray + arr(i)
    Next
End Function
Run Code Online (Sandbox Code Playgroud)