ループ処理を使ってセルにデータを転記していたけれど、データが増えると動作が遅くなって困ったことはありませんか?
この記事では、VBAにおける「配列」の基本概念を詳しく解説します。
配列を使うことで、データを効率的に管理でき、プログラムのパフォーマンスが向上します。
データをまとめて処理できるため、高速で処理ができるようになりますよ。
この概念をしっかりと理解し、次に進むことで、配列の活用方法をより深く学べます。
ぜひご覧ください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事でできるようになること
この記事を読むと、次のことができるようになります。
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
処理結果
配列を使った転記
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
処理結果
このように、ループ処理を行うと処理に「約7.3秒」かかりましたが、配列を活用することで「約0.08秒」まで処理時間を短縮することができました。
※使用するパソコンのスペックにより、処理時間は異なる場合があります。
大量のデータを扱う場合は、配列を使用することで処理の効率が大幅に向上し、作業をより迅速に行うことが可能になります。
関連データのグループ化
複数の関連データをグループ化して扱う際に、配列を使用します。
例えば、ある商品の「名前」「価格」「在庫数」などの情報を管理する場合、それぞれのデータを別々に管理すると複雑になります。
そこで、配列を使ってこれらの関連するデータを1つのグループとして扱うことで、管理が簡単になり、データの整理や分析が容易になります。
ループ処理の効率化
繰り返し処理を行う際、配列を利用することで、各要素に対して同じ処理を簡単に実行できます。
例えば、30人の学生のテストの点数があり、それぞれの点数を順番にチェックして平均点を計算したい場合、配列を使うと全ての点数を一括で処理することができます。
配列にデータを格納し、For ループを使って順番に点数を処理することで、コードがシンプルになり、効率的に作業を進めることができます。
配列を使うメリット・デメリット
配列を使うメリットは、以下の通りです。
配列を使うデメリットは、以下の通りです。
配列と合わせて知っておきたい関数や機能を解説
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行ずつ解説
- Sub DisplayNames()
- この行では、DisplayNamesという新しいサブルーチン(処理のまとまり)を定義しています。
このサブルーチンを実行すると、指定されたタスクが順番に実行されます。
- この行では、DisplayNamesという新しいサブルーチン(処理のまとまり)を定義しています。
- Dim 名前 As Variant
- ここでは、名前という配列を「Variant型」として宣言しています。
「Variant型」は、異なるデータ型を格納できる柔軟な型であり、Array関数を使って複数のデータを格納する場合に特に便利です。
- ここでは、名前という配列を「Variant型」として宣言しています。
- Dim i As Long
- この行では、「i」という変数をLong型として宣言しています。
「i」は、ループ処理で使用するインデックス(カウンタ)として使用されます。
- この行では、「i」という変数をLong型として宣言しています。
- 名前 = Array(“太郎”, “次郎”, “花子”)
- Array関数を使用して、名前配列に「太郎」「次郎」「花子」という3つの名前を格納しています。
- For i = LBound(名前) To UBound(名前)
- この行では、Forループを開始しています。
LBound(名前)で配列名前の最初の要素のインデックスを取得し、UBound(名前)で最後の要素のインデックスを取得します。
これにより、配列の全要素を順に処理することができます。
- この行では、Forループを開始しています。
- Debug.Print “名前(” & i & “) = ” & 名前(i)
- この行では、現在のループのインデックスiを使用して、配列名前の各要素をDebug.Printで表示しています。
これにより、各名前がImmediateウィンドウに順番に表示されます。
- この行では、現在のループのインデックスiを使用して、配列名前の各要素をDebug.Printで表示しています。
- Next i
- この行では、Forループの次のサイクルに進みます。
iが次のインデックスに増加し、配列の次の要素が処理されます。
- この行では、Forループの次のサイクルに進みます。
- End Sub
- この行で、Sub DisplayNamesのサブルーチンが終了することを示しています。
この時点で、サブルーチンのすべての処理が完了します。
- この行で、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行ずつ解説
- Option Base 1
- この行では、Option Base 1 を設定しています。
これにより、このモジュール内で宣言されるすべての配列のインデックスが「1」から始まるようになります。
通常、VBAではインデックスは「0」から始まりますが、Option Base 1 を使用することで、最初の要素を「1」から開始することができます。
- この行では、Option Base 1 を設定しています。
- Sub ExampleOptionBase1()
- この行では、「ExampleOptionBase1」という新しいサブルーチン(処理のまとまり)を定義しています。
このサブルーチンを実行すると、指定された一連のタスクが実行されます。
この例では、配列を使ったデータの表示処理が行われます。
- この行では、「ExampleOptionBase1」という新しいサブルーチン(処理のまとまり)を定義しています。
- Dim 数字 As Variant
- ここでは、数字という配列を「Variant型」として宣言しています。
「Variant型」は、異なるデータ型を格納できる柔軟な型であり、複数のデータを格納する場合に特に便利です。
この配列に複数の数値を格納し、それを順に表示します。
- ここでは、数字という配列を「Variant型」として宣言しています。
- Dim i As Long
- この行では、「i」という変数をLong型として宣言しています。
「i」は、ループ処理で使用するインデックス(カウンタ)として使用され、配列の各要素に順番にアクセスするために利用されます。
- この行では、「i」という変数をLong型として宣言しています。
- 数字 = Array(10, 20, 30, 40, 50)
- Array 関数を使用して、数字配列に「10」「20」「30」「40」「50」という5つの数値を格納しています。
これにより、数字配列には5つの要素が格納され、それぞれにインデックスが割り当てられます。
Option Base 1 を使用しているため、最初のインデックスは「1」となります。
- Array 関数を使用して、数字配列に「10」「20」「30」「40」「50」という5つの数値を格納しています。
- For i = LBound(数字) To UBound(数字)
- この行では、Forループを開始しています。
LBound(数字) で配列 数字 の最初の要素のインデックスを取得し、UBound(数字) で最後の要素のインデックスを取得します。
これにより、配列の全要素を順に処理することができます。
- この行では、Forループを開始しています。
- Debug.Print “数字(” & i & “) = ” & 数字(i)
- この行では、現在のループのインデックス「i」を使用して、配列数字の各要素をDebug.Printで表示しています。
これにより、各要素のインデックスとその値が、イミディエイトウィンドウに表示されます。
Debug.Printを使うことで、コードの動作をデバッグしながら確認できます。
- この行では、現在のループのインデックス「i」を使用して、配列数字の各要素をDebug.Printで表示しています。
- Next i
- この行では、Forループの次のサイクルに進みます。
変数「i」が次のインデックスに増加し、配列の次の要素が処理されます。
これにより、配列の全ての要素が順番に処理されます。
- この行では、Forループの次のサイクルに進みます。
- End Sub
- この行で、「Sub ExampleOptionBase1」のサブルーチンが終了することを示しています。
この時点で、サブルーチン内のすべての処理が完了し、処理が終了します。
- この行で、「Sub ExampleOptionBase1」のサブルーチンが終了することを示しています。
使用する際の注意点
Option Base 1 を使用することで、インデックスが「1」から始まるため、自然な番号付け(例えば、1月から12月までを管理するなど)をしたい場合に便利です。
しかし、VBAの標準設定ではインデックスが「0」から始まることが多いため、Option Base 1 を使用すると、他のコードや標準的なVBAの使用法と整合性を保つことが難しくなる場合があります。
また、複数のモジュールやプロジェクト内でOption Base 1 を使用すると、インデックスの始まりが異なるコードが混在する可能性があり、エラーや混乱を招くことがあります。
そのため、特別な理由がない限り、Option Base 1 の使用は避けることをお勧めします。
標準の「0」ベースのインデックスに慣れることで、他のコードや一般的なVBAの使用例との一貫性を保ちやすくなります。
また、VBAを学習する際にも、他の教材やリソースと一致した使い方ができるため、学習効率が向上します。
配列を途中で格納データを確認したい場合:ローカルウインドウの使用
VBAで配列を使用する際、コードの実行中に配列に格納されたデータを確認したい場合があります。
このようなときに便利なのが、ローカルウインドウです。
ローカルウインドウを使うことで、デバッグ中に配列の中身をリアルタイムで確認することができ、コードの動作を細かくチェックすることができます。
ローカルウインドウで配列のデータを確認する方法
- ブレークポイントを設定する
- 配列にデータを格納する行や、Forループの中でブレークポイントを設定します。
これにより、コードがその行で一時停止します。
- 配列にデータを格納する行や、Forループの中でブレークポイントを設定します。
- コードを実行
- コードを実行すると、ブレークポイントで一時停止します。
- コードを実行すると、ブレークポイントで一時停止します。
- ローカルウインドウを表示
- VBAエディターで「ローカルウインドウ」を表示します。
表示メニューから「ローカルウインドウ」を選択すると、現在の変数の状態を確認できます。
- VBAエディターで「ローカルウインドウ」を表示します。
- 配列の中身を確認
- ローカルウインドウに表示される変数リストの中から、対象の配列を選択すると、その配列のすべての要素とその値を確認できます。
- ローカルウインドウに表示される変数リストの中から、対象の配列を選択すると、その配列のすべての要素とその値を確認できます。
ローカルウインドウのメリット
この方法を活用することで、配列の操作をより正確に行うことができ、プログラムのデバッグがスムーズになります。
まとめ
配列の基本概念を理解することは、VBAでデータを効率的に管理するための第一歩です。
静的配列と動的配列の違いを理解し、必要に応じて使い分けることで、プログラムの柔軟性が向上します。
次のステップとして、各配列の具体的な使用方法を学び、さらに理解を深めましょう。
ポイントのおさらい
さらに学ぶために
この記事を通じて、VBAにおける配列の基本概念と使い方についての基礎をしっかりと学ぶことができました。
これからのプログラミングにおいて、配列を効果的に活用することで、データ処理の効率を大幅に向上させることができます。
次のステップとして、配列を使ったより高度な操作や応用方法に挑戦し、プログラムの柔軟性をさらに高めましょう。
例えば、動的配列を用いた複雑なデータ管理や、他のVBA機能との組み合わせによる自動化を習得することで、プログラミングの幅が大きく広がります。
あなたのプログラミングスキルを次のレベルに引き上げるために、ぜひこれらの知識を実際のプロジェクトで活用し、さらなる成長を目指してください。