大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、1次元配列や2次元配列を宣言する方法と、初期化する方法について、ご紹介します。配列の次元や大きさを宣言するのは、「ReDim」を使います。配列を初期化する方法としては、「ReDim」、「ReDim Preserve」、「Erase」があります。配列を使えば、VBAを高速化することができますので、配列をマスターしていきましょう。

はじめに

この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介します。

配列の大きさを宣言したい場合は、「ReDim」を使います。

「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。

配列を完全に初期化したい場合は、「Erase」を使うという感じです。

配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。

では、配列の大きさを宣言する方法と初期化する方法について、解説していきます。

この記事で紹介すること

  • 配列の大きさを宣言する方法
  • 配列を初期化する方法

本記事の内容を動画でまとめています

目次から見たい項目へ移動すると便利ですよ。

目次

VBAで配列の宣言(DimとReDim)

VBAで配列を宣言するには、「Dim」と「ReDim」を使います。

「Dim」で配列を宣言して、「ReDim」で配列の大きさを決定します。

配列でのポイントは、

  • 配列の次元数
  • 0番目スタートか、1番目がスタートか

というところです。

次元は、1次元配列や、2次元配列のように配列の次元を決めるものです。

配列は、0番目から始ったり、1番目から始ったりします。

それぞれの次元と、スタートする番号を変えて配列を宣言してみます。

1次元配列

1次元配列のイメージを見てみます。

例えば、0番目からスタートする配列は、次のようなイメージです。

0番目からスタート

0番目スタートの1次元配列のイメージ

VBAで、0番目から3番目までの1次元配列を宣言して、配列に値を入力するVBAコードです。

Sub TEST1()
    
    Dim A
    '1次元配列を宣言
    ReDim A(3) '0番目スタート
    
    '配列に値を入力
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
End Sub

実行してみます。

0番目からの1次元配列を宣言した結果

0番目から3番目までの、1次元配列を作成できました。

1番目からスタート

続いて、1番目からスタートする配列は、次のようなイメージです。

1番目スタートの1次元配列のイメージ

VBAで、1番目から3番目までの1次元配列を宣言して、配列に値を入力するVBAコードです。

Sub TEST2()
    
    Dim A
    '1次元配列を宣言
    ReDim A(1 To 3) '1番目スタート
    
    '配列に値を入力
    A(1) = 1
    A(2) = 2
    A(3) = 3
    
End Sub

実行してみます。

1番目からの1次元配列を宣言した結果

1番目から3番目までの、1次元配列を作成できました。

こんな感じで、「Dim」で宣言して、「ReDim」で大きさを設定することができます。

1次元配列は、0番目からスタートする配列が一般的です。

2次元配列

つづいて、2次元配列を宣言してみます。

0行0列からスタート

0行、0列からスタートする2次元配列を設定してみます。

イメージはこちらです。

0行、0列からスタートする2次元配列のイメージ

では、0行、0列から始まるする2次元配列を宣言します。

Sub TEST3()
    
    Dim A
    '2次元配列を宣言
    ReDim A(2, 3) '0行0列スタート
    
    '配列に値を入力
    A(0, 0) = 1
    A(0, 1) = 2
    A(0, 2) = 3
    A(0, 3) = 4
    
    A(1, 0) = 5
    A(1, 1) = 6
    A(1, 2) = 7
    A(1, 3) = 8
    
    A(2, 0) = 9
    A(2, 1) = 10
    A(2, 2) = 11
    A(2, 3) = 12
    
End Sub

実行してみます。

0行、0列から始まる2次元配列を宣言した結果

0行0列から始まる2次元配列を、設定できました。

1行1列からスタート

次は、1行1列から始まる2次元配列を、宣言してみます。

イメージはこちらになります。

1行、1列から始まる2次元配列のイメージ

1行1列から始まる2次元配列を宣言して、値を入力するVBAコードです。

