マクロを高速化する10の方法

Excelマクロがますます堅牢で複雑になると、パフォーマンスが低下する場合があります。マクロについて説明する場合、パフォーマンスという言葉は通常、速度と同義です。速度とは、VBAプロシージャが目的のタスクを実行する速度です。以下は、Excelマクロを最適なパフォーマンスレベルで実行し続けるための10の方法です。

停止シートの計算

スプレッドシートの数式に影響を与えるセルが変更または操作されるたびに、Excelがワークシート全体を再計算することをご存知ですか?数式が大量に含まれているワークシートでは、この動作によりマクロの速度が大幅に低下する可能性があります。

Application.Calculationプロパティを使用して、手動計算モードに切り替えるようにExcelに指示できます。ワークブックが手動計算モードの場合、F9キーを押して明示的に計算をトリガーするまで、ワークブックは再計算されません。

Excelを手動計算モードにし、コードを実行してから、自動計算モードに切り替えます。

サブMacro1()
Application.Calculation = xlCalculationManual
 'ここにマクロコードを配置します
Application.Calculation = xlCalculationAutomatic
エンドサブ

計算モードをxlCalculationAutomaticに戻すと、ワークシートの再計算が自動的にトリガーされるため、マクロの実行後にF9キーを押す必要はありません。

シート画面の更新を無効にする

マクロを実行すると、画面がかなりちらつくことに気付くかもしれません。このちらつきは、Excelが画面を再描画してワークシートの現在の状態を表示しようとしていることです。残念ながら、Excelが画面を再描画するたびに、メモリリソースを消費します。

Application.ScreenUpdatingプロパティを使用して、マクロが完了するまで画面の更新を無効にすることができます。画面の更新を無効にすると、時間とリソースが節約され、マクロの実行が少し速くなります。マクロコードの実行が終了したら、画面の更新をオンに戻すことができます。

サブMacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 'ここにマクロコードを配置します
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
エンドサブ

ScreenUpdatingプロパティをTrueに戻すと、Excelは自動的に画面の再描画をトリガーします。

ステータスバーの更新をオフにする

Excelウィンドウの下部に表示されるExcelステータスバーには、通常、Excelでの特定のアクションの進行状況が表示されます。マクロが大量のデータを処理している場合、ステータスバーはいくつかのリソースを消費します。

画面の更新をオフにすることは、ステータスバーの表示をオフにすることとは別であることに注意することが重要です。画面の更新を無効にしても、ステータスバーは引き続き更新されます。Application.DisplayStatusBarプロパティを使用して、ステータスバーの更新を一時的に無効にし、マクロのパフォーマンスをさらに向上させることができます。

サブMacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'ここにマクロコードを配置します
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
エンドサブ

イベントを無視するようにExcelに指示する

マクロをイベントプロシージャとして実装し、ワークシートまたはブックが変更されたときに特定のコードを実行するようにExcelに指示できます。

場合によっては、標準マクロが変更を加えて、イベントプロシージャをトリガーすることがあります。たとえば、Sheet1の複数のセルを操作する標準マクロがある場合、そのシートのセルが変更されるたびに、Worksheet_Changeイベントの実行中にマクロを一時停止する必要があります。

EnableEventsプロパティを使用して、マクロの実行中にイベントを無視するようにExcelに指示することで、パフォーマンスをさらに向上させることができます。

マクロを実行する前に、EnableEventsプロパティをFalseに設定します。マクロコードの実行が終了したら、EnableEventsプロパティをTrueに戻すことができます。

サブMacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'ここにマクロコードを配置します
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
エンドサブ

ページ分割を非表示にする

マクロが行数を変更したり、列数を変更したり、ワークシートのページ設定を変更したりするたびに、Excelはシートに表示されているページ分割の再計算に時間を費やすことを余儀なくされます。

マクロを開始する前にページ分割を非表示にするだけで、この動作を回避できます。

ページ分割を非表示にするには、DisplayPageBreaksシートプロパティをFalseに設定します。マクロの実行後も引き続きページ分割を表示する場合は、DisplayPageBreaksシートプロパティをTrueに戻します。

サブMacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'ここにマクロコードを配置します
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
エンドサブ

ピボットテーブルの更新を一時停止する

マクロが大きなデータソースを含むピボットテーブルを操作する場合、ピボットフィールドを動的に追加または移動するなどの操作を行うと、パフォーマンスが低下する可能性があります。

すべてのピボットフィールドの変更が行われるまでピボットテーブルの再計算を一時停止することで、マクロのパフォーマンスを向上させることができます。PivotTable.ManualUpdateプロパティをTrueに設定して再計算を延期し、マクロコードを実行してから、Pivo​​tTable.ManualUpdateプロパティをFalseに設定して再計算をトリガーするだけです。

サブMacro1()
ActiveSheet.PivotTables( "PivotTable1")。ManualUpdate = True
 'ここにマクロコードを配置します
ActiveSheet.PivotTables( "PivotTable1")。ManualUpdate = False
エンドサブ

コピーアンドペーストを回避する

