2016-04-16 21 views
1

Ich möchte ein Stück Code erstellen, mit dem ich einen Wert von einem Array einem anderen Array zuweisen kann, die unterschiedliche Längen haben. Das habe ich bisher.Wie kann ich einen Wert in einem Array den Wert in einem anderen Array (VBA) machen?

A(1) = 0 
A(2) = 0 
A(3) = 6 
A(4) = 5 
A(5) = 7 

n = 0 

For i = 1 To 5 
If A(i) <> 0 Then 
    n = n + 1 
End If 
Next i 

ReDim B(1 To n) As Integer 
For j = 1 To n 
    For i = 1 To 5 
     If A(i) <> 0 Then 
      B(j) = A(i) 
     End If 
    Next i 
Next j 

MsgBox B(2) 

Im Moment auf 7 zurückkehrt, während es 5 zurückgeben sollte, werden alle Werte in B 7. Wie kann ich diesen Code ausführen?

+0

Ihr Code scheint darauf hinzuweisen, dass Sie keine 0-Werte kopieren möchten. Wenn Sie also ein Array '(4, 2, 0, 8, 9)' hätten, hätten Sie 'B' nur mit 4 Elementen, wie' (4, 2, 8, 9) '? – trincot

+0

Sie Code ist ein bisschen komisch :) Ich verstehe nur nicht, was das Endziel ist. Was Sie tun: In der ersten Schleife zählen Sie die Werte, die nicht 0 sind, es sollte "n = 3" ergeben. Danach haben Sie 2 verschachtelte Schleifen. Der erste wird 3 Mal ausgeführt, der zweite (verschachtelt) ordnet dem B-Array die Werte in A zu, die nicht 0 sind. Aber das Endergebnis ist immer das Gleiche: Es wird B den allerletzten Wert von A zuweisen, der nicht ist 0, also '7', und du landest mit 7 überall. Sie müssen wirklich genau angeben, was Sie wollen, mit Daten des erwarteten Ergebnisses. –

Antwort

2

Die Tatsache, dass Sie verschachtelte Schleifen haben, sollten Sie alarmieren: Dies würde n * 5 mal ausgeführt werden, was nicht korrekt sein kann.

Ändern Sie den zweiten Teil, so dass es nur eine Schleife verwendet, wie folgt aus:

ReDim B(1 To n) As Integer 
j = 1 
For i = 1 To UBound(A) 
    If A(i) <> 0 Then 
     B(j) = A(i) 
     j = j + 1 
    End If 
Next i 

Beachten Sie auch, dass Ihr Code allgemeinere Verwendung UBound statt 5 macht. Beachten Sie auch, dass diese Schleife der Schleife, die n berechnet, sehr ähnlich ist. Der einzige Unterschied ist, dass Sie B(j) zuweisen.

Sie in der Tat ist es mit der ersten Schleife kombinieren könnten, wenn Sie sich wieder Dimension B zweimal, das zweite Mal mit Preserve:

ReDim B(1 To UBound(A)) As Integer 
n = 0 
For i = 1 To UBound(A) 
    If A(i) <> 0 Then 
     n = n + 1 
     B(n) = A(i) 
    End If 
Next i 
' Shorten the array without losing data: 
ReDim Preserve B(1 To n) 
0

Sie gehen zu müssen, B für das erste leere Feld überprüfen Element und verlassen Sie die Schleife, so dass Sie nicht weiter schreiben.

Dim A() As Variant, B() As Variant 
Dim i As Long, j As Long, n As Long 

A = Array(0, 0, 6, 5, 7) '<~~ 0 to 4, not 1 to 5 

n = 0 
For i = LBound(A) To UBound(A) 
    If A(i) <> 0 Then 
     n = n + 1 
    End If 
Next i 

ReDim B(1 To n) '<~~ 1 to 3 

For i = LBound(A) To UBound(A) 
    If A(i) <> 0 Then 
     For j = LBound(B) To UBound(B) 
      If IsEmpty(B(j)) Then 
       B(j) = A(i) '<~~ assigned a value; exit loop 
       Exit For 
      End If 
     Next j 
    End If 
Next i 

For j = LBound(B) To UBound(B) 
    Debug.Print B(j) 
Next j 

Da Arrays entweder Null-Basis sein können oder eine-basierte, zieht ich die LBoundUBound und Funktionen verwenden, um ihren Umfang zu definieren.

Verwandte Themen