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

・複数のデータをまとめて管理する方法を知りたい
・配列の基本的な概念を理解したい
・VBA初心者でも簡単に配列を使いこなしたい



その場合は、VBAの「配列」を
使用すると解決します!
この記事では、VBAにおける「配列」の基本概念を詳しく解説します。
配列を使うことで、データを効率的に管理でき、プログラムのパフォーマンスが向上します。
データをまとめて処理できるため、高速で処理ができるようになりますよ。
この概念をしっかりと理解し、次に進むことで、配列の活用方法をより深く学べます。
ぜひご覧ください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事でできるようになること
この記事を読むと、次のことができるようになります。
- VBAでの配列はなにか?を学習する
- 配列の種類 (静的配列・動的配列) について学ぶ
- 配列がよく使われる場面を確認する
- 配列を使うメリット・デメリットを確認する
- 配列と合わせて知っておきたい関数・機能を学ぶ
VBAにおける「配列」とは? を徹底解説
VBAで複数のデータを効率的に処理するためには「配列」を使うのが非常に便利です。
この記事では、VBAでの配列の宣言や初期化、配列のデータ操作に関して、基本的な使い方から実践的な応用までをわかりやすく解説します。
VBAで「配列」を使うとこんなことができます
VBAにおける「配列」を活用することで、以下のような場面で作業を効率化できます。
- 大量のデータを一括で管理
- 例えば、数百行にわたるデータを一つ一つ処理する代わりに、配列を使うことで一括操作が可能です。
- コードのシンプル化
- 複数の変数を用意せずに済み、配列を使ってデータをまとめることで、スッキリしたコードが書けます。
- 高速なデータ処理
- 大量のデータをループで処理する場合、配列を使うことでパフォーマンスが大幅に向上します。
これらの機能を使いこなすことで、VBAを使った作業効率が劇的に改善されます。
VBAにおける「配列」と「変数」は何が違う?
VBAでは、データを保存・管理するために「変数」を使用します。
しかし、1つの変数には1つのデータしか格納できません。


例えば、1人の学生のテストの点数を管理する場合、次のように「変数」を使います。
Dim Score As Long
Score = 85
このように1人分の点数を変数に格納するのは簡単ですが、もしクラス全員(30人)の点数を管理する必要があれば、30個の変数を作ることになります。
これは非常に面倒で、管理が複雑になってしまいます。
Dim Score_佐藤 As Long
Dim Score_鈴木 As Long
Dim Score_伊藤 As Long
・・・
Score_佐藤 = 85
Score_鈴木 = 70
Score_伊藤 = 60
・・・
こうした状況で役立つのが、「配列」です。
VBAで配列を使うと、複数のデータを一つの変数名(箱)で管理でき、コードがシンプルで効率的になります。
VBAにおける「配列」とは?を解説
配列とは、複数のデータを一つの名前でまとめて管理するための仕組みです。
例えば、クラス全員の点数を一つの配列にまとめて格納できます。
これにより、データの整理が簡単になり、操作も一括で行えるため、VBAの処理速度も向上します。


配列の宣言方法
VBAで次のようなコードを記述すると、学生のテストの点数を管理する「配列」を宣言することができます。
Dim Score(29) As Long '// 30人分の点数をまとめて管理できる配列を作成
このコードは30人分の点数を管理する配列を作成しています。
VBAでは配列のインデックスが「0」から始まるため、Score(0)からScore(29)まで、合計30個のデータを格納することが可能です。
VBAにおける「配列」の初期化とデータ格納方法
配列を宣言したら、次はデータを格納します。
配列へのデータ格納には、手動で値を設定する方法やループ処理を使って自動的に設定する方法があります。
次のように、各学生の点数を手動で格納することができます。
Score(0) = 85
Score(1) = 90
Score(2) = 78
VBA 配列の初期化方法
配列の初期化とは、配列に格納されているデータをすべて削除することです。
VBAでは、Erase
を使って配列を初期化します。
これにより、配列のすべての要素がデフォルト値にリセットされます。
Erase Score
VBAにおける「配列」のデータ取り出し方法 (インデックスの使用)
また、配列にデータを格納したら、続いて配列のデータを取り出す必要があります。
取り出し方法は「一括」や「個別」どちらでも取り出すことができます。
その際、どのデータを取り出せばよいかを指定する必要があります。
これを助けてくれるのが「インデックス」であり指定された位置のデータを取得します。
MsgBox "1番目の学生の点数は " & score(0)
このコードは、Score(0)
に格納されたデータ(1番目の学生の点数)をメッセージボックスに表示します。
インデックスとは?
配列に格納された各データには、位置を特定するための「番号」が付けられています。
この番号を「インデックス」と呼びます。
インデックスを使うことで、配列の中から特定のデータを簡単に取り出すことができます。


