2016-04-16 196 views
1

我想創建一段代碼,讓我從一個數組中分配一個值到另一個長度不同的數組。這是我迄今爲止所擁有的。如何在一個數組中創建另一個數組(VBA)中的值?

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) 

此刻返回7,而它應該返回5,B中的所有值都是7.我怎樣才能讓這段代碼運行?

+0

你的代碼似乎暗示你不想複製任何0值。所以如果你有一個數組'(4,2,0,8,9)''你想要'B'只有4個元素,比如'(4,2,8,9)'? – trincot

+0

你的代碼有點怪怪的:)我只是不明白最終目標是什麼。你做什麼:在第一個循環中你計算的值不是0,它應該導致'n = 3'。之後你有2個嵌套循環。第一個將運行3次,第二個(嵌套)爲B數組賦值A中不爲0的值。但最終結果總是相同的:它會將B的最後一個值賦給B 0,因此'7',你到處都是7。你真的需要詳細說明你想要的東西,以及預期結果的數據。 –

回答

2

事實上,你有嵌套循環應該警告你:這將被執行n * 5次,這是不正確的。

更改第二部分,因此它僅使用一個循環,這樣的:

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 

另外,在使用的UBound代替5使你的代碼更通用。還要注意,這個循環與計算n的循環非常相似。唯一的區別是您分配給B(j)

你可以實際上與第一循環結合起來,如果你想重新尺寸B兩次,第二次與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

你將要檢查B中的第一個空數組元素並退出循環,因此不會繼續寫入。

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 

鑑於陣列可以是基於零或一個爲主,我更喜歡使用LBoundUBound函數來定義它們的範圍。

相關問題