Macro RecorderはVBAコードを作成することで時間を節約できますが、常に最も効率的なコードを作成できるとは限らないことを覚えておくことが重要です。代表的な例は、MacroRecorderが記録中に実行するコピーアンドペーストアクションをキャプチャする方法です。

仲介者を切り取り、1つのセルから宛先セルに直接コピーを実行することで、マクロをわずかにブーストできます。この代替コードは、Destination引数を使用してクリップボードをバイパスし、セルA1の内容をセルB1に直接コピーします。

Range( "A1")。Copy Destination:= Range( "B1")

(書式設定や数式ではなく)値のみをコピーする必要がある場合は、Copyメソッドをすべて一緒に回避することで、パフォーマンスをさらに向上させることができます。宛先セルの値を、ソースセルにあるのと同じ値に設定するだけです。この方法は、コピー方法を使用するよりも約25倍高速です。

Range( "B1")。Value = Range( "A1")。Value

あるセルから別のセルに数式のみをコピーする必要がある場合(値や書式設定ではない)、宛先セルの数式をソースセルに含まれているのと同じ数式に設定できます。

Range( "B1")。Formula = Range( "A1")。Formula

Withステートメントの使用

マクロを記録するときは、同じオブジェクトを複数回操作することがよくあります。Withステートメントを使用して、特定のオブジェクトに対して1回のショットで複数のアクションを実行することにより、時間を節約し、パフォーマンスを向上させることができます。

次の例で使用されているWithステートメントは、すべての書式変更を一度に適用するようにExcelに指示します。

    Range( "A1")。Fontを使用
    .Bold = True
    。斜体= True
    .Underline = xlUnderlineStyleSingle
    で終わる

アクションをWithステートメントにチャンク化する習慣を身に付けると、マクロの実行が高速になるだけでなく、マクロコードが読みやすくなります。

Selectメソッドの回避

Macro Recorderは、Selectメソッドを使用して、オブジェクトに対してアクションを実行する前にオブジェクトを明示的に選択するのが好きです。通常、オブジェクトを操作する前にオブジェクトを選択する必要はありません。実際、Selectメソッドを使用しないことで、マクロのパフォーマンスを劇的に向上させることができます。

マクロを記録した後、生成されたコードを変更してSelectメソッドを削除することを習慣にしてください。この場合、最適化されたコードは次のようになります。

    Sheets( "Sheet1")。Range( "A1")。FormulaR1C1 = "1000"
    Sheets( "Sheet2")。Range( "A1")。FormulaR1C1 = "1000"
    Sheets( "Sheet3")。Range( "A1")。FormulaR1C1 = "1000"

何も選択されていないことに注意してください。コードは、オブジェクト階層を使用して必要なアクションを適用するだけです。

ワークシートへの移動を制限する

マクロを高速化するもう1つの方法は、コードでワークシートデータを参照する回数を制限することです。ワークシートからデータを取得する方が、メモリから取得するよりも常に効率が低くなります。つまり、ワークシートを繰り返し操作する必要がない場合、マクロははるかに高速に実行されます。

たとえば、次の単純なコードは、VBAが継続的にSheets(“ Sheet1”)。Range(“ A1”)に戻って、Ifステートメントで実行される比較に必要な数を取得するように強制します。

ReportMonthの場合= 1から12
     If Range( "A1")。Value = ReportMonth Then
     MsgBox 1000000 / ReportMonth
終了する場合
次のReportMonth

より効率的な方法は、Sheets(“ Sheet1”)。Range(“ A1”)の値をMyMonthという変数に保存することです。このように、コードはワークシートではなくMyMonth変数を参照します。

MyMonthを整数として薄暗くする
MyMonth = Range( "A1")。Value
ReportMonthの場合= 1から12
MyMonth = ReportMonthThenの場合
MsgBox 1000000 / ReportMonth
終了する場合
次のReportMonth

ワークシートを直接参照するのではなく、変数を利用してメモリ内のデータを処理することを検討してください。

過剰な参照を避ける

オブジェクトのメソッドまたはプロパティを呼び出すときは、OLE コンポーネントの IDispatch インターフェイスを経由する必要があります。これらの OLE コンポーネントの呼び出しには時間がかかるため、OLE コンポーネントへの参照の数を減らすとマクロ コードの速度が向上します。

オブジェクトのプロパティまたはメソッドの呼び出しには、通常、 Object.Methodの表現メソッド  、つまり「.」が使用されます。シンボルはプロパティとメソッドを呼び出すために使用されます。

したがって、メソッドやプロパティの呼び出し回数は「.」の数で判断できます。「。」が少ないほど シンボルを指定すると、コードの実行が速くなります。

たとえば、次のステートメントには 3 つの記号「.」が含まれています。

ThisWorkbook.Sheet1.Range("A1").Value = 100

次のステートメントには記号「.」が 1 つだけあります。

Activewindow.Top = 100

ここでは、記号「.」の数を減らすためのいくつかのトリックを紹介します。より速く走るために。

