LoginSignup
1
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

[ExcelVBA]動的配列変数の使い方のまとめ

Last updated at Posted at 2024-06-16

はじめに

VBAで動的配列を扱う際、変数に括弧を付けて動的配列変数を宣言するパターンと、括弧を付けない変数に配列を代入するパターンがあり、その違いが気になっていたので、調べてみました。

変数の宣言

変数に括弧を付けて動的配列変数を宣言するパターン

Dim 括弧付き変数_A() As 
  • 型はString型、Long型、Object型、Variant型など、任意の型を選ぶことができる。
  • ただし、セル範囲から値を取り出して格納する場合は、必ずVariant型で宣言しておく必要がある。(セル範囲から取り出す値が文字列型だからといって、String型で宣言することはできない)

括弧を付けない変数に配列を代入するパターン

Dim 括弧無し変数_B As Variant
  • 配列を代入するには、必ずVariant型で宣言する必要がある。
  • この時点ではまだ配列変数ではない。単一の値も、オブジェクトも、配列も、何でも代入することができる、代入前の変数、というイメージ。

ReDimステートメント

ReDim 括弧付き変数_A(1 To 3)

ReDim 括弧無し変数_B(1 To 3)
  • ReDimステートメントで「括弧付き変数_A」のサイズを変更できる。
  • 「括弧無し変数_B」はReDimステートメントによって配列変数になる。

セル範囲の値を配列に格納する

取り出す値(A1:E1)
0616-3.PNG

括弧付き変数の場合

括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
  • 変数名の後ろの括弧は省略可能
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
  • .Valueの記述を省略することはできない
'↓これはエラー
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1")
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1")

括弧無し変数の場合

括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
  • .Valueの記述は省略可能
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1")
  • "変数名()"のように、括弧を付けるとエラーになる。
'↓これはエラー
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1")

Eraseステートメント

「括弧付き変数」も「括弧無し変数」も、Eraseステートメントで初期化できる。

Erase 括弧付き変数_A

Erase 括弧無し変数_B

変数に単一の値やオブジェクトを再代入する

  • 括弧付き変数には、単一の値(文字列、数値、日付)やオブジェクトを再代入することは出来ない。
  • 括弧無し変数には、単一の値(文字列、数値、日付)やオブジェクトを再代入することが出来る。その際、配列変数ではなくなる。
'括弧付き変数_A = 1000 ←エラー

括弧無し変数_B = "XYZ"

Set 括弧無し変数_B = ThisWorkbook

まとめ

動的配列変数は、変数宣言時に括弧が付いているかどうかによって、扱い方に細かな違いや注意点がある。特に、セル範囲の値を配列に格納する際の記述の違いがややこしく感じた。

今回検証のために使ったコード

Option Explicit

Sub 配列変数テストマクロ()

    Dim 括弧付き変数_A() As Variant
    
    Dim 括弧無し変数_B As Variant

Stop

    ReDim 括弧付き変数_A(1 To 3)

    ReDim 括弧無し変数_B(1 To 3)

Stop

    括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value

    括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value

Stop

    Erase 括弧付き変数_A

    Erase 括弧無し変数_B

Stop

   '括弧付き変数_A = 1000 ←エラー

    括弧無し変数_B = "XYZ"
    
    Stop
    
    Set 括弧無し変数_B = ThisWorkbook

Stop

End Sub
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0