マクロのスピードアップ
マクロを習い始めには全然問題はないですが、色々技を覚えて処理出来るデータが何千行と膨大になるにつれてマクロの動きが遅くなります。
その対策として
1.再計算をさせない。(再計算手動)
2.画面を動かさない(画面固定)
3.計算式をコピーした後で、値コピーする。
4.適切な変数を使う
5.Selectをできるだけ使わない
6.その他
1.再計算をさせない。(再計算手動)
ファイル→オプション→基本設定→数式→計算方法の設定→ブックの計算→手動→OK
マクロ自動記録で作ったマクロで手動に切り替えています。
2.画面を動かさない(画面固定)
複数シートを使ってマクロを使用した場合、シート間での移動作業を表示させない。
Sub saikeisanoff()’再計算を手動にする、画面固定を固定する
With Application
.Calculation = xlManual’再計算を手動にする
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False’画面固定
Application.ScreenUpdating = False
End Sub
-----------------------------------------------------------
Sub saikeisanon()’再計算を自動にする、画面固定しない
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = True
Application.ScreenUpdating = True
End Sub
------------------------------------------------------------
3.計算式をコピーした後で、値コピーする。
関数が多いと処理が掛かりますので最初の行だけに計算式を設定
マクロを作成して計算式をコピー貼り付け、値コピー貼り付けする。
Sub 分解_計() '出目分解コピー、その他コピー(ここでは計算式コピーのみです)
Dim gyou As long
gyou = ActiveCell.Row '該当行に(コピー先の行)
If Cells(gyou, 17) = "" Then End
Call saikeisanoff ’再計算オフのマクロ呼び出し実行する。
Range("R3:AC3").Select '出目4つ
Selection.Copy
Cells(gyou, 18).Select
ActiveSheet.Paste
Range("AG3:AH3").Select
Selection.Copy
Cells(gyou, 33).Select
ActiveSheet.Paste
Range("cb3").Select
Selection.Copy
Cells(gyou, 80).Select
ActiveSheet.Paste
Range("cd3").Select
Selection.Copy
Cells(gyou, 82).Select
ActiveSheet.Paste
Range("gm3").Select
Selection.Copy
Cells(gyou, 195).Select
ActiveSheet.Paste
Range("ec4:fv4").Select '飛び間隔から裏など
Selection.Copy
Cells(gyou, 133).Select
ActiveSheet.Paste
Call saikeisanon ’再計算を自動にする
Cells(gyou, 18).Select
End Sub
------------------------------------------------------------------------
’値コピーの自動記録マクロ例
Sub Macro1()
Range("R4742:U4744").Select ’コピー元(関数のあるセル範囲)
Selection.Copy
Range("R4742").Select ’コピー先に値コピー(関数が無くなる)
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
--------------------------------------------------------------------------
’A列の1行から5000行までに、それぞれ1から5000を入力する。
Sub 入力()
Dim i As long
For i = 1 To 5000
Range("a" & i) = i
Next i
End Sub
Range("a" & i) = i は Cells(1,i)としたほうが良い様です。
*************************************************************************************************
4.適切な変数を使う
5.Select をできるだけ使わない
6.その他
適切なマクロを作る。スキルアップだけですね!
*************************************************************************************************
「GoGoエクセルマクロをはじめよう!」ブログはすごく参考になります。
スピードアップを考える前に、確実な方法でマクロを作ることが大事な様です。
ミス発生がすぐに分かるようにするとか、難しいことは覚えないとか?
理解出来ない事は後にまわしてですね。