エクセルVBA初心者向け 処理高速化のプログラム記述方法

2016/01/03

プログラム

t f B! P L
エクセルマクロVBA処理が遅くブチ切れ寸前の貴方に高速化の方法をご紹介します。
厳密には違う点もあるかもしれませんが細かい事を気にしない方は以下要点を真似てください。
【とりあえず記述できるけど処理が遅い人向け】

■型を宣言する

====================
Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row
====================

基本です。適切な型を宣言すれば気持ち速いかも。
数字はLong、文字はString、オブジェクトはObject、日付はDate、配列等はVariant 。
Variantの場合は型宣言省略しましょう。(デフォルトの型がVariantの為)。

■Cellsを使う

====================
Range("A1:B" & MR)
====================

====================
Range(Cells(1,1),Cells(MR,2))
====================

可能な限りCells(数値,数値)を多用しRange("文字")は控えて下さい。
Range内の文字列"A1:B"を数字に変換するのに僅かに時間がかかります。
Range("A1")でなくCells(1,1)を使ってください。

パソコンにとって分かりやすく容易な命令を記述する事で高速化します。
パソコンの言語は数値、Cellsは数値、Rangeの"A1:B"は文字。
文字をいちいち数値に変換していたらパソコンさんブチ切れ寸前です。

■配列を駆使する

1つ1つのセルにアクセスし処理を行うのは時間がかかります。

====================
        Range("C2:C" & d).Formula = "=A2+B2"
        Range("C2:C" & d).Select
        Selection.Value = Selection.Value
====================
====================
    Dim i As Long, A As Long, B As Long
    AA = Range(Cells(1, 11), Cells(MR, 11))
    BB = Range(Cells(1, 12), Cells(MR, 12))
    CC = Range(Cells(1, 13), Cells(MR, 13))
    For i = 2 To MR
        A = AA(i, 1)
        B = BB(i, 2)
        CC(i, 1) = A + B
    Next i
    Range(Cells(1, 13), Cells(MR, 13)) = CC
====================

セルデータ範囲をまとめて配列に格納(1回目)し計算を行い
計算結果をまとめてセルに格納(2回目)します。
セルへのアクセス回数2回です。
AA = Range(Cells(1, 11), Cells(MR, 11))
AA = Range(Cells(1, 11), Cells(MR, 13))
にしてBB,CC省略すればより速いかもしれません。

■関数を駆使する

====================
D = Range("B1048576").End(xlUp).Row
        Range("U2").Formula = "=COUNTIF($G$2:G2,G2)"
        Range("U2").AutoFill Destination:=Range("U2:U" & D)
        Range("U2:U" & D).Select
        Selection.Value = Selection.Value
====================

==================== 
For i = 2 To MR
Cells(i, 26) = WorksheetFunction.CountIf(Range(Cells(2, 8), Cells(i, 8)), Cells(i, 8))
Next i
====================

セルに関数を入力するのではなくVBAの関数を使います。
エクセルとは範囲などの記述が少々異なる点
使用できない関数がある点に注意です。

上記は昇順並び替え済み8列目の同じ文字列を連番カウントし
数値を26列目に入れます。

■画面最小化、画面更新無効、警告無効、自動計算無効

====================
Application.WindowState = xlMinimized
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
~処理~
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.WindowState = xlNormal
====================

Application.WindowState = xlMinimized と
Application.WindowState = xlNormal は
私の気分で付けているだけなので省略してもおkです。
記述した場合マクロ処理が終わったら\(^o^)/ブワッ!!
とエクセルがパソコン画面に表示されます。

他は一般的には記述した方が速いでしょう。

■selectを使わない

====================
    Cells(1, 1).CurrentRegion.Select
    Selection.Copy
====================

====================
    Cells(1, 1).CurrentRegion.Copy
====================

Selectは時間の無駄なので極力排除しましょう。

■重複して同じ処理を記述しない

====================
Worksheets("st1").Activate
    ActiveSheet.Range("A1").AutoFilter Field:=15, Criteria1:=Array("キレたK", "ブチ切れ寸前", "高速化"), Operator:=xlFilterValues
    ActiveSheet.Range("A1").AutoFilter Field:=19, Criteria1:="<=0"
    Worksheets("st1").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
====================

====================
Worksheets("st1").Activate
    Cells(1, 1).AutoFilter Field:=15, Criteria1:=Array("キレたK", "ブチ切れ寸前", "高速化"), Operator:=xlFilterValues
    Cells(1, 1).AutoFilter Field:=19, Criteria1:="<=0"
    Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
====================

"st1"アクティブ状態なのでActiveSheet.Worksheets("st1").は重複不要。
ついでにRange("A1")⇒Cells(1, 1)変更。

上記に気を付けて記述または見直し書き換えを行えば
ブチ切れ寸前の速さになると思われます。

我がマクロは上記ダメな点を網羅しており書き換えにより処理時間
[1時間30分]⇒[40分]まで短縮されましたとさ。
_(:3 」∠)_

ラベル

このブログを検索

スポンサーリンク

自己紹介

機械メーカー総合職正社員10年勤務後退職。 エクセルVBAプログラム歴 5年。 LibreOffice(無料)でVBAマクロ検証。
■Fortniteクエスト攻略動画■
■Twitter■
⇒詳細プロフィールを表示

QooQ