Sub TEST4()
    
    Dim A
    '2次元配列を宣言
    ReDim A(1 To 2, 1 To 3) '1行1列スタート
    
    '配列に値を入力
    A(1, 1) = 1
    A(1, 2) = 2
    A(1, 3) = 3
    
    A(2, 1) = 4
    A(2, 2) = 5
    A(2, 3) = 6
    
End Sub

では、途中まで実行して、配列の中身を見てみます。

1行1列から始まる2次元配列を宣言して値を入力した結果

1行1列から始まる配列を宣言して、値を入力することができました。

セル範囲を指定して、セルの値を配列に格納した場合は、この1行1列から始まる配列になります。

今回は、わかりやすく値をVBAコードの中で入力していますけども、実際は、セルに入力された値を配列に入力して、配列を作成することの方が多いです。

VBAで配列の大きさ変更

配列の大きさを変更する方法について、解説します。

配列を保持しないで大きさを変更するだけなら、「ReDim」でできます。

値を保持して大きさを変更したい場合は、「ReDim Preserve」です。

それぞれ解説していきます。

配列の大きさを宣言し直す(ReDim)

配列の大きさを宣言し直す方法です。

一度宣言した配列を、再度、宣言し直して配列を初期化します。

0番目から3番目までの配列を、0番目から4番目までの配列に、宣言し直すVBAコードです。

Sub TEST5()
    
    '1次元配列を作成
    Dim A
    ReDim A(3)
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '配列を再宣言
    ReDim A(4) '←ここ
    
End Sub

これは簡単で、もう一度「ReDim」を使って、配列の大きさを宣言するだけです。

宣言し直す前です。

宣言し直す前の配列

宣言し直す前の配列

0~3番目までの配列です。値が入力されています。

宣言し直した後です。

宣言し直した後の配列

ReDimで宣言し直した後の配列

0~4番目までの配列になりました。

値は初期化されて、すべて「Empty」になりました。

何回でも宣言し直すことができます

ちなみに何回でも、配列の大きさを宣言し直すことができます。

こんな感じです。

Sub TEST6()
    
    '配列を作成
    Dim A
    ReDim A(3)
    
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '配列を再宣言
    ReDim A(4) '←ここ
    ReDim A(5) '←ここ
    ReDim A(6) '←ここ
    
End Sub

実行してみます。

ReDimを複数回実行して、配列の大きさを宣言し直した結果

0~6番目までの配列になりました。

配列の値は、もちろん初期化されています。

元の値を残して、配列の大きさを宣言し直す(Preserve)

次は、元の値を残して、配列の大きさを変更する方法です。

「Preserve」を使います。

0~3番目までの配列を、値は残したまま、0~4番目までの配列に、宣言し直すVBAコードです。

Sub TEST7()
    
    '配列を作成
    Dim A
    ReDim A(3)
    
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '値を保持して、配列を再宣言
    ReDim Preserve A(4) '←ここ
    
End Sub

配列の大きさを宣言し直す際に、「ReDim Preserve」を使うところがポイントです。

配列の大きさを、宣言し直す前の配列です。

宣言し直す前の配列

配列の大きさを宣言し直す前の配列

0~3番目までの配列に、値が入力されています。

では、値を残したまま、配列の大きさを宣言し直してみます。

元の値を保持して、宣言し直した後の配列

ReDim Preserveで配列の大きさを宣言し直した後の配列

配列の大きさが、0~4番目までとなりました。

元の値は、入力されたままです。

元の値を保持したまま、配列の大きさを変更したい場合に使えます。

何回でも宣言し直すことができます

ちなみに、「ReDim Preserve」も何回でも使うことができます。

こんな感じです。

Sub TEST8()
    
    '配列を作成
    Dim A
    ReDim A(3)
    
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '値を保持して配列を再宣言
    ReDim Preserve A(4) '←ここ
    ReDim Preserve A(5) '←ここ
    ReDim Preserve A(6) '←ここ
    
End Sub