通常、VBAではインデックスは「0」または「1」から始まりますが、これを変更することもできます。
VBAにおける配列の種類:静的配列と動的配列の違いを解説
VBAで配列を扱う際には、大きく分けて「静的配列」と「動的配列」の2種類があります。
それぞれの配列には適した使用場面があり、特に動的配列を使いこなすことで、柔軟にデータを管理できます。
以下では、VBA配列の宣言方法から、それぞれの配列の特徴や使いどころについて解説していきます。
静的配列とは?
VBAにおける静的配列とは、配列のサイズをあらかじめ固定して宣言する方法です。
プログラムの実行中に配列のサイズを変更することができないため、事前に格納するデータの数がわかっている場合に使用します。
静的配列の宣言方法
例えば、次のように宣言することで静的配列を作成します。
Dim 数字(4) As Long
この静的配列には「5つ」の値を格納できます。
通常、VBAの配列はインデックスが「0」から開始するため、数字(0)
から数字(4)
までのデータを格納できるという仕組みです。
静的配列がよく使われる場面
静的配列は、データの量が決まっている状況で非常に便利です。
以下はその典型的な使用例です。
- 曜日や月のデータの管理
- 1週間の曜日や1年間の月を固定のデータとして扱う場合に使用されます。
- 特定の数値セットの保存
- 例えば、テストの得点範囲(0〜100点)や評価基準など、予め決められた数値を管理する際に使用されます。
- 固定されたオプションリストの作成
- プルダウンメニューや選択肢が決まっている場合(例:性別や都道府県名)に、そのデータを静的配列で管理します。
静的配列については、次の記事で詳しく解説しています。 ぜひご覧ください。


動的配列とは?
VBAにおける動的配列は、プログラムの実行中に配列のサイズを変更できる柔軟な配列です。
データの量が事前に不明な場合や、処理の途中でデータ量が変わる可能性がある場合に非常に有効であり、柔軟なデータ管理を実現します。
動的配列の宣言方法とサイズ変更
VBAで「動的配列」を宣言する際は、まず配列を宣言し、必要なサイズを後で設定します。
サイズを動的に変更するために、ReDim
というVBAの機能を活用します。
この機能により、VBAで配列のサイズを自由に可変できるのが動的配列の大きなメリットです。
Dim 数字() As Long
ReDim 数字(4)
このコードは、最初にサイズ未定の「配列」を宣言し、その後でReDim
を使って配列のサイズを設定します。
このように動的配列のサイズは、必要に応じて可変することも可能です。
動的配列がよく使われる場面
動的配列は、動的にデータの量が可変する場面で非常に有効です。
以下のようなシチュエーションで使われます。
- ユーザー入力に応じたデータの管理
- フォームやユーザー入力によってデータの数が変動する場合、動的配列を使って必要なサイズの配列を生成し、そのデータを効率的に管理できます。
- データベースやシートからの可変データの取得
- Excelシートやデータベースからデータを読み込む際、行数や列数が変わることがあります。動的配列を使うことで、取得したデータを適切なサイズで格納できます。
- リストの動的拡張
- 配列に新しい項目を追加する必要がある場合、動的配列を使うことで、データをリアルタイムに拡張しながら管理できます。
動的配列については、次の記事で詳しく解説しています。 ぜひご覧ください。


VBAで配列がよく使われる場面
VBAにおける配列は、効率的なデータ管理や処理速度の向上において非常に役立つツールです。
ここでは、VBA配列がよく使われる3つの典型的な場面を紹介します。
よく使われる場面1: 大量のデータを高速で処理する場合
大量のデータを一度に処理する必要がある場合、配列は非常に便利です。
例えば、膨大な数のデータを別のシートに転記するシナリオを考えてみましょう。
ループを使って1つずつデータを転記する方法と、配列を使って一括でデータを転記する方法では、処理速度に大きな差が生じます。
以下のコード例では、「50,000件」のデータを転記する際に、ループ処理と配列を使った場合の処理時間を比較しています。


ループ処理(For Next)での転記
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
処理結果


