エクセルで楽々校務

学校現場で使えるエクセルファイルや小技の紹介をしています。掘り出し物があるかもしれません。あと、今までの実践での疑問点もつぶやきます。

【VBA】VBAで配列を、高速に書き出す方法

新年おめでとうございます。

お久しぶりです。今回は、配列を高速に書き出す方法の備忘録です。

e出席簿の改良で難点がありました。

休日に赤縦線を引いたり、欠席や出席停止児童数の計算ができるのは当たり前。

私がこだわっているのは、「備考欄への欠席理由一括記入」の自動化です。

月別のシートではこれができますが、

指導要録への記入の時に、一覧が欲しいです。

個人別に、欠席・停止・忌引き理由をフィルターで配列に格納することはできました。

しかし、この配列を書き出す時に思いのほか時間がかかりました。

フィルター→配列格納=数秒

配列をセルに書き出すのに1~2分かかってしまいました。

-------------------------------

まず、【遅いコード】です。

配列tmpを現在シートのJ4:J43セルに書き出すコードです。

Dim tmp(0 to 39)

(フィルター→配列格納は割愛します。)

k=0

For each rng in range("J4:J43")

  rng.value=tmp(k)

  k=k+1

next

セル範囲をループする一般的な書き出し方法です。For eachでも1~2分かかってしまいました。

 

次に【速いコード】です。

Dim tmp(0 to 39)

Dim my_array

(フィルター→配列格納は割愛します。)

k = 0
my_array = Range("J4:J43")

'配列を格納
For i = 1 To UBound(my_array)
    For j = 1 To UBound(my_array, 2) '''''''★この2は配列上の2次元
        my_array(i, j) = tmp(k)
        k = k + 1
    Next
Next

'書き出し
Range("J4:J43") = my_array

-----------------------------------

ポイントは、書き出し範囲をmy_array配列に格納して、その配列上にtmp(k)配列を書き込み、

それを一気にセル範囲に書き出すというところです。

普段は使わないにしても、書き出しに時間がかかる場合は、飛躍的に書き出し速度が上がります。1~2分かかっていたのが、5秒以内で書き出せました。

 

備忘録でした。

 

では、また