VBA 配列の基本:宣言方法と使用方法の概念を解説

配列の基本を解説 VBA

ループ処理を使ってセルにデータを転記していたけれど、データが増えると動作が遅くなって困ったことはありませんか?

お悩みポイント
悩む人
  • 複数のデータをまとめて管理する方法を知りたい
  • 配列の基本的な概念を理解したい
  • VBA初心者でも簡単に配列を使いこなしたい

この記事では、VBAにおける「配列」の基本概念を詳しく解説します。

配列を使うことで、データを効率的に管理でき、プログラムのパフォーマンスが向上します。
データをまとめて処理できるため、高速で処理ができるようになりますよ。

この概念をしっかりと理解し、次に進むことで、配列の活用方法をより深く学べます。

ぜひご覧ください。


【 この記事の概要 】

  よく使う度    5.0  
  難しさ     3.5  
  覚えておくと安心度     5.0  

この記事でできるようになること

この記事を読むと、次のことができるようになります。

この記事を見てできるようになること

VBAにおける「配列」とは? を解説

VBAにおける「配列」について、解説を行います。

「配列」と「変数」は何が違う?

VBAでは、データを管理するために「変数」という箱を使います。
通常、1つの変数には1つのデータしか入れることができません

変数のイメージ

たとえば、1人の学生のテストの点数を管理するために、「Score」 という変数にその点数を入れるとします。

Dim Score As Long
Score = 85

でも、もしクラス30人全員の点数を管理したいとしたら、どうしますか?全員分の変数を作るのは大変ですよね。 変数が増えて管理も難しくなります。

Dim Score_佐藤 As Long
Dim Score_鈴木 As Long
Dim Score_伊藤 As Long

Score_佐藤 = 85
Score_鈴木 = 70
Score_伊藤 = 60
・・・

そんなときに便利なのが「配列」です。

「配列」とは

配列は、複数のデータ (箱) を一つの名前でまとめて管理している倉庫だと思ってください。
配列を使えば、クラス全員の点数を一つの配列にまとめて入れることができ、データの整理がとても簡単になります。

配列のイメージ

配列の作成方法

例えば、次のようなコードを記述すると、学生のテストの点数を管理する「配列」を作成することができます。

Dim Score(29) As Long '// 30人分の点数をまとめて管理できる配列を作成

この配列には、30人分の点数をまとめて入れることができます。
配列は通常「0」から開始するため、先ほどの例では「0」から「29」までのインデックスを持ち、合計で「30個」のデータを管理できるようになっています。

配列のデータ格納方法

配列にデータを格納するには、手動で値を入力する方法や、ループ処理を行うなどして自動的に値を設定する方法があります。
例えば、次のように手動で各学生の点数を配列に格納することができます。

点数(0) = 85
点数(1) = 90
点数(2) = 78

配列のデータ取り出し方法

また、配列にデータを格納したら、続いて配列のデータを取り出す必要があります。
この方法は「一括」や「個別」で取り出すことができます。
その際、どのデータを取り出せばよいかを指定する必要があります。
これを助けてくれるのが「インデックス」です。

MsgBox "1番目の学生の点数は " & score(0)

インデックスとは?

配列に格納された各データには、位置を特定するための「番号」が付けられています。
この番号を「インデックス」と呼びます。
インデックスを使うことで、配列の中から特定のデータを簡単に取り出すことができます。

インデックスのイメージ

通常、VBAではインデックスは「0」または「1」から始まりますが、これを変更することもできます。

配列の種類について

VBAで配列を宣言する際には、「静的配列」と「動的配列」の2種類があります。

静的配列とは?

静的配列とは、配列のサイズをあらかじめ固定して宣言する方法です。

プログラムの実行中に配列のサイズを変更することができないため、事前に格納するデータの数がわかっている場合に使用します。

例えば、次のように宣言し配列を作成します。

Dim 数字(4) As Long

この静的配列には、「5」つの値を格納することができます。
※通常インデックスは「0」から始まるため、5つのデータを格納したい場合、インデックスは「0」から「4」までになります。

静的配列がよく使われる場面

