2017-06-15 5 views
0

Ich habe die Arbeit mit drei dynamischen Arrays (alle sind Datentyp Double) - sie sindMultiplizieren Sie eine 2D-Array von 1D-Array ein drittes (2D) Array zu erhalten (langsam)

OriningalArray

Dies wird aus einem Bereich zugeordnet werden, dass der Benutzer Ende sehen und wird 2 Dimension

MultiplierArray

sein

Dies sind Multiplikatoren als (die meisten davon sind 1, aber einige werden zwischen + -5% und immer die gleiche Länge wie eine der Dimensionen in OriningalArray sein.

newArray

Dies ist erforderlich, da es bestimmte Rabatte, die auf die OriningalArray und beide Dimension die gleiche Größe wie es sein wird, angewendet werden müssen.

Hier ist ein Beispiel für eine visuelle Referenz ist:

enter image description here

ich Code habe, warum ich tue es auf diese Weise (dies ist nur ein Beispiel arbeitet zu erklären (siehe unten) und hat gesagt, es auch und tatsächliche Datengröße wird viel größer), aber hoffte, dass jemand sagen könnte mir, wie es weiter zu optimieren:

Sub Test() 
Dim OriningalArray() As Double ' I can't declare it a Variant and then assign it straight from the range (OriningalArray = Rng) because there may be "N/A" values in the range which, when put into an Variant Array, gives false Double value 
Dim MultiplierArray() As Variant 
Dim NewArray() As Double 
Dim Rng As Range 
Dim MultiplierRng As Range 
Dim x As Long, y As Long 

Set Rng = Range("D4:I9") 
Set MultiplierRng = Range("D12:I12") 

ReDim OriningalArray(1 To Rng.Rows.Count, 1 To Rng.Columns.Count) ' 2D Array the sze of the range 
ReDim NewArray(1 To Rng.Rows.Count, 1 To Rng.Columns.Count) ' 2D Array the sze of the range 

MultiplierArray = MultiplierRng 

On Error Resume Next ' Turn off error handler to stop macro crashing when trying to assign "N/A" as a Double 
For x = 1 To Rng.Columns.Count 
    For y = 1 To Rng.Rows.Count 
     OriningalArray(y, x) = Rng.Cells(y, x).Value 
     NewArray(y, x) = OriningalArray(y, x) * MultiplierRng(1, x) 
     'Debug.Print OriningalArray(y, x) 
     'Debug.Print NewArray(y, x) 
    Next y 
Next x 
On Error GoTo 0 

End Sub 

Antwort

3

Quicker zu laden, die Arrays in einem Hit:

OriningalArray = Range("D4:I9").Value2 

und durchlaufen Sie dann die Arrays, die die Multiplikation durchführen. Oder nur Evaluate verwenden, um die Felder in erster Linie zu berechnen:

Dim NewArray 
NewArray = Activesheet.Evaluate("D4:I9*D12:I12") 
+0

Dank dafür, aber alle Werte in 'NewArray' zurückkehrt '0' – Jeremy

+0

Dann ist es entweder das falsche Blatt oder die falschen Bereiche. – Rory

+0

Sie haben recht - ich hatte das Activesheet geändert, ohne es zu merken - danke! – Jeremy

Verwandte Themen