私は一見基本的な問題を抱えていますが、それに対処するリソースが見つかりません。
簡単に言えば、Rangeのセル(すべて1列)の内容をArrayにロードするだけです。
私はこれを達成することができます
DirArray = Array(Range("A1"), Range("A2"))
しかし、何らかの理由で、このように表現された場合、配列を作成できません。
DirArray = Array(Range("A1:A2"))
私の実際の範囲ははるかに長い(そして長さが異なる場合がある)ので、この方法でセルを個別に列挙する必要はありません。範囲全体を配列に適切にロードする方法を教えてもらえますか?
後者のコードでは:
MsgBox UBound(DirArray, 1)
そして
MsgBox UBound(DirArray)
0を返しますが、前者では1を返します。
変数をバリアントとして定義し、それらを等しくするだけです:
Dim DirArray As Variant
DirArray = Range("a1:a5").Value
Arrayコマンドは必要ありません。
Value2
を使用すると、パフォーマンスが向上します。 Charles Williamsブログ
Range.Value2はRange.Valueと同じように機能しますが、セル形式をチェックせず、日付または通貨に変換します。そして、それがおそらく、数値を取得するときに.Valueよりも高速である理由です。
そう
DirArray = [a1:a5].Value2
提案されたソリューションに加えて、1D範囲から1Dアレイまでの場合、以下のような関数で処理することを好みます。理由は簡単です:何らかの理由で範囲が1要素の範囲に縮小されている場合、Range()コマンドの値を知っている限り、値はバリアント配列ではなくバリアントを返し、バリアントを割り当てることはできませんバリアント配列(事前に宣言された)への変数。
可変サイズの範囲を二重配列に変換する必要があり、範囲が1セルサイズの場合、range()。valueのような構造を使用できなかったため、以下のような関数を使用します。
Public Function Rng2Array(inputRange As Range) As Double()
Dim out() As Double
ReDim out(inputRange.Columns.Count - 1)
Dim cell As Range
Dim i As Long
For i = 0 To inputRange.Columns.Count - 1
out(i) = inputRange(1, i + 1) 'loop over a range "row"
Next
Rng2Array = out
End Function