このように、VBA配列とRangeを組み合わせることで、データをでセルに一括処理 (貼り付け) でき、処理時間を大幅に短縮できます。
結果は、ループ処理を行うと処理に「約7.3秒」かかりましたが、配列を活用することで「約0.08秒」まで処理時間を短縮することができました。
※使用するパソコンのスペックにより、処理時間は異なる場合があります。
大量のデータを扱う場合は、VBAで配列を使用することで、処理の効率が格段に向上し、作業をより迅速に行うことが可能です。
特に、VBA配列とRangeの組み合わせは、データの大量処理において非常に効果的です。
よく使われる場面2: 関連データのグループ化
VBAで配列を使用することにより、複数の関連データを効率的にグループ化して管理できます。
配列を使えば、これらのデータを1つのグループとしてまとめて扱うことが可能です。
例えば、次のように各商品ごとに複数のデータを格納することができます。
Dim 商品情報(2, 2) As Variant
商品情報(0, 0) = "商品A"
商品情報(0, 1) = 1000 ' 価格
商品情報(0, 2) = 50 ' 在庫数
このように、VBAの配列を使って関連するデータを一括管理することで、データの整理や分析が簡単になり、複雑なデータ操作を効率的に行えるようになります。
よく使われる場面3: ループ処理の効率化
繰り返し処理(ループ処理)を行う際に、VBAの配列を利用することで、各要素に対して同じ処理を効率的に実行できます。
例えば、30人の学生のテストの点数を順番にチェックし、平均点を計算する場合、配列を使うと全ての点数を一括で処理できます。
以下のコード例では、学生の点数を配列に格納し、For ループ
を使って平均点を計算する方法を示します。
Sub CalculateAverageScore()
Dim Scores(29) As Long '// 30人分の点数を格納
Dim i As Long, Total As Long
Dim AvgScore As Double
'// サンプルとして、点数を配列に格納
For i = 0 To 29
Scores(i) = Int(Rnd * 100) '// ランダムな点数を格納(0〜99点)
Next i
'// 点数を順番に合計して平均点を計算
For i = 0 To 29
Total = Total + Scores(i)
Next i
AvgScore = Total / 30
MsgBox "平均点は " & AvgScore & " 点です。"
End Sub
このように、VBAの配列を使用してループ処理を効率化することで、コードがシンプルかつ見やすくなり、作業を迅速に進めることが可能です。
また、配列にデータをまとめて格納しておくことで、データの量や構造が変わっても柔軟に対応できます。
VBAで配列を使うメリット・デメリット
VBAにおける配列の使用には、多くのメリットがありますが、特定の状況に応じてデメリットもあります。
ここでは、VBAの配列を使用するうえでの「メリット」と「デメリット」について詳しく見ていきましょう。
配列を使うメリットについて
配列を使用することで、データ処理や管理が大幅に効率化されます。
主なメリットを以下に挙げます。
- 処理の高速化
- VBAで配列を使う最大のメリットは、ループ処理の際に処理速度が大幅に向上することです。
データを一度に配列に格納してからシートにまとめて貼り付けることで、ExcelとVBAのやり取りを最小限に抑えられます。
その結果、全体の処理速度が劇的に向上します。
- VBAで配列を使う最大のメリットは、ループ処理の際に処理速度が大幅に向上することです。
- データの整理と管理が容易
- VBAの配列を使うことで、関連するデータを一つの変数でまとめて管理できるため、データの整理やアクセスが簡単になります。
複数の変数を使ってデータを管理する手間が減り、コードがスッキリとし、メンテナンスも容易になります。
- VBAの配列を使うことで、関連するデータを一つの変数でまとめて管理できるため、データの整理やアクセスが簡単になります。
- コードの簡潔化
- 配列を使うことで、同じ処理を複数のデータに対して実行する場合、コードが短くなり、見やすくなります。
例えば、Forループと組み合わせて使うことで、繰り返し処理を効率的に行うことができ、結果としてコードの可読性が向上します。
- 配列を使うことで、同じ処理を複数のデータに対して実行する場合、コードが短くなり、見やすくなります。
- 一括操作が可能
- VBAの配列とRangeを合わせて使うと、複数のデータを一括で処理することができます。
例えば、複数のセルに一度にデータを入力したり、配列内の全ての要素に対して同じ操作を実行したりすることが可能です。
これにより、データ処理が迅速化され、作業の効率が向上します。
- VBAの配列とRangeを合わせて使うと、複数のデータを一括で処理することができます。
配列を使うデメリットについて
一方で、VBAの配列にはいくつかの注意点やデメリットもあります。
以下にそのポイントを挙げます。
- メモリの使用量が増える
- 配列は、あらかじめメモリ領域を確保してデータを格納します。
そのため、大きな配列や不要なデータを格納した場合、メモリ消費が増え、システムパフォーマンスに悪影響を与える可能性があります。
特に、大量のデータを扱う際にはメモリの管理が重要です。
- 配列は、あらかじめメモリ領域を確保してデータを格納します。
- 初期化が必要
- VBA配列の初期化は、プログラムを安全に動作させるために欠かせません。
配列を使う前に配列の宣言と初期化を正しく行わないと、エラーが発生する可能性があります。
動的配列の場合には、ReDim
やReDim Preserve
を使って配列のサイズを設定する必要があります。
- VBA配列の初期化は、プログラムを安全に動作させるために欠かせません。
- データの型に注意が必要
- 配列には、同じデータ型の値しか格納できません。
例えば、整数と文字列を同じ配列に格納することはできないため、異なるデータ型を扱いたい場合には、複数の配列を用意する必要があります。
Variant型配列を使えば複数のデータ型を扱うことが可能ですが、その場合は動作が遅くなる可能性もあります。
- 配列には、同じデータ型の値しか格納できません。
配列と合わせて知っておきたい関数や機能をご紹介
VBAで配列を効率よく使うために、いくつかの便利な関数や機能を知っておくと、データ処理がさらに簡単になります。
ここでは、配列に関する重要な関数や機能を紹介します。
VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。