まず、同じオブジェクトを繰り返し参照する必要がある場合、オブジェクトを変数に設定して呼び出しの数を減らすことができます。たとえば、次のコードでは 1 行につき 2 つの呼び出しが必要です。

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Sheets("Sheet1")オブジェクトは繰り返し参照する必要があるため 、最初に変数sht に設定すると  、各コードの呼び出しが 1 回だけで済むようになります。

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

次に、一時変数 sht を宣言したくない場合は、  前述のWithステートメントを使用することもできます。次の例に示すように:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

3 番目に、 ループが多い場合は、プロパティとメソッドをループの外に置くようにします。 ループ内で同じオブジェクトのプロパティ値を再利用する場合、まずループ外で指定した変数にプロパティ値を代入し、その変数をループ内で使用すると高速化できます。次の例に示すように:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

この例の各ループは、セル Cells(1,2) の Value プロパティを取得します。ループの開始前に Cells(1.2) の Value プロパティを変数に割り当てると、実行が速くなります。次の例に示すように:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

上記のコードは、  ループするたびにThisWorkbook.Sheets("Sheet1")を呼び出します。Withステートメントを使用してThisWorkbook.Sheets("Sheet1") への呼び出しを  ループの外に移動すると、これをより速く行うことができます 。次の例に示すように:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

バリアント型の使用を避ける

通常、初心者は Variant 型変数を使用することを好みます。これには、データが Integer または Long データ型に対して大きすぎる場合でもメモリ オーバーフローの問題が発生することなく、どの型のデータでも使用できるため、複雑さが少ないという利点があります。ただし、Varienmt 型のデータは、指定された他の型よりも多くのメモリ領域 (Integer データの場合は 2 バイト、Long データの場合は 4 バイト、Variant データの場合は 16 バイト) を必要とし、VBA は他の指定された型よりも Variant 型データの処理に多くの時間を必要とします。データの。次の例が示すように。

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

上記のコードでは、8 ~ 13 行目で Variant 変数の加算、減算、乗算、除算の 100 万回の演算を実行し、17 ~ 22 行目で Integer 変数の加算、減算、乗算、除算の 100 万回の演算を実行しています。私のコンピューターでは、Variant 変数の操作には約 0.09375 秒かかり、Integer 変数の操作には約 0.03125 秒かかりました。結果はコンピュータによって異なる場合がありますが、 バリアント変数は整数変数よりも大幅に遅くなります

このため、 指定されたデータ型を明示的に使用できる場合は、バリアント型変数の使用を避けることをお勧めします


スマートシート 9.1.1

スマートシート 9.1.1

Smartsheet は、プロジェクトの管理、ワークフローの構築、チームとの共同作業を可能にする動的な作業プラットフォームです。

共有ポイント

共有ポイント

SharePoint は、さまざまなワークフロー アプリケーション、「リスト」データベース、その他の Web コンポーネント、およびビジネス グループの共同作業を制御するためのセキュリティ機能を使用する Web ベースのコラボレーション システムです。

パーペチュアルカレンダー 1.0.38/1.0.36

パーペチュアルカレンダー 1.0.38/1.0.36

Van Nien Calendar は、携帯電話でカレンダーを表示するアプリケーションです。携帯電話で太陰太陽の日付をすぐに確認できるため、重要な仕事を計画することができます。

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook は、Microsoft Corporation によって開発されたビジネスおよび生産性アプリケーションです。

クリックアップ

クリックアップ

ClickUp は、あらゆるビジネスにとって最も評価の高い生産性プラットフォームの 1 つです。Google、Booking.com、サンディエゴ・パドレス、Uber などの大企業はすべて、職場の生産性を向上させるために ClickUp を使用しています。

PDF-XChange ビューア 2.5.322.10

PDF-XChange ビューア 2.5.322.10

PDF は、テキスト ドキュメントの読み取り、作成、送信に一般的に使用される形式になっています。その結果、この種のドキュメントに使用されるプログラムの数も増加しました。PDF-XChange Viewer は、ますます多くの PDF ビューアの 1 つです。

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice は、特に Excel、PowerPoint、Word など、Microsoft 365 に匹敵する Office アプリケーションの完全なスイートを提供します。プロジェクトをより効率的に管理できるようになり、いくつかのファイル形式がサポートされます。

iTaxviewer 1.8.7をダウンロード

iTaxviewer 1.8.7をダウンロード

iTaxViewer ソフトウェアは、現在最も人気のある XML ファイル読み取りソフトウェアです。このソフトウェアは、国税総局のXML形式の電子申告書を閲覧するためのアプリケーションです。

Nitro PDF リーダー

Nitro PDF リーダー

Nitro PDF Reader は、ほとんどの人が PDF ドキュメントを使用して毎日実行する基本的なタスクをすべてカバーする便利な PDF エディターです。

Foxit リーダー 12

Foxit リーダー 12

Foxit Reader は主に PDF リーダーですが、PDF ファイルの作成、署名、編集、注釈の追加も可能です。オペレーティング システム上で動作し、Microsoft Office パッケージのさまざまなプログラム用のプラグインがあります。