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の処理速度が速くなると思いますので
これからも、頑張ってください。
お力になれるか分かりませんが、また、ご相談ください。
お世話になっています。
メールでもお伝えしていましたが、
コードのコメント付きのものが欲しいので
お忙しいとは思いますが、確認いただければと思います。
よろしくお願いします。