スライドショー

【ExcelVBA入門】使いこなすと便利な動的配列の使い方について徹底解説!

こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。

皆さんは、VBAで配列を使ったことがありますか?

データをひとまとめにして使いたい場合に、配列はよく使います。

なかでも、動的配列の使い方を覚えておくと応用的なコードが書けるのでおすすめです!

そこで今回は、

・配列とは

・静的配列・動的配列の違いとは

といった基礎的なことから、

・VBAで動的配列を書く方法

・要素数を意識せずに配列の要素を追加する方法

・その他おすすめな配列操作方法

といった応用的な方法まで、徹底的に解説します!

配列とは

最初に、配列について簡単に解説します。

配列とは、「一度に複数の値を格納することができる変数」のことです。

配列内のひとつひとつのデータは、要素と言います。

要素には添字を指定することで、データにアクセスすることができます。

言葉だけではわかりづらいので、簡単なサンプルを用意しました。

サンプルコード:

Dim strMessage(3) as String
strMessage(1) = "要素1"
strMessage(2) = "要素2"
strMessage(3) = "要素3"

この例では、「strMessage」が配列になっており「strMessage(3)」と指定することで、要素が3つの配列を宣言しています。

strMessage(1)」「strMessage(2)」「strMessage(3)」のようにそれぞれアクセスすることで、値の出し入れをすることができます。

このように、まとめてデータを保存しておきたいときに使えるのが配列です。

静的配列・動的配列の違いとは

配列には、静的配列動的配列の2種類があります。

2つの違いは、次の通りです。

  • 静的配列:宣言時に要素数を指定
  • 動的配列:後で要素数を指定

こちらも言葉だけではわかりにくいので、サンプルコードを用意しました。

サンプルコード:

Sub Test()
  '静的配列
  Dim strMessage(3) as String
  strMessage(1) = "要素1"
  strMessage(1) = "要素2"
  strMessage(1) = "要素3"

  '動的配列
  Dim intNum() as Integer
  Redim intNum(2)
  intNum(1) = 1
  intNum(2) = 5

End Sub

変数宣言時に、「Dim strMessage(3) as String」のように要素を指定しているのが静的配列で、「Dim intNum() as Integer」のように要素の指定がないのが動的配列です。

動的配列の場合は、「Redim intNum(2)」のように配列の要素数を後から指定して使うことができます。

静的配列で宣言してしまった場合は、後から要素数の変更ができないので、動的配列の使い方を覚えておくのがおすすめです!

VBAで動的配列を書く方法とは

次に、動的配列の使い方について詳しく解説します。

動的配列の変数宣言方法

はじめに、動的配列の変数を宣言する方法について解説します。

静的配列と動的配列の違いで説明した通り、変数宣言時は要素数なしで次のように宣言します。

Dim 配列の変数名() as 型

サンプルコード:

Sub Test()
  Dim intNum() As Integer
End Sub

型にはInteger型String型Double型など通常の変数と同じように型を設定することができます。

変数名にカッコ()をつけるだけなので、覚えやすいですね。

動的配列の初期化方法

次に、動的配列の初期化方法について解説します。

配列を初期化するためには、Redimを使って次のように書きます。

使い方:

ReDim 配列の変数名(要素数)

サンプルコード:

Sub Test()
  Dim intNum() As Integer
  ReDim intNum(2)
End Sub

要素数に1以上の数値を入れることで、配列の要素を作ることができます。

動的配列に値を入れる方法

次に、動的配列の要素に値を入れる方法について解説します。

値を入れる場合は、配列名(要素)を指定して値を入れます。

使い方:

配列名(要素数) = 値

サンプルコード:

Sub Test()
  Dim intNum() As Integer
  ReDim intNum(2)
  intNum(1) = 1
  intNum(2) = 5
End Sub

動的配列に後から要素を追加する方法

次に、要素を後から追加する方法について解説します。

配列に値を入れた後に要素を追加したい場合は、Redimで再度要素数を宣言します。

使い方:

'最初に要素数を指定
ReDim 配列の変数名(要素数)

'要素に値を入れる
配列名(要素1) = 値
配列名(要素2) = 値

'追加したい要素数を再度ReDimで指定
ReDim 配列の変数名(要素数)

サンプルコード:

Sub Test()
  Dim intNum() As Integer
  ReDim intNum(2)
  intNum(1) = 1
  intNum(2) = 5
  
  '要素数の変更
  ReDim intNum(3)
  intNum(3) = 10

  'データの確認
  MsgBox "intnum(1):" & intNum(1) & vbCrLf & _
         "intnum(2):" & intNum(2) & vbCrLf & _
         "intnum(3):" & intNum(3)

End Sub

実行結果:

ただし、1点注意点があります。

Redimで要素数を再設定すると、もともと入っていたデータクリアして要素数を追加してしまいます。

そのため、実行結果のように、「intNum(1)」「intNum(2)」に入れた値が初期化されて0になるわけですね。

元のデータを残しつつ要素を追加したい場合は、Redimで要素数を増やすときにPreserveをつける必要があります。

Preserveを付けたサンプルコード:

Sub Test()
  Dim intNum() As Integer
  ReDim intNum(2)
  intNum(1) = 1
  intNum(2) = 5
  
  '要素数の変更
  ReDim Preserve intNum(3)
  intNum(3) = 10

  'データの確認
  MsgBox "intNum(1):" & intNum(1) & vbCrLf & _
         "intNum(2):" & intNum(2) & vbCrLf & _
         "intNum(3):" & intNum(3)

End Sub

実行結果:

要素を追加して初期化したい場合Redimのみ、値を残しつつ要素を追加したい場合PreserveをつけてReDimと覚えればOKです。

応用編:要素数を意識せずに要素を追加する方法

先ほどのようなシンプルな処理であれば、要素数を確認してReDim要素を追加するのは簡単かもしれません。

ただ、配列の数が増えてくると、全ての配列の要素数を意識しながらコードを書いていくのは難しいため、要素数を意識せずに要素を追加する方法を覚えておくのがおすすめです!

UBOUND関数を使えば、簡単に配列の要素数を取得することができます。

使い方:

UBOUND(配列)

サンプルコード:

Sub Test4()
  Dim intNum() As Integer
  ReDim intNum(2)
  intNum(1) = 1
  intNum(2) = 5
  
  '要素数の確認
  MsgBox "intNum()の要素数:" & UBound(intNum)

End Sub

実行結果:

UBOUND関数で要素数を取得して、1足した数で要素数を追加すれば、要素数を意識せずに1つ要素を追加することができます。

要素数を意識せずに要素を追加するサンプルコード:

Sub Test5()
  Dim intNum() As Integer
  ReDim intNum(2)
  intNum(1) = 1
  intNum(2) = 5
  
  '要素数の確認
  Dim lngEleCount As Long
  lngEleCount = UBound(intNum)
  
  '要素数の追加
  Dim newEleCount As Long
  newEleCount = lngEleCount + 1
  ReDim Preserve intNum(newEleCount)
  intNum(newEleCount) = 10

  'データの確認
  MsgBox "intNum(1):" & intNum(1) & vbCrLf & _
         "intNum(2):" & intNum(2) & vbCrLf & _
         "intNum(3):" & intNum(3)

End Sub

実行結果:

補足:その他の配列操作について

ここまで配列、静的配列と動的配列の違い、動的配列の使い方について解説してきました。

配列はとても奥が深いため、他の記事でも使い方をまとめています。

配列の初期化配列操作総まとめについて以下で詳しく解説しているので、合わせてみてみるのがおすすめです!

【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)
更新日 : 2019年4月21日
【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較)
更新日 : 2019年9月26日

まとめ

今回は、VBAで動的配列を操作する方法について解説しました。

一度にまとめてデータを使いたい場合、動的配列を使うケースはよくあります。

今回解説した方法は使い方も簡単なので、ぜひ使ってみてくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説