\ 自分のペースで学べるVBA講座はこちら /
知っておきたい機能1: Array 関数の解説
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
処理結果


コードの動作概要
まず、Variant型
の動的な配列「名前」を宣言します。
配列は複数の要素を格納できるデータ構造で、この場合、Array
関数を使って「太郎」「次郎」「花子」という3つの要素をまとめて格納します。
次に、配列の各要素にアクセスし、それを順番に表示します。
この時、LBound
関数を使って配列の最初のインデックス(要素番号)を取得し、UBound
関数で最後のインデックスを取得します。
ループが実行されると、各要素が順にDebugウィンドウに出力されます。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub DisplayNames()
- この行では、DisplayNamesという新しいサブルーチン(処理のまとまり)を定義しています。
このサブルーチンを実行すると、指定されたタスクが順番に実行されます。
- この行では、DisplayNamesという新しいサブルーチン(処理のまとまり)を定義しています。
- Dim 名前 As Variant
- ここでは、名前という配列を「Variant型」として宣言しています。
「Variant型」は、異なるデータ型を格納できる柔軟な型であり、Array関数を使って複数のデータを格納する場合に特に便利です。
※Array関数を使用して配列を作成する場合は「Variant型」でないとエラーが発生します。
- ここでは、名前という配列を「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つの名前をまとめた配列を作っています。
この配列を使って、後で名前を順番に取り出し、表示することができます。
Array関数については、別の記事で詳細を解説しています。 合わせてご覧ください。


知っておきたい機能2: Option Baseについて (要素を1から開始する)
VBAでは、配列のインデックス(要素の位置を示す番号)は通常「0」から始まります。
これは、配列を宣言するときに最初の要素が「0」という番号で参照されることを意味します。
例えば、5つの要素を持つ配列を宣言すると、インデックスは「0」から「4」までとなります。
Dim 数字(4) As Long '// この配列は、数字(0)から数字(4)までの5つの要素を持ちます。
Option Baseを使用することで、配列のインデックスを「1」から始まるように設定を行うことができます。
Option Baseを使用してみよう
Option Baseを使用するには、モジュールの一番上に「Option Base 1」 と記述します。


これにより、最初の要素が「0」ではなく「1」というインデックスで参照されるようになります。
例えば、5つの要素を持つ配列を宣言すると、インデックスは「1」から「5」までとなります。
Option Baseのコード例
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
処理結果


コードの動作概要
通常、VBAでは配列のインデックスは0から始まりますが、この行をコードの先頭に記述することで、配列のインデックスが1から始まるようになります。
Variant型
の配列「数字」を宣言し、Array
関数を使って「10」「20」「30」「40」「50」の5つの値を持つ配列を作成しています。
Option Base 1が適用されているため、配列のインデックスは1から5になります。
LBound
関数で配列の最小インデックス(1)を取得し、UBound
関数で最大インデックス(5)を取得して、Forループを使って配列内のデータを順番に表示します。
LBound(数字)
= 1(最初の要素のインデックス)UBound(数字)
= 5(最後の要素のインデックス)
このため、配列の要素「10, 20, 30, 40, 50」がインデックス「1」から順に出力されます。
このコードで使用している機能
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を学習する際にも、他の教材やリソースと一致した使い方ができるため、学習効率が向上します。
知っておきたい機能3: 配列の初期化 (Eraseステートメント)
VBA配列の初期化とは、配列に格納されているデータをリセットすることです。
Erase
ステートメントを使って配列を初期化することができます。
配列の初期化のコード例
Sub InitializeArray()
Dim 数字(9) As Long '// 10個の要素を持つ配列を宣言
'// 配列にデータを格納
数字(0) = 1
数字(1) = 2
'// 初期化
Erase 数字
'// 初期化後の配列を確認
Debug.Print 数字(0) ' 0が出力される
End Sub
処理結果


