VBA【爆速】【配列】8割無意識に使っている!?エクセルVBAでは配列を意識して使おう【マクロ高速化】

エクセルVBAの処理で、シート上のセルを使わずに、配列を使うことで「VBA高速化」に繋がります。

なので、エクセルのマクロ高速化(VBA高速化)するには、配列は必須技術です。

その他のマクロ高速化(VBA高速化)の方法を知りたい方はこちら(時間の無駄を無くす VBA高速化)をご覧ください。

配列は難しそうですが、イメージとデバッグ方法さえ掴めば、できちゃうと思います。

VBAでセルをコピーしてどこかに貼り付けする重い処理も配列を使えば、VBA高速化できちゃいます。

VBAで、一次元配列、二次元配列を使いこなせると
VBAが高速化し、デバッグ時間も実行時間も短くなるので、ぜひ、覚えてください。

初心者向けに、配列の使い方や意味を説明するつもりですが、読んでも、わからない場合は、コメントにて質問してください。

◆配列とは

複数のデータを並べたデータ構造のことを指し、その複数のデータはインデックスで識別されます。

要は、1つの変数にデータを複数格納でき、インデックス(数値)を指定すれば、呼び出しも書込みもできるよ!って感じですかね。

エクセルの行のみ、又は、列のみの場合は、1方向しかデータがないので、一次元配列となります。

エクセルのシートが、行と列、2方向のデータがあるので、二次元配列となります

よくみる表は二次元配列ってことですね。

左図の表を配列にすると、右図のようなインデックス(数値)となります。

変数名(1,1)と指定すれば、”名前”という文字列が呼び出しできます。

VBAで使う場合は、通常、一次元配列、多くても二次元配列まででしょう。

配列はVBAに限らず、若干の違いはあるものの、他のプログラミング言語でも使用されます。

VBAでの一次元配列、二次元配列といった考え方は同じです。

◆配列の種類とは

配列は、使う軸数によって次元数が変わります。

配列においての軸数とは、シートで言うと列数です。

また、軸の中の要素(データ)数を宣言時に指定すれば、「静的配列」

しなければ、「動的配列」となります。

要素数とは、シートで言うと、行数です。

なので「軸数」と「要素数」を見れば、どんな配列なのかわかります。

Sub 配列サンプル_1()
Dim StaticArray(3, 5)   '静的的配列
Dim DynamicArray()      '動的配列

'動的配列の軸数と要素数を宣言
ReDim DynamicArray(10, 10)

End Sub

「静的配列」は変数の宣言で「軸数」と「要素数」を指定してしまっているので

可変することができません。

「動的配列」は変数の宣言で「軸数」と「要素数」を指定していないので

可変することができます。

上記のサンプルコードはどちらも、2次元配列となります。

◆配列のイメージ

先ほど、記述しましたが、「二次元配列」=「エクセルのシート」です。

「一次元配列」の場合は「エクセルの1列」です”行”ではなく”列”であると覚えた方がいいでしょう。

詳細は後述します。

◆配列の使い方

Sub 配列サンプル_2()
Dim CellAry, StaticArray(9, 1), DynamicArray()

'●セルの値を格納して貼り付け
CellAry = [A1:B10]
[A11:B20] = CellAry

'●静的配列に値を格納して貼り付け
For i = 0 To UBound(StaticArray, 1)
    For j = 0 To UBound(StaticArray, 2)
        StaticArray(i, j) = i & " , " & j
    Next j
Next i
[C11:D20] = StaticArray

'●動的配列に値を格納して貼り付け
ReDim DynamicArray(0)
For i = 0 To 4
    ReDim Preserve DynamicArray(i)
    DynamicArray(i) = i
Next i
'一次元配列の場合は貼り付ける方向を注意
[E11:E15] = DynamicArray
[E11:I11] = DynamicArray

End Sub

実行結果はこうなります。

使い方はこんな感じです。

セルのコピーもVBAで算出した結果の貼り付けも高速です。

セルのコピー元のデータが複数個所に散らばっていても、配列にForNextで格納してから、一か所に配列を全て、貼り付けたほうが、処理速度は速くなります。

「UBound」は、配列の要素数を知ることのできる関数です。

「ReDim DynamicArray(0)」は、動的配列のDynamicArrayの要素数を指定しています。

「ReDim Preserve DynamicArray(i)」のように「Preserve」をつけると、配列の中身を保存したまま、要素数を拡張できます。

「ReDim」だけだと、配列の中身の値がリセットされて、要素数が指定した値に可変します。

結果画像の通り、「一次元配列」だと列方向の次元と判断されますので、ご注意してください。

「一次元配列」でも行方向として認識させたい場合は、こちら(一次元配列を行として認識)をご覧ください。

◆配列のデバッグ方法

最初の方は、ステップイン、ブレークポイント等を使用し、配列に値を少しずつ、入れていき、ローカルウィンドウで値をチェックします。

そうすると、どの座標にどんな値が入っているか簡単に目視できるため、デバッグしやすく、配列の構造もわかるので、配列の使い方をマスターできるようになってくると思います。

「Debug.Print」と「Stop」を使用してもいいと思いますが、あとでコードを消したり、コメント化するのが、だるいので、臨機応変にご使用ください。

ローカルウィンドウはメニューバーの「表示」→「ローカルウィンドウ」(Alt→V→S)で表示できます。

ステップイン、ブレークポイントの使い方がわからない方はこちら(VBAショートカットキー)

◆まとめ

VBAの配列は理解できたでしょうか。最初のうちは難しいかもしれませんが
たくさん使用していくと、慣れてマスターできると思います。

頑張ってください。

“VBA【爆速】【配列】8割無意識に使っている!?エクセルVBAでは配列を意識して使おう【マクロ高速化】” への3件の返信

  1. ここでのコメントでいいのかわかりませんが、お礼にコメントします。
    お問い合わせフォームから
    実行速度が遅いコードを送り、確認してもらいました。

    びっくりするくらいの爆速に変わっていて唖然としました。
    考えたことがない方法でしたので、
    どういった処理なのかを理解するにも時間がかかると思いますが、
    頑張ってみようと思います。
    自分で応用できるようになるかは謎ですが(笑)

    今回は本当にありがとうございました。

    1. 頂いたコードのかなり遅い部分だけを修正させてもらいましたので
      他にも色々、修正を加えればもっと、VBAの処理速度が速くなると思いますので
      これからも、頑張ってください。

      お力になれるか分かりませんが、また、ご相談ください。

      1. お世話になっています。

        メールでもお伝えしていましたが、
        コードのコメント付きのものが欲しいので
        お忙しいとは思いますが、確認いただければと思います。

        よろしくお願いします。

コメントを残す

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