Multiplying Array Columns
Sub ArrayTest()
Dim tT As Double: tT = Timer
Const rCount As Long = 2000 ' the same
Const scCount As Long = 20 ' different
' Populate the source array ('sData').
Dim sData() As Double: ReDim sData(1 To rCount, 1 To scCount)
Dim r As Long
Dim sc As Long
For r = 1 To rCount ' by rows
For sc = 1 To scCount
With WorksheetFunction
On Error Resume Next ' 'Norm_Inv' may raise an error
sData(r, sc) = .Sum(.Norm_Inv(Rnd(), 0, 1) / 100, 1)
On Error GoTo 0
End With
Next sc
Next r
Dim sT As Double: sT = Timer - tT
' Populate the destination array ('dData').
Dim dcCount As Long: dcCount = scCount - 1 ' one less column
Dim dData() As Double: ReDim dData(1 To rCount, 1 To dcCount)
Dim nsc As Long ' next
Dim dc As Long ' current
Dim pdc As Long ' previous
' First column:
For r = 1 To rCount ' current source * next source
dData(r, 1) = sData(r, 1) * sData(r, 2)
Next r
' Remainder of columns:
For dc = 2 To dcCount ' by columns
nsc = dc + 1
pdc = dc - 1
For r = 1 To rCount ' previous destination * next source
dData(r, dc) = dData(r, pdc) * sData(r, nsc)
Next r
Next dc
tT = Timer - tT
Debug.Print "Source time = " & sT
Debug.Print "Destination time = " & tT - sT
Debug.Print "Total time = " & tT
' Write to a worksheet.
' With Sheet1
' .UsedRange.Clear
' With .Range("A1").Resize(, dcCount)
' .Value = Application.Transpose( _
' .Worksheet.Evaluate("""Col ""&ROW(1:" & dcCount & ")"))
' .Offset(1).Resize(rCount).Value = dData
' .EntireColumn.AutoFit
' End With
' End With
End Sub
Results
Source Time = 0,4609375
Destination Time = 0,01513671875
Total Time = 0,47607421875
The results for 200k rows show the efficiency better:
Source time = 48,181884765625
Destination time = 0,3291015625
Total time = 48,510986328125
arrhas 2001 rows and 21 columns.