データが多くてマクロが遅い…
配列って聞いたことはあるけど、何が便利なの?
エクセルで大量のデータを処理しようとすると、VBAとはいえ処理速度に時間がかかることはよくあります。そんな時、たった数行のコードを書き換えて「二次元配列」を使うだけで、数分かかっていた処理が数秒で終わることも珍しくありません。
本記事では、VBA初心者の方に向けて、二次元配列のメリットや具体的な使い方を分かりやすく解説します。配列はとても便利ですが少し難しいので、脱初心者にはぴったりのテクニックです。ぜひこの記事で、効率的なVBAを組むヒントをつかんでください!
目次
【結論】二次元配列の最大のメリットは「圧倒的な処理速度」
なぜ二次元配列を使うのか?列のメリット!
二次元配列をVBAで使う最大のメリットは、ズバリ「処理速度の向上」です。数万行に及ぶ大量のデータであっても、一瞬で処理を終わらせることができます。
配列は、簡単に言うとVBA上でエクセルの表を作る機能です。セルを一つずつ処理する通常のマクロでは、データ量に比例して時間がかかりますが、二次元配列を使えばVBA上で表を作るので処理が格段に速くなります。
VBA上に別のエクセル表を作るので、少し考え方は複雑ですが、大量のデータを扱う際には、とても効果のあるやり方です。
【実務直結】二次元配列の基本のサンプルコード
「配列は難しそう」というイメージをなくすため、まずは基本のサンプルコードをご紹介します。
基本的に、コードに書いている3つのステップで、配列は使うことができます。
Sub SampleArray()
' 0. 変数の宣言(Variant)
Dim myData As Variant
Dim i As Long, j As Long
' 1. セルのデータを配列(仮のエクセル表)へ取り込む
myData = Range("A1:B100").Value
' 2. 配列の中でデータを処理する(例:数値を2倍にする)
For i = 1 To UBound(myData, 1) ' 行のループ
For j = 1 To UBound(myData, 2) ' 列のループ
If IsNumeric(myData(i, j)) Then
myData(i, j) = myData(i, j) * 2
End If
Next j
Next i
' 3. 処理した結果をシートへ書き出す
' ※C1セルを起点にして、配列のサイズ分だけ枠を広げて貼り付けます
Range("C1").Resize(UBound(myData, 1), UBound(myData, 2)).Value = myData
MsgBox "処理が完了しました!"
End Sub
なぜ配列を使うと速いのか?VBAの中に「仮のシート」を作る配列が速い理由を解説!
普通のやり方の処理イメージ
通常のマクロコードでは、VBAが「実際のエクセルシート」を毎回見に行って処理を行います。イメージとしては、「A1セルの値を読んで」「計算して」「B1セルに書いて」という形です。
このやり方は、VBAとエクセルが毎回やり取り(通信)を行いながら処理を行っています。そのため、行数や処理の範囲が増えれば増えるほど、時間がかかってしまいます。
二次元配列の処理イメージ
一方、二次元配列を使うと、VBAのメモリ上に「仮のエクセルシート」が丸ごと作られます。実際のシートから「仮のシート」へ一気にデータをコピーし、VBAの内部だけで計算をすべて終わらせます。
そして最後に「仮のシート」の結果を、実際のシートに一気に貼り付けます。VBAとエクセルのやり取りが「最初と最後の2回だけ」になるため、何万回の往復が省略され、処理が速くなるという仕組みです。
二次元配列の具体的な使い方・文法(これだけ覚えればOK)
二次元配列を使いこなすための文法は、実はとてもシンプルです。
先ほど紹介したサンプルコードの「4つのステップ(手順0〜3)」に沿って、順番に見ていきましょう。
Sub SampleArray()
' 0. 変数の宣言(Variant)
Dim myData As Variant
Dim i As Long, j As Long
' 1. セルのデータを配列(仮のエクセル表)へ取り込む
myData = Range("A1:B100").Value
' 2. 配列の中でデータを処理する(例:数値を2倍にする)
For i = 1 To UBound(myData, 1) ' 行のループ
For j = 1 To UBound(myData, 2) ' 列のループ
If IsNumeric(myData(i, j)) Then
myData(i, j) = myData(i, j) * 2
End If
Next j
Next i
' 3. 処理した結果をシートへ書き出す
' ※C1セルを起点にして、配列のサイズ分だけ枠を広げて貼り付けます
Range("C1").Resize(UBound(myData, 1), UBound(myData, 2)).Value = myData
MsgBox "処理が完了しました!"
End Sub
手順0〜1:変数の宣言と、データの取り込み
まずは「Variant」型の変数を一つ用意します(手順0)。そこに「Range」の値を入れるだけで、VBAのメモリ上に「仮のシート」が完成します(手順1)。
Range(“A1”)から作ることで、「myData(1, 1)」が「1行目の1列目」になります。こうすることで、エクセル本来の座標と同じ感覚で扱え、直感的に分かりやすい仕様になるのでお勧めです。
' 0. 変数の宣言(Variant)
Dim myData As Variant
Dim i As Long, j As Long
' 1. セルのデータを配列(仮のエクセル表)へ取り込む
myData = Range("A1:B100").Value
手順2:配列の中でデータを処理する(UBound関数の活用)
「仮のシート」を作ったら、その中のデータをFor文(ループ)を使って順番に処理していきます。この時、「仮のシートの中に何行・何列のデータが入っているか」を調べるために「UBound(ユーバウンド)関数」を使います。
「UBound(配列名, 1)」と書けば行数が、「UBound(配列名, 2)」と書けば列数が分かります。これをFor文とセットで使うのが、二次元配列の鉄板ルールです。元のデータが増減しても自動で上限を読み取ってくれるため、最終行の取得ミスを防ぐことができます。
' 2. 配列の中でデータを処理する(例:数値を2倍にする)
For i = 1 To UBound(myData, 1) ' 行のループ
For j = 1 To UBound(myData, 2) ' 列のループ
If IsNumeric(myData(i, j)) Then
myData(i, j) = myData(i, j) * 2
End If
Next j
Next i
手順3:シートへの一括書き出し(Resizeの活用)
メモリ上で計算が終わったら、実際のシートに書き戻します。この時に「Resize(リサイズ)」というプロパティが大活躍します。
例えば「Range(“C1”)」にそのまま配列を入れても、C1セルにしか値が入りません。「Resize」を使って、書き込み先の枠を「仮のシート」と全く同じ行数・列数に広げてから貼り付けるのが、一括出力の必須テクニックです。
' 3. 処理した結果をシートへ書き出す
' ※C1セルを起点にして、配列のサイズ分だけ枠を広げて貼り付けます
Range("C1").Resize(UBound(myData, 1), UBound(myData, 2)).Value = myData
すべてKindle Unlimited(0円)で今すぐ読めます。
二次元配列のデメリット
非常に便利な二次元配列ですが、いくつか注意すべきデメリットも存在します。これらを知っておくことで、エラーでつまずくのを防げます。
① コードがわかりにくい
配列が入っているVBAは読みにくい。デメリットとして一番大きいのは、正直これです。
セルの直接指定なら「Cells(1, “A”)」でA列だとすぐに分かります。しかし、配列になると「myData(1, 1)」のように数字ばかりになります。後から見た時に「これは何のデータだっけ?」と迷いやすくなるのが難点です。
対策として、コード内に「’ 列1は顧客名、列2は売上」のように、こまめにコメントを残す癖をつけましょう。
② サイズを後から広げにくい(列しか増やせない)
処理の途中で「仮のシート」のサイズを大きくしたい場面があります。VBAには「ReDim Preserve」という配列のサイズを広げる命令がありますが、実は「最後の次元(列方向)」しか増やすことができません。
行をどんどん追加していくような処理には向いていないため、最初は少し大きめに配列のサイズを確保しておくなどの工夫が必要です。
③ エラー探し(デバッグ)が少し面倒
実際のエクセルシートであれば、どのセルにどんな値が入っているかを目で見て確認できます。しかし、配列のデータはVBAのメモリ上にあるため、画面上には表示されません。
中身を確認したい場合は、VBE(マクロの編集画面)の「表示」メニューから「ローカルウィンドウ」を活用します。これを使えば、配列の中にどんなデータが入っているかを確認しながらエラー探しができます。
まとめ
二次元配列をマスターすれば、マクロの「処理時間」を短縮できます。大量のデータを扱う集計作業がストレスなく行えるようになり、さらに高度な業務の自動化にも挑戦しやすくなります。
業務を効率化して空いた時間は、ぜひ自分のスキルアップやプライベートな時間に充ててください。それが「会社に縛られない人間」になるための第一歩です。
このブログでは、今回紹介したような内容から、日々の業務を根本からラクにする自動化テクニックまで幅広く紹介しています。
さらに一歩踏み込んで、「毎日の面倒な手作業を最速で終わらせたい!」という方向けに、VBAをイチから学ばず「コピペ×AI」でパパッと自動化するノウハウをまとめたKindle書籍を出版しました。
Kindle Unlimited(読み放題)なら0円で読めますので、ぜひチェックしてみてください!



コメント