2016-04-16 16 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)'を持っていれば '(4、2、8、9)'のように4つの要素しか持たない 'B ' – trincot

+0

あなたはコードが少し奇妙です:)私はちょうど最終的な目標が何であるか分かりません。あなたがすること:最初のループでは、0でない値を数えます。結果は 'n = 3'になります。その後、2つのネストされたループがあります。最初のものは3回実行され、2番目のもの(ネストされたもの)は0ではなくAの値がBの配列に代入されますが、最終結果は常に同じです。BのAの最後の値はBに割り当てられません0、従って '7'、あなたはどこでも7で終わります。あなたは真剣に、期待される結果のデータで、あなたが望むものを詳述する必要があります。 –

答えて

2

ネストされたループがあるということは、あなたに警告する必要があります。これが実行されるのは、n * 5回であり、正しいとは言えません。

変更第二部ではこれだけのように、一つのループを使用していますので:UBoundを使用して代わりに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 

注意。このループは、nを計算するループと非常によく似ています。唯一の違いは、B(j)に割り当てることです。

あなたがPreserveで、1秒間に2回の時間をB次元を再ならばあなたが実際には、最初のループとそれを組み合わせることができます:

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 

配列がゼロベースまたは1基づくことができるいずれかのことを考えると、私はその範囲を定義するためにLBoundUBound機能を使用することを好みます。

関連する問題