我工作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)?
这不是一个理想的答案,所以有人可以通过体面的文档充实.我发现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)