初心者脱却!コピーするだけで劇的に速くなる!高速化のための3大テクニック|VBA高速・効率化テクニック
こんにちは、子猫を拾いました。かわいくてかわいくて私は下僕です。白猫です。
VBAのコード、かけるようになってきたけど
画面がチラチラしたり再計算、再計算、再計算ってずっとやってんじゃん…
なんか遅いな…改善出来たらな…って方のための記事です
間接参照を避けて処理を一本化!Withステートメントの活用
VBAは、操作の対象を特定する(オブジェクトを呼び出す)際にも時間がかかります。同じオブジェクト(例:特定のシートやテーブルなど)に対して何度も操作を行う場合、その参照(呼び出し)を省略することで処理速度が向上し、単純にコードも読みやすくなります。
Withステートメントでまとめていく
下記のようなマクロがあるとします。
Sub With使ってない方()
Worksheets("シート").Range("A1").Value = "商品A"
Worksheets("シート").Range("B1").Value = "商品B"
Worksheets("シート").Columns("C").ClearContents
End Sub
「シート」というワークシートを毎回参照している状態です。
Sub With使ってる方()
With Worksheets("シート")
.Range("A1").Value = "商品A"
.Range("B1").Value = "商品B"
.Columns("C").ClearContents
End With
End Sub
このようにWithステータスを使うと1つにまとめることができます。
Withでまとめた中身を処理する場合、↑だとWorksheetの後ろ「.」から始めます。
With使用のヒント
Withはオブジェクト単位でまとめれます。
Sub オブジェクトっていろいろあるよね()
With Worksheets("シート").Range("A1")
' このブロック内の操作対象は Worksheets("シート").Range("A1")
.Range("A1").Value = "商品A"
.Interior.Color = RGB(255, 255, 0) '背景の色を黄色にする
'ネスト(入れ子)もできます
With .Font
' このブロック内の操作対象は Worksheets("シート").Range("A1").Font
.Bold = True ' 太字
.Color = RGB(255, 0, 0) ' 赤色
End With
End With
End Sub
おまじないを唱える
おまじないと呼ばれる呪文が何個かあるので適宜組み合わせて使うといいです。
画面描画の更新停止 (ScreenUpdating)
VBAがセルを操作するたびにExcelが画面を再描画しようとする動作を停止します。
これが処理遅延の最大の原因となることが多いので更新を止めると劇的に速くなります。
Sub 画面よ止まれ()
'【設定】 画面更新を停止
Application.ScreenUpdating = False
'=========================================
'ここで処理
'=========================================
'【解除】 画面更新を元に戻す
Application.ScreenUpdating = True
End Sub
自動再計算の停止 (Calculation)
VBAが値を変更するたびに関連する数式を自動で再計算する動作を停止します。
数式が多く組まれているブックで特に効果的ですが、
再計算した後の数値を参照する場合には計算が止まっているため計算前の数値を拾われてしまう可能性があるので、その場合は参照処理の前に解除をしておく方が安心です。
Sub 計算よ止まれ()
'【設定】 自動計算を停止
Application.Calculation = xlCalculationManual
'=========================================
'ここで処理
'=========================================
'【解除】 自動計算に戻す
Application.Calculation = xlCalculationAutomatic
End Sub
イベント処理の無効化 (EnableEvents)
シートの変更や選択、ブックのオープンなどによって自動実行されるVBAのイベントプロシージャを一時的に停止します。
マクロが実行中に別のイベントマクロを呼び出し、無限ループに陥るのを防ぐ役割もあります。
こちらもイベントを起こしたい場合は止まってしまうので直前で解除した方がいいです。
Sub イベントよ起こるな()
'【設定】 イベント処理を無効化
Application.EnableEvents = False
'=========================================
'ここで処理
'=========================================
'【解除】 イベント処理を有効化
Application.EnableEvents = True
End Sub
コピーでOK!おまじないテンプレート
【設定】した後【解除】をしないとマクロの実行が終わっても設定されたままになってしまいます。
エラー処理を入れる場合は、On Error GoToなどを使って解除処理ができるようにします。
(↓ではエラー時「ExitHandler:」に飛ぶ想定になっています)
Sub ウィンガーディアムレヴィオーサ()
'=== 1. おまじない設定 ===
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
'======================================
'ここで処理
'======================================
ExitHandler:
'=== 2. おまじない解除 (元の状態に戻す) ===
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub
お!Withステートメント使ってる!
コピペを高速化させる
実はコピーペーストってめちゃくちゃ重たい処理なんです。
ついつい使っちゃいますが、大量のデータを処理するときには他の方法を使えばすごく速くなります。
配列を使ったコピペ
対象を配列に追加して、貼り付け場所を指定します。
処理が一気に終わるので体感的に速くなったのがわかりますよ!
別ブックから開かずに値を取得するコピペ
別ブックを開いてそこの値を拾う場合、まだ私が初心者だったころ画面がチカチカチカチカしちゃって使用する人にめっちゃ文句言われたことあります。
チカチカしないし速くなります。
テキストデータ限定で別ブックを開かずに値を取得するコピペ
CSVやテキストデータ限定なんですが、開かずに値を取得できるし、めちゃくちゃ爆速。
これはマジで体感一瞬です。
まとめ:高速化テクニックを使いこなそう!
作りたいマクロにもよりますが、大体上記の高速化テクニックのどれかは使えると思います。
高速化することでExcel処理の自動化からプログラム制御に進化できます。
初心者脱却の第一歩はここからです!!!