静的配列は、固定されたサイズのデータを扱う場合に便利です。

  • 曜日や月のデータの管理
    • 1週間の曜日や1年間の月を固定のデータとして扱う場合に使用されます。
  • 特定の数値セットの保存
    • 例えば、テストの得点範囲(0〜100点)や評価基準など、予め決められた数値を管理する際に使用されます。
  • 固定されたオプションリストの作成
    • プルダウンメニューや選択肢が決まっている場合(例:性別や都道府県名)に、そのデータを静的配列で管理します。

静的配列については、次の記事で詳細を解説しています。良ければぜひご覧ください。

動的配列とは?

動的配列は、プログラムの実行中に配列のサイズを変更できる配列です。

データの量が事前にわからない場合や、処理の途中でデータの数が変わる場合に使用します。

例えば、次のように宣言します。

Dim 数字() As Long
ReDim 数字(4)

このコードでは、最初に配列を宣言し、その後でサイズを設定しています。
必要に応じて、サイズを変更することができます。

動的配列がよく使われる場面

動的配列は、データの数が変動する可能性がある場合に便利です。

  • ユーザー入力に応じたデータの管理
    • フォームやユーザー入力によってデータの数が変動する場合、動的配列を使って必要なサイズの配列を生成し、そのデータを効率的に管理できます。
  • データベースやシートからの可変データの取得
    • Excelシートやデータベースからデータを読み込む際、行数や列数が変わることがあります。動的配列を使うことで、取得したデータを適切なサイズで格納できます。
  • リストの動的拡張
    • 配列に新しい項目を追加する必要がある場合、動的配列を使うことで、データをリアルタイムに拡張しながら管理できます。

動的配列については、次の記事で詳細を解説しています。良ければぜひご覧ください。

配列がよく使われる場面

VBAで配列は、以下のような場面でよく使用されます。

大量のデータを高速で処理する場合

大量のデータを一度に処理する必要がある場合、配列は非常に便利です。
例えば、膨大な数のデータを別のシートに転記するシナリオを考えてみましょう。

ループを使って1つずつデータを転記する方法と、配列を使って一括でデータを転記する方法では、処理速度に大きな差が生じます。

実際に、50,000件のデータを別のシートに転記する際の処理時間を比較してみると、配列を使った方法の方が圧倒的に高速であることが確認できます。

以下のようなコードを使って、両者の処理速度を計測し比較してみましょう。

大量のデータを転記するエクセル

ループ (For)での転記

Sub CopyDataWithLoop()
    Dim startTime As Double
    Dim i As Long
    
    startTime = Timer
    
    '// データ 50,000点をループ処理で転記
    For i = 1 To 50000
        Sheets("Sheet2").Cells(i, 1).Value = Sheets("Sheet1").Cells(i, 1).Value
    Next i
    
    MsgBox "Loopでの処理時間: " & Timer - startTime & " 秒"
End Sub
処理結果
ループ(For)で転記した場合の時間「約7.3」秒

配列を使った転記

Sub CopyDataWithArray()
    Dim startTime As Double
    Dim dataArray() As Variant
    
    startTime = Timer
    
    '// データ 50,000点を配列に取り込む
    dataArray = Sheets("Sheet1").Range("A1:A50000").Value
    
    '// 配列を別シートに一括転記
    Sheets("Sheet2").Range("A1:A50000").Value = dataArray
    
    MsgBox "配列での処理時間: " & Timer - startTime & " 秒"
End Sub
処理結果
配列で転記した場合の時間「約0.08」秒

このように、ループ処理を行うと処理に「約7.3秒」かかりましたが、配列を活用することで「約0.08秒」まで処理時間を短縮することができました。
※使用するパソコンのスペックにより、処理時間は異なる場合があります。

大量のデータを扱う場合は、配列を使用することで処理の効率が大幅に向上し、作業をより迅速に行うことが可能になります。

関連データのグループ化

複数の関連データをグループ化して扱う際に、配列を使用します。

例えば、ある商品の「名前」「価格」「在庫数」などの情報を管理する場合、それぞれのデータを別々に管理すると複雑になります。
そこで、配列を使ってこれらの関連するデータを1つのグループとして扱うことで、管理が簡単になり、データの整理や分析が容易になります。

