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

アフィリエイト広告を利用しています。
QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください
Information
アイキャッチ画像
運営者・ポテ

いつもありがとうございます!

ノンプログラマー向け「Excel VBA マクロ ワンポイントテクニック解説シリーズ」へようこそ。

本稿では「Excelのセル範囲を配列に格納すると自動的に二次元配列になる」現象について解説いたします。

Information
  • ノンプログラマー
    プログラミングを専門にしていない人たちのことです。
  • VBAとマクロの違い
    VBAは、Visusal Basic for Application の略で、プログラミング言語のことです。マクロは、VBAを使って作成される「機能」のことです。

配列は、処理の高速化や構造化に役立つ手法として広く用いられています。とりわけExcel VBAでは、セル範囲をそのまま配列として扱うケースが多く見られます。

そして実は、このときに「セル範囲を配列に格納すると、自動的に“二次元配列”になる」という特徴があるのです。

これを知らずに一次元配列のつもりで処理を書いてしまうと、たとえば For EachLBound / 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つずつ直接入力しています。

このように、変数を一次元で宣言し、値をハードコーディングしていくと、一次元配列ができあがります。

Information

ハードコーディング
ハードコーディングとは、プログラム内で値を直接コードに埋め込むことを指します。

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行目の書き方は、のちのセクションで重要な意味を持ってきます。ぜひ覚えておいてくださいね。

このコードを実行すると、次の結果が返ります。

イミディエイトウィンドウに、配列の中身として出力された5つの日本語の果物名(りんご、バナナ、みかん、ぶどう、もも)が、縦に1行ずつ黄色で表示されている様子。
運営者・ポテ

以上が、純粋な一次元配列です。

2. セル範囲から作成した配列が一次元配列だと勘違いしているとこうなる

次に、セル範囲から作成した配列を一次元だと勘違いしているとどうなるかを見ていきましょう。

今回扱うのは、次のセル範囲です。

ExcelのA列に、1行目から5行目まで「りんご」「バナナ」「みかん」「ぶどう」「もも」の文字が縦に入力されているセル範囲の画面。B列とC列は空白。
セル範囲

コードを示します。

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': インデックスが有効範囲にありません。」と表示されており、[継続] [終了] [デバッグ] [ヘルプ] のボタンが並んでいる。

このエラーが発生しているのは、25行目です。この黄色のハイライト部分です。

VBAエディタに表示されたコードのスクリーンショット。ArraySample2 というサブプロシージャで、セル範囲を arr = rng.Value により配列に格納している。配列を一次元として扱い arr(arr_idx) でアクセスしようとしており、その部分が黄色の背景でハイライトされている。
エラー発生個所

よく見ると、この Debug.Print の書き方は、ひとつ前のセクションの19行目とまったく同じです。

前回は正常に動作しましたが、今回はエラーになります。

いったい何が違うのでしょうか。

その原因は、配列の構造が「二次元」になっていることにあります。

Excelのセル範囲を配列に格納 すると、たとえ 1列や1行のデータ であっても、自動的に二次元配列になるのです。

これは、Excelのセルが 「行」と「列」 の概念を持つためです。

そのため、配列から値を取り出すには arr(行, 列) のように、2つのインデックスが必要になります。

ところが、今回のコードでは arr(インデックス) のように、1つのインデックスしか指定されていません

このため、VBAは指定された位置を特定できず、「インデックスが有効範囲にありません」というエラーを返すのです。

運営者・ポテ

以上が、セル範囲から作成した配列を一次元配列と誤解した場合に起こるエラーの典型例です!

3. セル範囲から作成した配列を正しく二次元配列として扱うとこうなる

では最後に、セル範囲から作成した配列を、正しく二次元配列として扱う場合のコードを見ていきましょう。

今回も扱うのは、次のセル範囲です。

ExcelのA列に、1行目から5行目まで「りんご」「バナナ」「みかん」「ぶどう」「もも」の文字が縦に入力されているセル範囲の画面。B列とC列は空白。
セル範囲

コードを示します。

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. まず正真正銘の一次元配列をチェック」のセクションで示した結果と結果です。

イミディエイトウィンドウに、配列の中身として出力された5つの日本語の果物名(りんご、バナナ、みかん、ぶどう、もも)が、縦に1行ずつ黄色で表示されている様子。

ここで注目したいのは、25行目の Debug.Print の書き方です。

arr(行, 列) のように、2つのインデックスを指定しています。このように2つのインデックスを指定すると、エラーは発生せず、正常にコードが実行されます。

これは、Excelのセル範囲を配列に格納すると、自動的に二次元配列になるという仕様に対応するためです。

直感的には、「データが1列しかないのだから、一次元配列になるだろう」と思ってしまいますよね。私もそうでした。でも、実際にはそうではないんですね。

つまり、1列だけの範囲であっても、列番号(ここでは 1)を明示する必要があるというわけです。

運営者・ポテ

以上がで解説は終了です。ありがとうございました!

関連記事

本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。

VBAプログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

\チェックしてみよう/

\チェックしてみよう/

\チェックしてみよう/


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください

相談無料】VBAアプリケーション作成のご相談を承ります

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──
この取り組みが、社会全体の課題を解決する一歩になると信じています。

みんなの実用学では、「時間はもっとも大切な資源」と考え、クライアント様の業務課題解決のお手伝いをさせていただいております。

その一環として、クラウドソーシングサービス「ランサーズ」を通じて、VBAやGAS(Google Apps Script)による業務支援アプリケーションの作成を行っています。

Information

ランサーズとは?
日本最大級のクラウドソーシングサービスで、企業や個人がフリーランスに仕事を依頼できるプラットフォームです。

ご相談は無料です。お気軽にお問い合わせください。


こちらの記事でも紹介しておりますので、もしよろしければ、ご覧ください。

おわりに

運営者・ポテ

ご覧いただきありがとうございました!

今回の記事では、「セル範囲を配列に格納すると自動的に二次元配列になる」現象について解説いたしました。

お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。

皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。

なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。

この記事を書いた人

運営者・ポテ
■人生を追求する凡人■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢■光学・機械系エンジニア(歴20年、内マネジメント10年、特許数件権利化)/副業フリーランスエンジニア■読書・文学愛好■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を研究。■VBAアプリ開発サービス提供中(業務委託 / VBA使用経験20年)■Python愛好(歴5年)■VBAエキスパート「Excel VBA スタンダード」(上級者向け資格)/ Python 3 エンジニア認定基礎(経済産業省「ITスキル標準(ITSS)」に掲載)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です