【簡単エクセル/Excel VBA マクロ】セル範囲を配列に格納すると自動的に二次元配列になる|ワンポイントテクニック #015


いつもありがとうございます!
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの開発を行っている ソフトデザイン工房 です。
配列は、処理の高速化や構造化に役立つ手法として広く用いられています。
とりわけExcel VBAでは、セル範囲をそのまま配列として扱うケースが多く見られます。
そして実は、このときに「セル範囲を配列に格納すると、自動的に“二次元配列”になる」という特徴があります。
これを知らずに一次元配列のつもりで処理を書いてしまうと、たとえば For Each
や LBound
/ UBound
の使い方でエラーが起きたり、意図しない挙動につながることがあります。
そこでこの記事では、「セル範囲を配列に格納すると自動的に二次元配列になる」というVBAの基本仕様について、サンプルコードを交えて解説していきます。
なお、「そもそも配列とは何か?」といった基礎的な内容については、こちらの記事で解説しています。
この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。
VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。
Excelのセル範囲を配列に格納すると自動的に二次元配列になる

1. まず正真正銘の一次元配列をチェック
セル範囲を配列に格納したときの挙動を理解する前に、まずはVBAにおける“純粋な一次元配列のかたちを確認しておきましょう。
VBAで配列を扱う際、その構造(一次元か二次元か)は変数を宣言する時点で決まります。
たとえば、次のように Dim arr(0 To 4)
と記述すれば、5つの要素を持つ一次元配列として定義されます。
この段階で、インデックスは1つ、つまり「横一列に並ぶような構造」であることが明示されているわけです。
一方で、もし次のように記述すれば、それは行 × 列の二次元配列になります。
' 二次元配列の宣言の例
Dim arr(0 To 4, 0 To 1)
では実際に、この一次元配列に文字列を代入して動作を確認してみましょう。
以下のコードでは、セル参照を使わず、値を1つずつ直接入力しています。
このように、変数を一次元で宣言し、値をハードコーディングしていくと、一次元配列ができあがります。
Sub ArraySample1()
' 変数宣言
Dim arr(0 To 4) As String
Dim arr_idx As Long
' 配列の値を格納(べた打ち)
arr(0) = "りんご"
arr(1) = "バナナ"
arr(2) = "みかん"
arr(3) = "ぶどう"
arr(4) = "もも"
' 配列の中身をデバッグ出力
For arr_idx = 0 To 4
Debug.Print arr(arr_idx)
Next arr_idx
End Sub

ここでの19行目の書き方は、のちのセクションで重要な意味を持ってきます。ぜひ覚えておいてくださいね。
このコードを実行すると、次の結果が返ります。


以上が、純粋な一次元配列です。
2. セル範囲から作成した配列が一次元配列だと勘違いしているとこうなる
次に、セル範囲から作成した配列を一次元だと勘違いしているとどうなるかを見ていきましょう。
今回扱うのは、次のセル範囲です。

コードを示します。
Sub ArraySample2()
' 変数宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim arr As Variant
Dim arr_idx As Long
' ファイルを取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
' セル範囲を取得
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(5, 1))
' セル範囲を配列に格納
arr = rng.Value
' 配列の中身をデバッグ出力
For arr_idx = 1 To 5
Debug.Print arr(arr_idx)
Next arr_idx
End Sub
順を追って見ていきましょう。
このコードを実行すると、次のエラーが発生します。
![VBA実行時のエラーダイアログ。エラー内容は「実行時エラー '9': インデックスが有効範囲にありません。」と表示されており、[継続] [終了] [デバッグ] [ヘルプ] のボタンが並んでいる。](https://jitsuyogaku.com/wp-content/uploads/2025/05/20250516-003.webp)
このエラーが発生しているのは、25行目です。この黄色のハイライト部分です。

よく見ると、この Debug.Print
の書き方は、ひとつ前のセクションの19行目とまったく同じです。
前回は正常に動作しましたが、今回はエラーになります。
いったい何が違うのでしょうか。
その原因は、配列の構造が「二次元」になっていることにあります。
Excelのセル範囲を配列に格納 すると、たとえ 1列や1行のデータ であっても、自動的に二次元配列になるのです。
これは、Excelのセルが 「行」と「列」 の概念を持つためです。
そのため、配列から値を取り出すには arr(行, 列)
のように、2つのインデックスが必要になります。
ところが、今回のコードでは arr(インデックス)
のように、1つのインデックスしか指定されていません。
このため、VBAは指定された位置を特定できず、「インデックスが有効範囲にありません」というエラーを返すのです。

以上が、セル範囲から作成した配列を一次元配列と誤解した場合に起こるエラーの典型例です。
3. セル範囲から作成した配列を正しく二次元配列として扱うとこうなる
では最後に、セル範囲から作成した配列を、正しく二次元配列として扱う場合のコードを見ていきましょう。
今回も扱うのは、次のセル範囲です。

コードを示します。
Sub ArraySample3()
' 変数宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim arr As Variant
Dim arr_row As Long
' ファイルを取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
' セル範囲を取得
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(5, 1))
' セル範囲を配列に格納
arr = rng.Value
' 配列の中身をデバッグ出力
For arr_row = 1 To 5
Debug.Print arr(arr_row, 1)
Next arr_row
End Sub
このコードを実行すると、次の結果が返ります。一番最初の「1. まず正真正銘の一次元配列をチェック」のセクションで示した結果と結果です。

ここで注目したいのは、25行目の Debug.Print
の書き方です。
arr(行, 列)
のように、2つのインデックスを指定しています。このように2つのインデックスを指定すると、エラーは発生せず、正常にコードが実行されます。
これは、Excelのセル範囲を配列に格納すると、自動的に二次元配列になるという仕様に対応するためです。
直感的には、「データが1列しかないのだから、一次元配列になるだろう」と思ってしまいますよね。私もそうでした。でも、実際にはそうではないんですね。
つまり、1列だけの範囲であっても、列番号(ここでは 1)を明示する必要があるというわけです。

以上がで解説は終了です。ありがとうございました!
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
今回の記事では、「セル範囲を配列に格納すると自動的に二次元配列になる」現象について解説いたしました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。