ループ処理の効率化

繰り返し処理を行う際、配列を利用することで、各要素に対して同じ処理を簡単に実行できます。

例えば、30人の学生のテストの点数があり、それぞれの点数を順番にチェックして平均点を計算したい場合、配列を使うと全ての点数を一括で処理することができます。
配列にデータを格納し、For ループを使って順番に点数を処理することで、コードがシンプルになり、効率的に作業を進めることができます。

配列を使うメリット・デメリット

配列を使うメリットは、以下の通りです。

メリット
  • 処理の高速化
    • 配列を使用すると、特にループ処理を行う際に処理が高速化されます。
      データを一度に配列に格納してまとめてシートに貼り付けることで、ExcelとVBAのやり取りを最小限に抑えられ、全体の処理速度が大幅に向上します。
  • データの整理と管理が容易
    • 配列を使用することで、関連するデータを一つの変数名で管理でき、データの整理やアクセスが簡単になります。
      複数の変数を使ってデータを管理する必要がなくなるため、コードがシンプルになります。
  • コードの簡潔化
    • 配列を使うことで、同じ処理を複数のデータに対して実行する場合、コードが短くなり、見やすくなります。
      ループと組み合わせることで、繰り返し処理を効率的に記述できます。
  • 一括操作が可能
    • 配列を使うと、複数のデータを一括で処理することができます。
      例えば、複数のセルに一度にデータを入力したり、全ての要素に対して同じ操作を実行したりすることが可能です。

配列を使うデメリットは、以下の通りです。

メリット
  • メモリの使用量が増える
    • 配列は、あらかじめメモリを確保してデータを格納します。
      そのため、大きな配列や不要なデータを格納すると、メモリを大量に消費し、パフォーマンスに影響を与える可能性があります。
  • 初期化が必要
    • 配列を使用する前に、配列のサイズやデータ型を正しく宣言し、必要に応じて初期化する必要があります。
      誤って宣言すると、予期しないエラーが発生する可能性があります。
  • データの型に注意が必要
    • 配列は、同じデータ型の値を格納するため、異なるデータ型を扱いたい場合には工夫が必要です。
      例えば、整数と文字列を同じ配列に格納することはできないため、それぞれに適した配列を別々に用意しなければなりません。

配列と合わせて知っておきたい関数や機能を解説

VBAで配列を使用する際に、合わせて知っておきたい関数・機能を紹介します。

Array 関数の解説

Array 関数は、複数のデータを一度にまとめて管理したいときに使う便利な関数です。

この関数を使うと、たとえば名前や数字など、たくさんのデータを一気に配列に入れることができます。

例えば、次のコードは Array 関数を使って、名前のリストを作る例です。

Sub DisplayNames()
    Dim 名前 As Variant
    Dim i As Long
    
    '// Array関数を使用してデータを格納
    名前 = Array("太郎", "次郎", "花子")
    
    '// 配列内のデータを表示
    For i = LBound(名前) To UBound(名前)
        Debug.Print "名前(" & i & ") = " & 名前(i)
    Next i
End Sub

処理結果

このコードで使用している機能

  • LBound、UBound (配列のサイズを知る)

1行ずつ解説

コードの詳細
  1. Sub DisplayNames()
    • この行では、DisplayNamesという新しいサブルーチン(処理のまとまり)を定義しています。
      このサブルーチンを実行すると、指定されたタスクが順番に実行されます。
  2. Dim 名前 As Variant
    • ここでは、名前という配列を「Variant型」として宣言しています。
      「Variant型」は、異なるデータ型を格納できる柔軟な型であり、Array関数を使って複数のデータを格納する場合に特に便利です。
  3. Dim i As Long
    • この行では、「i」という変数をLong型として宣言しています。
      「i」は、ループ処理で使用するインデックス(カウンタ)として使用されます。
  4. 名前 = Array(“太郎”, “次郎”, “花子”)
    • Array関数を使用して、名前配列に「太郎」「次郎」「花子」という3つの名前を格納しています。
  5. For i = LBound(名前) To UBound(名前)
    • この行では、Forループを開始しています。
      LBound(名前)で配列名前の最初の要素のインデックスを取得し、UBound(名前)で最後の要素のインデックスを取得します。
      これにより、配列の全要素を順に処理することができます。
  6. Debug.Print “名前(” & i & “) = ” & 名前(i)
    • この行では、現在のループのインデックスiを使用して、配列名前の各要素をDebug.Printで表示しています。
      これにより、各名前がImmediateウィンドウに順番に表示されます。
  7. Next i
    • この行では、Forループの次のサイクルに進みます。
      iが次のインデックスに増加し、配列の次の要素が処理されます。
  8. End Sub
    • この行で、Sub DisplayNamesのサブルーチンが終了することを示しています。
      この時点で、サブルーチンのすべての処理が完了します。

