アプリ版:「スタンプのみでお礼する」機能のリリースについて

vbaの配列で教えて下さい

複数のセルのデータを配列に一気に入れたいのですが
①dim arr
arr = Range("A1:B5")
と記述するとうまくいきます。しかしネットで調べると
②dim arr ()
arr = Range("A1:B5")
と記述しているのですが、これだとエラーになります
②のarr()はだめなのでしょうか?①はちゃんと配列になってイミディエイトで
確認してもうまく入っています。
どなたか教えて頂きたく。よろしくお願い致します。

A 回答 (1件)

こんばんは


① dim arr は Variant型です
Variant型変数は代入時にその型などが決まります
arr = Range("A1:B5") 
Valueなので配列となりインデックスが付加されます arr(1,1)~

ただし、Variant型配列は配列インデックス(大きさを増やせません)
ReDimは使えない
要素数が確定していてセルアクセスを減らす目的やセル範囲の値を保持
(配列に入れて対象セルの値を変更し使う時)する時など・・伝わらないかも

Dim arr As Variant
arr = Range("A1:B5")
Range("D1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr


Variant型変数で
set arr = Range("A1:B5") とするとRangeオブジェクトになり
同様にインデックスも付与されます
arr.Item(1,1)~
VBA実行中でもセルの値を変えると変数の値も変更される

一方
② dim arr() は ()により配列として確定していますので
代入時には配列のインデックスが必要になります 要ReDim

Dim i, j
Dim arr()
ReDim arr(Range("A1:B5").Rows.Count - 1, Range("A1:B5").Columns.Count - 1)
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
arr(i, j) = Range("A1:B5").Item(i + 1, j + 1)
Next j
Next i
Range("D1").Resize(UBound(arr, 1) + 1, UBound(arr, 2) + 1) = arr

ReDim Preserve
要素数の増減(2次元側)や Preserveキーワードなどで要素の値を
保持したまま要素数を増やす事が出来ます
(不確定要素数の場合は②を使う必要があります)
    • good
    • 1
この回答へのお礼

なるほど!よくわかりました。感謝いたします。

お礼日時:2022/12/26 19:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!