コードの動作概要
ここで、10個の要素を持つ数値型の配列「数字」が宣言されています。
配列はインデックスが「0」から始まるため、数字(0)から数字(9)までの要素を持っています。
配列の最初の2つの要素に、値「1」と「2」を代入しています。
これにより、数字(0) = 1、数字(1) = 2という状態になります。
Erase
ステートメントを使って、配列「数字」の全要素を初期化します。
数値型の配列では、すべての要素が「0」にリセットされます。
このコードで使用している機能
- なし
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub InitializeArray()
- InitializeArrayという新しいサブルーチン(Subプロシージャ)が定義されます。
ここから、このサブルーチン内の処理が順次実行されます。
- InitializeArrayという新しいサブルーチン(Subプロシージャ)が定義されます。
- Dim 数字(9) As Long
- 10個の要素を持つ配列「数字」を宣言しています。
配列はLong型(整数型)で、インデックスは「0」から「9」までの10個の要素を持ちます。
つまり、数字(0)から数字(9)までのインデックスが使用可能です。
- 10個の要素を持つ配列「数字」を宣言しています。
- 数字(0) = 1
- ここでは、配列の最初の2つの要素にデータを格納しています。
「数字(0)」には「1」が代入されます。
- ここでは、配列の最初の2つの要素にデータを格納しています。
- 数字(1) = 2
- 「数字(1)」には「2」が代入されます。
これで、配列の最初の2つの要素が埋まっている状態になります。
残りの要素はまだデフォルトの値で初期化されています(この場合は「0」)。
- 「数字(1)」には「2」が代入されます。
- Erase 数字
- Eraseステートメントを使って、配列「数字」を初期化します。
Long型(数値型)の配列は初期化されると、全ての要素が「0」にリセットされます。
これにより、配列内のすべての要素がクリアされます。
- Eraseステートメントを使って、配列「数字」を初期化します。
- Debug.Print 数字(0)
- Debug.Printは、イミディエイトウィンドウに情報を出力するためのステートメントです。
この行では、配列「数字」の最初の要素である数字(0)を確認します。
- Debug.Printは、イミディエイトウィンドウに情報を出力するためのステートメントです。
- End Sub
- この行で、「Sub InitializeArray()」のサブルーチンが終了することを示しています。
この時点で、サブルーチン内のすべての処理が完了し、処理が終了します。
- この行で、「Sub InitializeArray()」のサブルーチンが終了することを示しています。
Eraseステートメントは、配列を初期化するために使用されます。
数値型の配列では、すべての要素が「0」にリセットされ、文字列型の配列の場合は空文字列になります。
Eraseを使うと、配列のサイズはそのままで内容のみが初期化されます。
動的配列の場合はメモリが解放され、再度ReDimでサイズを指定し直す必要があります。
VBAで配列をリセットして再利用する際に便利です。
知っておきたい機能4: Transposeを使った配列の変換
VBAのTranspose関数は、縦方向(列)に並んだデータを横方向(行)に変換したり、逆に横方向のデータを縦方向に並べ替えるのにとても便利な関数です。
たとえば、リストが縦に並んでいる場合、それを横に広げて表示したいときに使えます。
Transpose関数のコード例
Sub UseTranspose()
Dim arr As Variant
'// 配列を作成
arr = Array(1, 2, 3, 4, 5)
'// セルに貼り付け
Range(Cells(1, 1), Cells(UBound(arr) + 1, 1)) = WorksheetFunction.Transpose(arr)
End Sub
処理結果