このコードでは、Array 関数を使って、「太郎」「次郎」「花子」という3つの名前をまとめた配列を作っています。
この配列を使って、後で名前を順番に取り出し、表示することができます。

Option Baseについて (要素を1から開始する)

VBAでは、配列のインデックス(要素の位置を示す番号)は通常「0」から始まります。

これは、配列を宣言するときに最初の要素が「0」という番号で参照されることを意味します。
例えば、5つの要素を持つ配列を宣言すると、インデックスは「0」から「4」までとなります。

Dim 数字(4) As Long '// この配列は、数字(0)から数字(4)までの5つの要素を持ちます。

Option Baseを使用してみよう

Option Baseを使用するには、モジュールの一番上に「Option Base 1」 と記述します。


これにより、最初の要素が「0」ではなく「1」というインデックスで参照されるようになります。
例えば、5つの要素を持つ配列を宣言すると、インデックスは「1」から「5」までとなります。

Option Base 1

Sub ExampleOptionBase1()
    Dim 数字 As Variant
    Dim i As Long
    
    '// Array関数を使用してデータを格納
    数字 = Array(10, 20, 30, 40, 50)
    
    '// 配列内のデータを表示
    For i = LBound(数字) To UBound(数字)
        Debug.Print "数字(" & i & ") = " & 数字(i)
    Next i
End Sub
処理結果
このコードで使用している機能
1行ずつ解説
コードの詳細
  1. Option Base 1
    • この行では、Option Base 1 を設定しています。
      これにより、このモジュール内で宣言されるすべての配列のインデックスが「1」から始まるようになります。
      通常、VBAではインデックスは「0」から始まりますが、Option Base 1 を使用することで、最初の要素を「1」から開始することができます。
  2. Sub ExampleOptionBase1()
    • この行では、「ExampleOptionBase1」という新しいサブルーチン(処理のまとまり)を定義しています。
      このサブルーチンを実行すると、指定された一連のタスクが実行されます。
      この例では、配列を使ったデータの表示処理が行われます。
  3. Dim 数字 As Variant
    • ここでは、数字という配列を「Variant型」として宣言しています。
      「Variant型」は、異なるデータ型を格納できる柔軟な型であり、複数のデータを格納する場合に特に便利です。
      この配列に複数の数値を格納し、それを順に表示します。
  4. Dim i As Long
    • この行では、「i」という変数をLong型として宣言しています。
      「i」は、ループ処理で使用するインデックス(カウンタ)として使用され、配列の各要素に順番にアクセスするために利用されます。
  5. 数字 = Array(10, 20, 30, 40, 50)
    • Array 関数を使用して、数字配列に「10」「20」「30」「40」「50」という5つの数値を格納しています。
      これにより、数字配列には5つの要素が格納され、それぞれにインデックスが割り当てられます。
      Option Base 1 を使用しているため、最初のインデックスは「1」となります。
  6. For i = LBound(数字) To UBound(数字)
    • この行では、Forループを開始しています。
      LBound(数字) で配列 数字 の最初の要素のインデックスを取得し、UBound(数字) で最後の要素のインデックスを取得します。
      これにより、配列の全要素を順に処理することができます。
  7. Debug.Print “数字(” & i & “) = ” & 数字(i)
    • この行では、現在のループのインデックス「i」を使用して、配列数字の各要素をDebug.Printで表示しています。
      これにより、各要素のインデックスとその値が、イミディエイトウィンドウに表示されます。
      Debug.Printを使うことで、コードの動作をデバッグしながら確認できます。
  8. Next i
    • この行では、Forループの次のサイクルに進みます。
      変数「i」が次のインデックスに増加し、配列の次の要素が処理されます。
      これにより、配列の全ての要素が順番に処理されます。
  9. End Sub
    • この行で、「Sub ExampleOptionBase1」のサブルーチンが終了することを示しています。
      この時点で、サブルーチン内のすべての処理が完了し、処理が終了します。

