Excel VBAの2次元配列の使い方をお探しですね。

広告

Excel VBAで処理を速くする!2次元配列の使い方を分かりやすく解説

Excel VBAでマクロを作っていると、「データが多いと処理が遅い…」と感じたことはありませんか?特に数千行、数万行のデータを扱うときは、セルを1つずつ読み書きしていると、どうしても時間がかかってしまいます。

そんなときに役立つのが**2次元配列**です。

この記事では、セル範囲のデータを一気に読み込んで、配列の中で加工して、まとめて書き戻す方法を、初心者の方にも分かりやすく解説します。

2次元配列って何?なぜExcelと相性がいいの?

2次元配列とは、**行と列の2方向でデータを管理できる配列**のことです。

1次元配列が「一列に並んだリスト」だとすると、2次元配列は「表のようなもの」とイメージしてください。

Excelのシートも行と列でできていますよね。

だから、Excelのセル範囲と2次元配列はとても相性がいいんです。

例えば、A1:C10というセル範囲には、10行3列のデータが入っています。

この範囲をVBAで一気に読み込むと、2次元配列として扱えます。

配列の1つ目の番号が「行」、2つ目の番号が「列」に対応するので、`data(1, 1)`は左上のセル、`data(2, 3)`は2行目3列目の値、という感じです。

2次元配列を使う最大のメリット

一番のメリットは、**Excelシートへのアクセス回数を減らせること**です。

VBAでは、セルに1つずつアクセスする処理がとても遅いんです。

データが増えれば増えるほど、処理時間にどんどん差が出てきます。

でも、セル範囲を一度に配列へ読み込んで、配列の中で計算や文字列の加工をして、最後にまとめて書き戻せば、Excelとのやり取りは最小限で済みます。

これが処理を速くする秘訣です。

ちなみに、VBAの配列には「静的配列」と「動的配列」がありますが、Excelのセル範囲を読み込む場合は、`Variant`型の変数に`Range.Value`を代入するだけで簡単に2次元配列として受け取れます。

実務では、この方法がよく使われています。

セル範囲を2次元配列に読み込む基本

セル範囲を2次元配列に読み込むのは、実はとても簡単です。

`Variant`型の変数を用意して、そこへ`Range.Value`を代入するだけ。

セル範囲には数値、文字列、日付、空白など、いろんな種類の値が混ざっていることが多いので、何でも受け取れる`Variant`型を使うのが一般的です。

“`vb
Sub ReadRangeToArray()
Dim data As Variant

data = Range(“A1:C10”).Value

Debug.Print data(1, 1) ‘ A1の値
Debug.Print data(2, 3) ‘ C2の値
End Sub
“`

インデックス番号は1から始まる

ここで注意したいのは、**セル範囲から読み込んだ配列のインデックスは1から始まる**ということです。

普通にVBAで配列を作ると0から始まることが多いのですが、`Range.Value`で取得した配列は`data(1, 1)`から始まります。

この違いを知らないと、「インデックスが有効範囲にありません」というエラーに悩まされることになります。

配列のサイズを調べる方法

配列の行数や列数を調べるには、`LBound`関数と`UBound`関数を使います。

– `LBound`:配列の最小インデックス(開始番号)
– `UBound`:配列の最大インデックス(終了番号)

2次元配列では、第2引数に`1`を指定すると行方向、`2`を指定すると列方向の範囲が分かります。

“`vb
Sub CheckArraySize()
Dim data As Variant
Dim rowCount As Long
Dim colCount As Long

data = Range(“A1:C10”).Value

rowCount = UBound(data, 1) – LBound(data, 1) + 1
colCount = UBound(data, 2) – LBound(data, 2) + 1

Debug.Print “行数:” & rowCount
Debug.Print “列数:” & colCount
End Sub
“`

実務では、読み込む範囲の行数が毎回変わることもよくあります。

そんなときは、最終行を取得してから範囲を指定すると便利です。

例えば、A列を基準に最終行を調べて、A1から最終行まで読み込めば、データ量が変わっても対応できます。

配列で処理して、まとめて書き込む

2次元配列に読み込んだデータは、**メモリ上の配列として処理できます**。

つまり、値の判定、計算、文字列の結合などを、シートに触れずに実行できるんです。

セルへのアクセスを繰り返さないので、処理速度がぐっと速くなります。

次の例では、A1:C10のデータを配列に読み込んで、3列目が数値なら2倍にして、E1:G10へ一気に書き出しています。

ポイントは、**処理中にセルへ書き込まず、最後に`Range.Value = data`でまとめて出力している**ところです。

“`vb
Sub ProcessArrayAndWrite()
Dim data As Variant
Dim i As Long, j As Long

data = Range(“A1:C10”).Value

For i = LBound(data, 1) To UBound(data, 1)
If IsNumeric(data(i, 3)) Then
data(i, 3) = data(i, 3) * 2
End If
Next i

Range(“E1”).Resize( _
UBound(data, 1) – LBound(data, 1) + 1, _
UBound(data, 2) – LBound(data, 2) + 1 _
).Value = data
End Sub
“`