実行してみます。

ReDim Preserveを複数回使って、配列の大きさを宣言し直した結果

結果は、0~6番目までの配列になりました。

元の値は、残ったままです。

必要な配列の大きさがわからない場合に使えます。

例えば、とりあえず大きめの配列を用意して、最後に必要な配列のサイズに「ReDim Preserve」で配列の大きさを宣言し直すという感じです。

2次元配列で1次元目の要素数は変更できない

2次元配列の場合は、1次元目の要素数は変更できないです。

ちょっとやってみます。

Sub TEST9()
    
    '配列を作成
    Dim A
    ReDim A(1, 3)
    
    A(0, 0) = 1
    A(0, 1) = 2
    A(0, 2) = 3
    A(0, 3) = 4
    
    A(1, 0) = 5
    A(1, 1) = 6
    A(1, 2) = 7
    A(1, 3) = 8
    
    '値を保持して、1次元の変更はできない
    ReDim Preserve A(2, 3) '←これはエラーとなる
    
End Sub

実行するとエラーとなります。

2次元配列で、1次元目の要素数は変更できない

こんな感じで、2次元配列では、内側の1次元目の要素数は変更できないです。

2次元目の要素数であれば、変更することができます。

2次元配列の2次元目の要素数を変更するVBAコードです。

Sub TEST10()
    
    '配列を作成
    Dim A
    ReDim A(1, 3)
    
    A(0, 0) = 1
    A(0, 1) = 2
    A(0, 2) = 3
    A(0, 3) = 4
    
    A(1, 0) = 5
    A(1, 1) = 6
    A(1, 2) = 7
    A(1, 3) = 8
    
    '値を保持して、2次元の変更はできる
    ReDim Preserve A(1, 4)
    
End Sub

実行までの配列です。

実行前の2次元配列

では、実行してみます。

2次元配列の2次元目の要素数を変更した結果

2次元配列の2次元目の要素数を変更できました。

次元数の変更はできない

「Preserve」では、「次元数」は変更できません。

例えば、1次元配列を、値を保持したまま、2次元配列に宣言し直すというのは、できません。

1次元配列を、「ReDim Preserve」で2次元配列に宣言し直すVBAコードです。

Sub TEST11()
    
    '配列を作成
    Dim A
    ReDim A(3)
    
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '値を保持して、1→2次元配列に再宣言
    ReDim Preserve A(3, 2) '←これはエラーとなる
    
End Sub

実行してみます。

ReDim Preserveで1次元配列を2次元配列に宣言し直そうとするとエラーとなる

結果は、エラーとなりました。

値を残して配列を宣言し直す場合は、次元数は同じにしましょう。

VBAで配列を初期化する

配列を初期化(Erase)

配列を初期化する方法です。「Erase」を使います。

一度宣言した配列を、まっさらな状態にすることができます。

配列を初期化するVBAコードです。

Sub TEST12()
    
    '配列を作成する
    Dim A
    ReDim A(3)
    
    A(0) = 1
    A(1) = 2
    A(2) = 3
    A(3) = 4
    
    '配列を初期化
    Erase A
    
End Sub

初期化する前の配列です。

初期化前の配列

初期化前の配列

では、初期化してみます。

初期化後の配列

Eraseで配列を初期化した結果

配列の値や大きさもすべて初期化されました。

完全に配列を初期化したい場合に使えます。

配列の要素数が不明の場合

配列の要素数が不明の場合で、要素数を設定する方法は2パターンあります。

  • 入力する毎に配列を大きくする
  • 大きめの配列にして最後に縮小する

という感じです。

VBAを高速化したい場合は、「大きめの配列にして最後に縮小する」方法がおススメです。

入力する毎に「ReDim Preserve」を使うと、少し処理が遅くなってしまいます。

では、それぞれの方法を解説していきます。

入力する毎に配列を大きくする

配列の要素数がわからない場合に、入力する毎に配列を大きくして配列の要素数を設定するVBAコードになります。

