趣味のエクセルマクロ

ナンバーズ4などの数字選択式宝くじデータ分析用の自作マクロおよびナンバーズ4の各種データリストなどをブログにしています。

マクロのスピードアップ

マクロを習い始めには全然問題はないですが、色々技を覚えて処理出来るデータが何千行と膨大になるにつれてマクロの動きが遅くなります。

その対策として



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 Integer
    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 Integer


   For i = 1 To 5000
        Range("a" & i) = i
       Next i
 End Sub


 Range("a" & i) = i は Cells(1,i)としたほうが良い様です。





*************************************************************************************************


「GoGoエクセルマクロをはじめよう!」ブログはすごく参考になります。

スピードアップを考える前に、確実な方法でマクロを作ることが大事な様です。
ミス発生がすぐに分かるようにするとか、難しいことは覚えないとか?
理解出来ない事は後にまわしてですね。