使用する際の注意点

Option Base 1 を使用することで、インデックスが「1」から始まるため、自然な番号付け(例えば、1月から12月までを管理するなど)をしたい場合に便利です。

しかし、VBAの標準設定ではインデックスが「0」から始まることが多いため、Option Base 1 を使用すると、他のコードや標準的なVBAの使用法と整合性を保つことが難しくなる場合があります。

また、複数のモジュールやプロジェクト内でOption Base 1 を使用すると、インデックスの始まりが異なるコードが混在する可能性があり、エラーや混乱を招くことがあります。

そのため、特別な理由がない限り、Option Base 1 の使用は避けることをお勧めします。
標準の「0」ベースのインデックスに慣れることで、他のコードや一般的なVBAの使用例との一貫性を保ちやすくなります。
また、VBAを学習する際にも、他の教材やリソースと一致した使い方ができるため、学習効率が向上します。

配列を途中で格納データを確認したい場合:ローカルウインドウの使用

VBAで配列を使用する際、コードの実行中に配列に格納されたデータを確認したい場合があります。

このようなときに便利なのが、ローカルウインドウです。

ローカルウインドウを使うことで、デバッグ中に配列の中身をリアルタイムで確認することができ、コードの動作を細かくチェックすることができます。

ローカルウインドウで配列のデータを確認する方法

  1. ブレークポイントを設定する
    • 配列にデータを格納する行や、Forループの中でブレークポイントを設定します。
      これにより、コードがその行で一時停止します。

      ブレークポイントの設定
  2. コードを実行
    • コードを実行すると、ブレークポイントで一時停止します。

      ブレークポイントで処理が停止
  3. ローカルウインドウを表示
    • VBAエディターで「ローカルウインドウ」を表示します。
      表示メニューから「ローカルウインドウ」を選択すると、現在の変数の状態を確認できます。

      ローカルウインドウの表示方法
  4. 配列の中身を確認
    • ローカルウインドウに表示される変数リストの中から、対象の配列を選択すると、その配列のすべての要素とその値を確認できます。

      ローカルウインドウで配列のデータを確認した

ローカルウインドウのメリット

メリット
  • リアルタイムで確認
    • 配列の内容を実行中にリアルタイムで確認できるため、デバッグが容易になります。
  • 誤りの早期発見
    • 配列に期待通りのデータが格納されているかをその場で確認でき、バグを早期に発見できます。

この方法を活用することで、配列の操作をより正確に行うことができ、プログラムのデバッグがスムーズになります。

まとめ

配列の基本概念を理解することは、VBAでデータを効率的に管理するための第一歩です。

静的配列と動的配列の違いを理解し、必要に応じて使い分けることで、プログラムの柔軟性が向上します。

次のステップとして、各配列の具体的な使用方法を学び、さらに理解を深めましょう。

ポイントのおさらい

さらに学ぶために

この記事を通じて、VBAにおける配列の基本概念と使い方についての基礎をしっかりと学ぶことができました。
これからのプログラミングにおいて、配列を効果的に活用することで、データ処理の効率を大幅に向上させることができます。

次のステップとして、配列を使ったより高度な操作や応用方法に挑戦し、プログラムの柔軟性をさらに高めましょう。
例えば、動的配列を用いた複雑なデータ管理や、他のVBA機能との組み合わせによる自動化を習得することで、プログラミングの幅が大きく広がります。

あなたのプログラミングスキルを次のレベルに引き上げるために、ぜひこれらの知識を実際のプロジェクトで活用し、さらなる成長を目指してください。

タイトルとURLをコピーしました