はVBA

2017-01-31 13 views
1
に配列の範囲を割り当て

本当に新しいと自己配列へのスプレッドシートから範囲を割り当てたが、それは配列の行1にデータを開始した任意の助けはVBA

をいただければ幸いですので教えてくれました。

Dim arr As Variant 
arr = Range("DATA") 

行0を開始する方法はありますか? ありがとうございます

+0

のように使用されるだろうあなたは、各セルをループしなければならないし、配列の項目に値を代入します。変数に直接範囲を割り当てると、配列は項目1から始まります。 –

+0

いいえ、luke_tをしないでください。レンジ - >配列は非常に遅く、あなたはループでそれをやっています – Pierre

+1

これは可能ですが(@Pierreの答えはそれを行う効率的な方法を示しています) - なぜ迷惑でしょうか? Excel VBAコードは定期的に範囲と対話する必要があるため、VBAオブジェクトモデルの仕組みとコーディングスタイルを一致させることをお勧めします。経験豊富なVBAプログラマは、function/subに与えられるすべての配列が0であると主張するのではなく、配列を処理するためのループ境界を得るために、 'LBound'および' Ubound'関数を使って配列で動作するように設計された関数/ベースまたは1ベース。それは、基本に依存しないコードを書くことが最善です。 –

答えて

2

範囲の操作が遅いですが、一時的な配列を使用し、開始位置を変更しながら別の配列にコピーするのが最適です。 実際の配列 - >配列=非常に高速な

Dim arr, arr2 As Variant 
arr2 = Range("DATA").value2 
redim arr(0 to ubound(arr2)-1, 0 to ubound(arr2,2)-1) 
for i= 0 to ubound(arr2)-1 
for j= 0 to ubound(arr2,2)-1 
arr(i,j)= arr2(i+1,j+1) 
next 
next 
+0

ありがとうございます - うまく動作します – Darren

+0

ありがとうございます_私は学ぶことがたくさんあります。確かに私が得ている結果を達成するより良い方法がありますが、ただ出発するだけです。応答とあなたの時間を気に入ってください – Darren

0

さて、あなたはクリーンアップする範囲由来のVBA配列を行っている場合は、1次元のそれらを作る代わりに、誤って2次元のあなたの場合ではない理由列範囲または行範囲を扱っていますか?以下は、デフォルトとしても、デフォルトとして0ベースの使用していることを行いますが、両方のデフォルトを変更する方法を提供します。

Function RangeToArray(R As Range, Optional b As Long = 0, Optional collapse As Boolean = True) As Variant 
    'returns a b-based array of the values in R 
    'if the Range is 1-dimensional and collapse is true, the array returned is 1-dimensional 
    Dim i As Long, j As Long, m As Long, n As Long, k As Long 
    Dim vals As Variant, arr As Variant 

    m = R.Rows.Count 
    n = R.Columns.Count 
    If m = 1 And n = 1 Then 'to catch an edge-case 
     ReDim vals(1 To 1, 1 To 1) 
     vals(1, 1) = R.Value 
    Else 
     vals = R.Value 
    End If 
    If collapse And (m = 1 Or n = 1) Then 
     k = Application.WorksheetFunction.Max(m, n) 
     ReDim arr(b To b + k - 1) 
     For i = 1 To k 
      If m = 1 Then 
       arr(b + i - 1) = vals(1, i) 
      Else 
       arr(b + i - 1) = vals(i, 1) 
      End If 
     Next i 
    Else 
     ReDim arr(b To b + m - 1, b To b + n - 1) 
     For i = 1 To m 
      For j = 1 To n 
       arr(b + i - 1, b + j - 1) = vals(i, j) 
      Next j 
     Next i 
    End If 
    RangeToArray = arr 
End Function 

それはA = RangeToArray(Range("A1:B3"))

+0

m = 1、n = 1の場合、エラーが発生します:-) – Pierre

+0

@Pierre良い観察。私はそれを防ぐためのコードを追加しました。ありがとう。 –