コードの動作概要
arr
という名前の配列を宣言しています。
データ型は Variant
型を使用しています。
Array
関数を使って、1, 2, 3, 4, 5
の5つの要素を持つ1次元の配列を作成しています。
配列の内容を Excel シートのセルに貼り付けます。
Transpose 関数を使って、配列の形状を縦方向に変換しています。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub UseTranspose()
- この行は、UseTransposeという名前のサブルーチンを定義しています。
サブルーチンは、処理のまとまりを1つにまとめたもので、他のコードから何度でも呼び出すことができます。
ここでは、配列を作成してシートに転送する処理をまとめています。
- この行は、UseTransposeという名前のサブルーチンを定義しています。
- Dim arr As Variant
- この行では、「arr」という名前の配列変数をVariant型として宣言しています。
Variant型は、VBAで最も汎用的なデータ型で、数値、文字列、配列など様々なデータを扱うことができます。
ここでは、後で配列を格納するために使用します。
- この行では、「arr」という名前の配列変数をVariant型として宣言しています。
- arr = Array(1, 2, 3, 4, 5)
- ここで、Array関数を使って「arr」に配列を代入しています。
この配列には、「1」から「5」までの数値が格納されます。
Array関数はカンマで区切られた値をまとめて1つの配列として扱います。
この例では、arr(0)が1、arr(1)が2というふうに配列の各要素にアクセスできます。
- ここで、Array関数を使って「arr」に配列を代入しています。
- Range(Cells(1, 1), Cells(UBound(arr) + 1, 1)).Value = WorksheetFunction.Transpose(arr)
- この行は、配列の内容をExcelシートのセルに貼り付けるための処理です。
Rangeオブジェクトを使ってセル範囲を指定し、Transpose関数で配列の向きを縦方向に変換して貼り付けています。
この処理により、配列の値 1, 2, 3, 4, 5 がセル「A1:A5」に縦方向に貼り付けられます。- Cells(1, 1)
- ExcelのセルA1を指しています。Cells(行番号, 列番号)の形式でセルを指定します。
この場合、1行目の1列目、つまりA1セルです。
- ExcelのセルA1を指しています。Cells(行番号, 列番号)の形式でセルを指定します。
- UBound(arr) + 1
- UBoundは配列の上限(インデックスの最大値)を取得する関数です。
「arr」の上限は4なので、これに「1」を足して「5」とし、Cells(5, 1)つまりセル「A5」までの範囲を指定しています。
- UBoundは配列の上限(インデックスの最大値)を取得する関数です。
- WorksheetFunction.Transpose(arr)
- Transposeは配列の縦横を変換する関数です。
この場合、横方向の配列を縦方向に変換してシートに貼り付けます。
- Transposeは配列の縦横を変換する関数です。
- Cells(1, 1)
- この行は、配列の内容をExcelシートのセルに貼り付けるための処理です。
- End Sub
- この行でサブルーチンが終了します。
サブルーチンは、Subで始まりEnd Subで終わるのがVBAのルールです。
UseTransposeサブルーチンは、配列をシートに転送する一連の処理を実行するためのものでした。
- この行でサブルーチンが終了します。
Transpose関数を使うと、配列の縦横を簡単に入れ替えることができます。
例えば、横向き(1行に並んだ)データを縦向き(1列に並んだ)データに変換することが可能です。
反対に、縦向きのデータを横向きに並べ替えることもできます。
これにより、データを見やすい形式に変換したり、Excelシートに効率的に貼り付けることができます。
簡単にデータの配置を変更できる便利な機能です。
Transposeを使用する際の注意ポイント
Transpose関数は、VBAで配列を縦横に入れ替えるための便利なワークシート関数ですが、使用する際にはいくつかの重要なポイントに注意する必要があります。
1. データ量の上限
Transpose関数は、Excelがサポートするセル数に制約があります。
大きな配列や大量のデータを扱う際、Transposeを使うと「Excelのリソース制限」に引っかかり、エラーが発生することがあります。
- エクセルのバージョンには寄りますが、データ数が「65,536」を超えてTransposeで入れ替えようとすると、エラーが発生する可能性があります。
2. エラーの回避方法
もし、上限を超える大規模なデータを扱う場合は、Transpose関数ではなく、専用のコードを作成して、手動で縦横を入れ替える処理を実装する必要があります。
Sub ManualTranspose()
Dim 元配列 As Variant
Dim 入替配列() As Variant
Dim i As Long, j As Long
'// 元配列の定義
元配列 = Range("A1:C5").Value '// 5行3列のデータ
'// 入替配列のサイズを設定
ReDim 入替配列(LBound(元配列, 2) To UBound(元配列, 2), LBound(元配列, 1) To UBound(元配列, 1))
'// 元配列の縦横を手動で入れ替える
For i = LBound(元配列, 1) To UBound(元配列, 1)
For j = LBound(元配列, 2) To UBound(元配列, 2)
入替配列(j, i) = 元配列(i, j)
Next j
Next i
'// 結果をシートに貼り付ける(ここで行列が入れ替わった配列を転送)
Range("E1").Resize(UBound(入替配列, 1), UBound(入替配列, 2)).Value = 入替配列
End Sub
このように、自作のコードで大規模なデータを効率的に扱うことが可能です。
3. Transposeの使用シナリオ
Transpose関数は、比較的小規模なデータの配列操作には最適です。
たとえば、数百行・数列レベルのデータを一括で縦横に入れ替える作業には、非常に便利でシンプルな方法です。
- 小規模な表形式データの変換
- 行と列を逆転させたい場合に、Transposeは素早くデータを整えることができます。
知っておきたい機能5: 配列のソート (Sort)
VBA配列のソート(Sort)を行うことで、配列内のデータを順番に並べ替えることができます。
VBAには直接的なソート関数はありませんが、コードを自作するかExcelのRange.Sortメソッドを利用してソートを実行できます。
配列を使ったソート (Sort)の一例
Sub SortArray()
Dim 数字 As Variant
Dim i As Long, j As Long
Dim temp As Variant
'// 数字の配列を初期化
数字 = Array(5, 3, 8, 1, 9)
'// バブルソートでソート処理
For i = LBound(数字) To UBound(数字) - 1
For j = i + 1 To UBound(数字)
If 数字(i) > 数字(j) Then
'// 入れ替え
temp = 数字(i)
数字(i) = 数字(j)
数字(j) = temp
End If
Next j
Next i
'// 結果を表示
Debug.Print Join(数字, ", ")
End Sub
処理結果