Resizeで範囲を自動調整

`Resize`は、基準セルから指定した行数・列数に範囲を広げるプロパティです。

上のコードでは、E1を左上として、配列のサイズに合わせた範囲を作って、そこへ一気に値を書き込んでいます。

固定で`Range(“E1:G10”)`と書いてもいいのですが、配列サイズが変わる処理では`Resize`を使った方が応用が効きます。

サイズを合わせることが大事

書き込むときに特に注意したいのは、**配列のサイズと出力先のセル範囲のサイズを一致させること**です。

10行3列の配列を出力するなら、書き込み先も10行3列である必要があります。

サイズが合わないと、エラーになったり、変な結果になったりします。

また、セル範囲から読み込んだ配列だけでなく、自分で作った2次元配列もセルへ一括出力できます。

“`vb
Sub WriteManualArray()
Dim result(1 To 3, 1 To 2) As Variant

result(1, 1) = “商品A”
result(1, 2) = 100
result(2, 1) = “商品B”
result(2, 2) = 200
result(3, 1) = “商品C”
result(3, 2) = 300

Range(“A1”).Resize(3, 2).Value = result
End Sub
“`

このように、Excel VBAの2次元配列は**「読み込み」→「処理」→「書き込み」**という流れで考えると分かりやすくなります。

最初にセル範囲を配列へ入れて、次に配列の中で必要な加工をして、最後にまとめてセル範囲へ戻す。

この基本を覚えておくと、いろんな業務マクロに応用できます。

つまずきやすいポイントと実務での使い分け

インデックス番号の開始位置に注意

2次元配列で初心者がつまずきやすいのは、**インデックスの開始番号**です。

通常のVBA配列は0から始まることがありますが、セル範囲から取得した配列は1から始まります。

この違いを意識せずに、同じ感覚で扱うと、ループの開始位置を間違えやすくなります。

だから、配列を処理するときは、固定値で`1 To 10`のように書くよりも、**`LBound`と`UBound`を使う**書き方が安全です。

1列だけでも2次元配列になる

もう1つの注意点は、**1列だけ、または1行だけの範囲を読み込んでも、複数セルなら2次元配列になる**ということです。

例えば`Range(“A1:A10”).Value`は10行1列の2次元配列なので、`data(i)`ではなく`data(i, 1)`のように列番号も指定します。

一方で、`Range(“A1”).Value`のように単一セルだけなら配列ではなく単一の値になります。

この違いもエラーの原因になりやすい部分です。

動的配列を使う場合

動的配列を使う場合は、`ReDim`と`ReDim Preserve`の違いも知っておきましょう。

– `ReDim`:配列サイズを変更できるが、既存の値は消える
– `ReDim Preserve`:値を保持したままサイズ変更できるが、2次元配列では最後の次元しか変更できない

つまり、行数を後から増やしたい処理には扱いづらい場合があります。

大量データを扱うなら、最終行や最終列を先に調べて必要なサイズを確保する方がシンプルです。

処理速度をさらに上げるには

処理速度を意識する場合は、配列化に加えて画面更新や自動計算のオフも検討できます。

ただし、これらは処理後に元へ戻す必要があるので、エラーが起きても復元されるように設計することが大切です。

まずは2次元配列でセルアクセスを減らして、それでも遅い場合に`Application.ScreenUpdating = False`などを組み合わせる、という順番で考えると安全です。

実務での活用シーン

実務で2次元配列を使う場面は、単なる高速化だけではありません。

– 売上データの一括変換
– マスタとの照合前の整形
– CSV取込後の加工
– 別シートへの転記
– 帳票出力用データの生成

など、表形式データを扱う処理全般で役立ちます。

特に「行ごとに同じルールで処理する」「複数列をまとめて判定する」「結果を別範囲にまとめて出したい」といったケースでは、2次元配列を使うとコードがスッキリします。

まとめ:2次元配列の基本の流れ

Excel VBAの2次元配列の使い方を実務目線でまとめると、重要なのは次の流れです。

1. **セル範囲は`Variant`型の変数へ一括で読み込む**
2. **配列の範囲は`LBound`と`UBound`で取得して安全にループする**
3. **書き込み先は`Resize`で配列サイズに合わせ、一括で出力する**

この基本を押さえるだけでも、セルを1つずつ読み書きするマクロより速くて、メンテナンスしやすいコードが書けるようになります。

最初はインデックス番号や次元の指定に戸惑うかもしれませんが、**Excelの表をそのまま配列に移している**と考えると理解しやすくなります。

大量データを扱うVBAでは、2次元配列を使った一括読み書きが、処理速度と読みやすさの両方を改善する重要なテクニックです。

ぜひ、実際のマクロ作りで試してみてください!

広告