19

コードの実行時間を測定して、スクリプトをローカルで実行する場合とサーバーで実行する場合の違いを測定してみました。ある時点で無効にするのを忘れてscreen updatingいましたが、詳細について考える前に、点滅するライトに敏感ではないことに感謝していました。

私が最初に使い始めたときはVBA、エンド ユーザーが PC がクラッシュしようとしていると怖がらせないように、単に使用されただけだと思っていました。あなたのコードの効率を改善するためにもっと読み始めたとき、私はそれが何のためにあるのか理解しましたが、コードの実行時間に実際にどの程度の影響があるのscreen updatingでしょうか?

4

5 に答える 5

35

画面の更新をオフにしても、コードが Excel と対話して画面の内容が変更される場合にのみ、実行時間に違いが生じます。画面の変化量が多いほど、影響は大きくなります。他の投稿された回答は、これを適切に示しています。

実行時間に違いをもたらす可能性があるその他のアプリケーション設定は、計算とイベント処理です。このコード テンプレートを出発点として使用します (エラー ハンドラーは、エラーが発生した場合でも、サブルーチンの最後でこれらのプロパティが再び有効になるようにします)。

Sub YourSub()
    On Error GoTo EH

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' Code here

CleanUp:
    On Error Resume Next
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
Exit Sub
EH:
    ' Do error handling
    Resume CleanUp
End Sub

実行速度をさらに向上させることができる手法は他にもあります。

最も有用なインクルード

  1. Select、できるだけ避けActivateてください。ActiveCell/Sheet/Workbook代わりに、変数を宣言して割り当て、それらを参照します。
  2. 大きな範囲を参照する場合は、Range データをバリアント配列にコピーして処理し、結果をコピーしてから範囲に戻します。
  3. Range.SpecialCellsRange.Findおよびを使用して、Range.AutoFilter参照されるセルの数を制限します。

SOには、これらの手法の例がたくさんあります。

于 2012-09-13T12:02:48.713 に答える
8

ScreenUpdatingが重要である理由のかなり抜本的な例を見たい場合は、次のコードを実行します。ScreenUpdating = falseこのスワップを Excel 2011 で!なしで実行するには、約 45 倍の時間がかかります。これは時間の大きな違いです。

Sub testScreenUpdating()

    Dim i As Integer
    Dim numbSwitches As Integer
    Dim results As String

    'swap between sheets this number of times
    numbSwitches = 1000

    'keep track of time
    Dim startTime As Double
    startTime = Time

    'swap between sheets 1/2 (need both sheets or this will crash)
    For i = 1 To numbSwitches
        Sheets(1 + (i Mod 2)).Select
    Next i

    'get results
    results = "Screen Updating not disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
    startTime = Time

    'scenario 2 - screenupdating disabled

    Application.ScreenUpdating = False

    'swap between sheets 1/2 (need both sheets or this will crash)
    For i = 1 To numbSwitches
        Sheets(1 + (i Mod 2)).Select
    Next i

    Application.ScreenUpdating = True

    'get results for part two
    results = results & vbCrLf & "Screen Updating IS disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"

    'show results
    MsgBox results


End Sub

また、効率を上げる方法について話している間、もう 1 つの重要なポイントは、SelectSelection、およびActivateが必要になることはめったにないということです。マクロを記録すると、常にこれらが使用されますが、実際にコードで使用する必要がある状況はほとんどありません。同様に、Activeタイトルにあるもの ( などActiveCell) は通常、おそらくセルを選択しているため、コードが遅くなることを示しています。

ほとんどの場合、セル/ワークシートを具体的に参照して、選択を避けることができます。例えば:

msgbox (Worksheets(1).Range("A1").value) 

現在最初のワークシートを使用しているかどうかに関係なく機能します。よくある新しい VBA の間違いは、次のようなことをすることです。

Worksheets(1).Select
msgbox (Range("A1").value)

これは不要なステップです。

これにより、コードの実行時間が大幅に長くなります。

于 2012-09-12T16:09:52.837 に答える
3

最初に、Richie (UK) によって書かれたスクリプトを使用してきました。ポスト #7ここに

1 つのセルの i の値を変更するループを単純に反復します。少し変更して、10,000回ループし、サンプルサイズで10回実行します。

コードの実行速度に対する画面の更新の影響は何ですか?

Screen Updatingこれらは、が無効化された場合と有効化された場合の実行の長さです。

Disabled    Enabled
0.61909653  2.105066913
0.619555829 2.106865363
0.620805767 2.106866315
0.625528325 2.102403315
0.625319976 2.0991179
0.621287448 2.105103142
0.621540236 2.101392665
0.624537531 2.106866716
0.620401789 2.109004449

ご覧のとおり、 がScreen Updating無効になっていない場合、コードの実行に約 3.5 倍の時間がかかります。

これらのコードは両方とも、スプレッドシートを「見る」のではなく、VB エディターの [実行] ボタンを使用して実行されました。

コードの最初と最後にある 2 つの単純な行:

Application.ScreenUpdating = False
Application.ScreenUpdating = True

しかし、それらは実行の効率に大きな影響を与える可能性があります!

注:明らかに の利点はScreen Updatingここにいる多くの人によく知られていますが、これは初心者にとって有益である可能性があり、数字を見るのは興味深いと思います!

于 2012-09-12T15:37:36.980 に答える
1

古いスレッドであることは知っていますが、

  1. を設定ScreenUpdating = trueしますが、元の値に戻すことを忘れないでください。
  2. ワークブックの変更もリセットされScreenUpdatingます。
于 2016-07-14T11:47:44.243 に答える