コードの動作概要
数字という配列をArray関数を使用して初期化します。
配列には、「5、3、8、1、9」の5つの数値が格納されています。
2重のForループを使って、配列内の数値を並び替えます。
- 外側のループ (
For i = LBound(数字) To UBound(数字) - 1
)- 配列内の要素を順にチェックします。
- 内側のループ (
For j = i + 1 To UBound(数字)
)- 外側で指定された要素以降の要素と比較し、大小を判定します。
- 条件 (
If 数字(i) > 数字(j)
)- もし、
数字(i)
が数字(j)
よりも大きい場合、入れ替えを行います。
- もし、
入れ替えが必要な場合は、temp
という一時変数を使って、数字(i)
と数字(j)
の値を交換します。
ソートが完了した後、Join
関数を使って配列の要素をコンマで区切り、Debug.Print
で結果を表示します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub SortArray()
- ここでSortArrayという名前のサブルーチンを定義しています。
このサブルーチンを実行すると、指定されたソート処理が行われます。
- ここでSortArrayという名前のサブルーチンを定義しています。
- Dim 数字 As Variant
- 「数字」という名前の配列変数をVariant型で宣言しています。
Variant型は、異なるデータ型を格納できる柔軟な型です。
- 「数字」という名前の配列変数をVariant型で宣言しています。
- Dim i As Long, j As Long
- 「i」と「j」という2つの変数をLong型で宣言しています。
これらの変数は後で、ループのインデックスとして使います。
- 「i」と「j」という2つの変数をLong型で宣言しています。
- Dim temp As Variant
- 値を一時的に格納するための「temp」という変数をVariant型で宣言しています。
この変数は配列内の値を入れ替える際に使います。
- 値を一時的に格納するための「temp」という変数をVariant型で宣言しています。
- 数字 = Array(5, 3, 8, 1, 9)
- Array関数を使って、「5, 3, 8, 1, 9」という5つの数値を持つ配列を作成し、数字に格納しています。
- For i = LBound(数字) To UBound(数字) – 1
- 外側のループ開始(バブルソート)
LBound関数は配列の最初のインデックスを取得し、UBound関数は配列の最後のインデックスを取得します。
このループは、配列の要素を順に処理するための外側のループです。
UBound(数字) – 1により、最後の要素1つ前までのインデックスをループします。
- 外側のループ開始(バブルソート)
- For j = i + 1 To UBound(数字)
- 内側のループ開始
内側のループは、外側のループで処理中の要素より後ろの要素をチェックします。
「i + 1」から最後のインデックスまでループします。
- 内側のループ開始
- If 数字(i) > 数字(j) Then
- 「数字(i)」と「数字(j)」を比較しています。
もし「数字(i)」が「数字(j)」よりも大きければ、後の処理で値を入れ替えます。
- 「数字(i)」と「数字(j)」を比較しています。
- temp = 数字(i)
- 一時変数に値を格納
「数字(i)」の値を「temp」に一時的に格納します。
これは後で値を入れ替えるために必要です。
- 一時変数に値を格納
- 数字(i) = 数字(j)
- 値の入れ替え(1)
「数字(j)」の値を「数字(i)」に代入します。
これで「数字(i)」は「数字(j)」の値に置き換わります。
- 値の入れ替え(1)
- 数字(j) = temp
- 値の入れ替え(2)
「temp」に保存しておいた元の「数字(i)」の値を「数字(j)」に代入します。
これで、「数字(i)」と「数字(j)」の値が入れ替わりました。
- 値の入れ替え(2)
- End If
- ここでIf文が終了します。
「数字(i)」が「数字(j)」より大きい場合の入れ替えが終わりました。
- ここでIf文が終了します。
- Next j
- ここで内側のForループが終了します。
これにより、「数字(i)」とそれ以降の全ての要素との比較が完了します。
- ここで内側のForループが終了します。
- Next i
- ここで外側のForループが終了します。
これで全ての要素に対するソート処理が完了します。
- ここで外側のForループが終了します。
- Debug.Print Join(数字, “, “)
- Join関数を使って、配列の要素をコンマで区切った文字列に変換し、Debug.Printでイミディエイトウィンドウに出力します。
最終的なソート結果が表示されます。
- Join関数を使って、配列の要素をコンマで区切った文字列に変換し、Debug.Printでイミディエイトウィンドウに出力します。
- End Sub
- ここでSortArrayサブルーチンが終了します。
この例では、VBAでのバブルソートを使った配列のソート方法を解説しました。
バブルソートは、隣り合った要素を比較しながら入れ替えていくシンプルなアルゴリズムです。
VBA初心者でも理解しやすく、配列の要素を順番に並び替える方法を学べます。
ソート処理を効率化したい場面では、今回紹介したバブルソートを活用してみてください。
これで、VBAでのデータ整理がさらにスムーズになるでしょう。
知っておきたい機能6: 配列を途中で格納データを確認したい場合_ローカルウインドウの使用
VBAで配列を使用する際、コードの実行中に配列に格納されたデータを確認したい場合があります。
このようなときに便利なのが、ローカルウインドウです。
ローカルウインドウを使うことで、デバッグ中に配列の中身をリアルタイムで確認することができ、コードの動作を細かくチェックすることができます。
ローカルウインドウで配列のデータを確認する方法
- ブレークポイントを設定する
- 配列にデータを格納する行や、Forループの中でブレークポイントを設定します。
これにより、コードがその行で一時停止します。
- 配列にデータを格納する行や、Forループの中でブレークポイントを設定します。
- コードを実行
- コードを実行すると、ブレークポイントで一時停止します。
- コードを実行すると、ブレークポイントで一時停止します。
- ローカルウインドウを表示
- VBAエディターで「ローカルウインドウ」を表示します。
表示メニューから「ローカルウインドウ」を選択すると、現在の変数の状態を確認できます。
- VBAエディターで「ローカルウインドウ」を表示します。
- 配列の中身を確認
- ローカルウインドウに表示される変数リストの中から、対象の配列を選択すると、その配列のすべての要素とその値を確認できます。
- ローカルウインドウに表示される変数リストの中から、対象の配列を選択すると、その配列のすべての要素とその値を確認できます。
ローカルウインドウのメリット
- リアルタイムで確認
- 配列の内容を実行中にリアルタイムで確認できるため、デバッグが容易になります。
- 誤りの早期発見
- 配列に期待通りのデータが格納されているかをその場で確認でき、バグを早期に発見できます。
この方法を活用することで、配列の操作をより正確に行うことができ、プログラムのデバッグがスムーズになります。
この記事のまとめ
VBAにおける「配列」を理解することは、効率的なデータ処理の第一歩です。
静的配列や動的配列を使い分けることで、データ管理の柔軟性が向上します。
次に進むために、配列の基本をしっかりマスターしましょう。
ポイントのおさらい
- VBAにおける「配列」とは何かを理解する
- 配列は、複数のデータを一つの変数名でまとめて管理する方法です。
これにより、データの整理や処理が効率的になります。
⇒ 「VBAにおける「配列」とは?を解説」をもう一度見る。
- 配列は、複数のデータを一つの変数名でまとめて管理する方法です。
- 静的配列と動的配列の違いを理解する
- 静的配列と動的配列は、データの格納方法や用途が異なります。
- 静的配列は固定されたサイズのデータに適しており、サイズが変更できない配列です。
- 動的配列は、Redimを使用しデータの量に応じて配列のサイズを変更可能です。
⇒ 「配列の種類について」もう一度見る。
- 静的配列と動的配列は、データの格納方法や用途が異なります。
- 配列がよく使われる場面を理解する
- 配列は、データの一括処理、関連データのグループ化、ループ処理の効率化など、さまざまな場面で役立ちます。
具体的なシチュエーションを理解して、配列を活用しましょう。
⇒ 「配列がよく使われる場面」もう一度見る。
- 配列は、データの一括処理、関連データのグループ化、ループ処理の効率化など、さまざまな場面で役立ちます。
- 配列を使うメリット・デメリットを理解する
- 配列を使用することで得られるメリットと、使用時に注意すべきデメリットを理解し、最適な場面で効果的に活用しましょう。
⇒ 「配列を使うメリット・デメリット」をもう一度見る
- 配列を使用することで得られるメリットと、使用時に注意すべきデメリットを理解し、最適な場面で効果的に活用しましょう。
- 配列と合わせて使用される関数や機能を学習しました
- 配列と合わせて使用される関数や機能を学習しました。
配列を初期化するためのErase関数や、複数のデータを一括で格納できるArray関数の使い方を理解することで、VBAの配列操作がより簡単になります。
また、配列の要素をソートする際には、バブルソートや他のアルゴリズムを活用して効率的に並べ替えることが可能です。
さらに、ローカルウィンドウを使ったデバッグ方法を学ぶことで、リアルタイムにデータを確認し、エラーを素早く発見できます。
⇒ 「配列と合わせて知っておきたい関数や機能を解説」もう一度見る。
- 配列と合わせて使用される関数や機能を学習しました。
さらに学ぶために
VBAで配列の基本を学んだことで、次は高度な操作や応用に挑戦しましょう。例えば、動的配列を活用した柔軟なデータ管理や、配列を使った自動化処理を習得することで、より効率的なプログラムを作成できるようになります。
次のステップとして、配列を使った実際のプロジェクトでスキルを磨き、さらなる成長を目指してください。