Sub TEST13()
  
    Dim A
    '配列を作成
    ReDim A(1 To 1)
    
    For i = 1 To 10
      '配列の要素数を拡張する
      ReDim Preserve A(1 To i)
      A(i) = i
    Next
  
End Sub

では、ポイント毎に実行してみます。

ループ毎に配列を拡張

最初は、1行の配列に値を入力します。

最初は、1行の配列に値を入力する

次に入力するときは、配列を1行だけ拡張して、値を入力します。

次に、2行に配列を拡張して、値を入力する

さらに、入力する際に1行だけ拡張して、値を入力します。

さらに、3行に配列を拡張して、値を入力する

これを繰り替えしていくと、値を入力する分だけ配列を拡張することができます。

10行だけ拡張して配列を作成できた

最終値までループして、配列を拡張して、値を入力できた

最終値までループして、配列を拡張して、値を入力できました。

大きめの配列にして最後に縮小する

次は、大きめの配列を作成しておいて、最後に縮小する方法です。

Sub TEST14()
  
    Dim A
    '大きめの配列を作成
    ReDim A(1 To 100)
    
    k = 0
    For i = 1 To 10
      k = k + 1 '最大値を保存する
      A(i) = i
    Next
    
    '最大値分に、要素数を縮小する
    ReDim Preserve A(1 To k)
  
End Sub

では、ポイント毎に実行してみます。

実行してみる

まずは、大きめの空の配列を作成します。

大きめの配列を作成しておく

100行分の配列を作成しました。

適当な値を配列に値を入力しながら、「最大行」を取得します。

配列に値を入力しながら、最大行を取得する

今回の場合は、最大行は「10行」となります。

最後に、最大行に配列の大きさを縮小して、不要な行を削除します。

値に合わせて配列の大きさを変更できた

ReDim Preserveで値を残して、配列の大きさを縮小する

大きめの配列を作成して、最後に縮小する方法で、配列の大きさを設定できました。

2次元配列で1次元目の要素数を変更する

2次元配列で、値を残したまま、1次元目の要素数を変更してみます。

配列を転置して要素数を拡張する

やりたい内容は、2次元配列で、値を残したまま、1次元目を拡張したい、ということになります。

2次元配列で、1次元目を拡張したい

2次元配列で1次元目の要素数を変更したい

「ReDim Preserve」では、一番右側の次元のみを拡張することができます。

なので、内側の次元を拡張したい場合は、配列を「転置」することで、内側の次元を拡張することができます。

転置を使って、内側の次元を拡張するVBAコードになります。

Sub TEST15()
  
    Dim A
    ReDim A(1 To 2, 1 To 3)
    
    '適当に配列を入力
    k = 0
    For i = 1 To 2
      For j = 1 To 3
        k = k + 1
        A(i, j) = k
      Next
    Next
    
    '転置する
    A = WorksheetFunction.Transpose(A)
    
    '元の行を拡張する
    ReDim Preserve A(1 To UBound(A, 1), 1 To 3)
    
    '転置して戻す
    A = WorksheetFunction.Transpose(A)
  
End Sub

では、ポイント毎に実行してみます。

転置して1次元目を拡張する

配列を作成して値を入力したら、行列を「.Transpose」を使って転置します。

行列を転置する

配列を転置したら、「ReDim Preserve」で、2次元目を拡張します。

転置した配列で、2次元目を拡張する

2次元目を拡張したら、再度、行列を転置します。

再度、行列を転置して、元に戻す

これで、1次元目を拡張することができます。

2次元配列で、1次元目を拡張できた

2次元配列で、1次元目を拡張できた

2次元配列で、値を残したまま、1次元目を拡張できました。

おわりに

この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介しました。

配列の大きさを宣言したい場合は、「ReDim」を使います。

「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。

配列を完全に初期化したい場合は、「Erase」を使うという感じです。

配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す