web-dev-qa-db-ja.com

VBAの範囲から配列を作成する

私は一見基本的な問題を抱えていますが、それに対処するリソースが見つかりません。

簡単に言えば、Rangeのセル(すべて1列)の内容をArrayにロードするだけです。

私はこれを達成することができます

DirArray = Array(Range("A1"), Range("A2"))

しかし、何らかの理由で、このように表現された場合、配列を作成できません。

DirArray = Array(Range("A1:A2"))

私の実際の範囲ははるかに長い(そして長さが異なる場合がある)ので、この方法でセルを個別に列挙する必要はありません。範囲全体を配列に適切にロードする方法を教えてもらえますか?

後者のコードでは:

MsgBox UBound(DirArray, 1)

そして

MsgBox UBound(DirArray)

0を返しますが、前者では1を返します。

25
basaltanglia

変数をバリアントとして定義し、それらを等しくするだけです:

Dim DirArray As Variant
DirArray = Range("a1:a5").Value

Arrayコマンドは必要ありません。

39
vacip

Value2を使用すると、パフォーマンスが向上します。 Charles Williamsブログ

Range.Value2はRange.Valueと同じように機能しますが、セル形式をチェックせず、日付または通貨に変換します。そして、それがおそらく、数値を取得するときに.Valueよりも高速である理由です。

そう

DirArray = [a1:a5].Value2

ボーナスリーディング

  • Range.Value指定された範囲の値を表すVariant値を返すまたは設定します。
  • Range.Value2このプロパティとValueプロパティの唯一の違いは、Value2プロパティがCurrencyおよびDateデータ型を使用しないことです。
17
brettdj

このようにすれば:

Dim myArr as Variant
myArr = Range("A1:A10")

新しい配列は2次元になります。これは常に何らかの形で作業するのに快適ではありません:

enter image description here

配列に単一の列を取得するときに、2つの次元を回避するために、組み込みのExcel関数「Transpose」を使用できます。これにより、データは1つの次元になります。

enter image description here

データが連続している場合、単一の転置ではジョブは実行されません。 Transpose関数を2回使用する必要があります。

enter image description here

16
Vityata

提案されたソリューションに加えて、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
1
Paolo