4

現在、今年の売上がないすべての顧客を非表示にする短いマクロを作成しています。YTD の売上は K 列 (具体的には K10-250) にあります。これらのセルは vlookup を使用して、データをダンプする別のタブからデータを取得します。私の質問は、なぜこのマクロの実行に 10 ~ 15 分かかるのでしょうか? 別のスプレッドシートに同様のマクロがあり、1,500 行を超える場合に 2 ~ 3 分しかかかりません。画面の更新は既にオフにしています。それ以外に高速化できるものは思いつきません。

   Sub HideNoSlackers()
'
' HideNoSlackers Macro
'

'
Application.ScreenUpdating = False
'
 Sheets("CONSOLIDATED DATA").Select
 Dim cell As Range
 For Each cell In Range("K10:K250")
   If cell.Value = 0 Then
     cell.EntireRow.Hidden = True
   Else
     cell.EntireRow.Hidden = False
   End If
 Next
End Sub
4

7 に答える 7

4

行を非表示にする前に、計算を手動に設定することをお勧めします。Ifまた、ケース内のステートメントを取り除くこともできます。これを試して:

Sub HideNoSlackers()
    Dim cell As Range, lCalcState As Long

    Application.ScreenUpdating = False
    ' Record the original Calculation state and set it to Manual
    lCalcState = Application.Calculation
    Application.Calculation = xlCalculationManual
    For Each cell In ThisWorkbook.Worksheets("CONSOLIDATED DATA").Range("K10:K250")
        cell.EntireRow.Hidden = (cell.Value = 0)
    Next
    ' Restore the original Calculation state
    Application.Calculation = lCalcState
    Application.ScreenUpdating = True ' Don't forget set ScreenUpdating back to True!
End Sub
于 2013-09-19T23:25:18.583 に答える
1

他に何か問題があるはずです。せずに試してみてください。シートを選択しますが、それは大きな改善ではありません

行はデフォルトで表示されることに注意してください。したがって、Else ステートメントは実際にはオプションである必要があります。

Sub HideNoSlackers()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

    Sheets("CONSOLIDATED DATA").Cells.EntireRow.Hidden = False
    Dim cell As Range
    For Each cell In Sheets("CONSOLIDATED DATA").Range("K10:K250")
        If cell.Value = 0 Then cell.EntireRow.Hidden = True
    Next

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
于 2013-09-19T22:13:43.230 に答える
1

非常に異なる方法で同じ目標を達成するための最短のコード:

Sub column_K_not_NULL
    Sheets("CONSOLIDATED DATA").Select
    If ActiveSheet.FilterMode Then Selection.AutoFilter 'if an autofilter already exists this is removed
    ActiveSheet.Range("$K$10:$K$250").AutoFilter Field:=1, Criteria1:="<>0"
End Sub

もちろん、次のような標準の最小値を入れることもできます

application.calculation = Manual 
Application.ScreenUpdating = False

そして最後に逆に。マックス

于 2013-09-20T14:29:22.950 に答える
1

改ページを無効にしてみてください。誰かがシートから印刷した後に発生する同様の問題がありました。これにより改ページがオンになり、その後のスクリプトの実行に時間がかかりました。

ActiveSheet.DisplayPageBreaks = False
于 2014-01-09T19:22:04.707 に答える
0

バージョン 4.1.0.1533 のプログラム Syncplicity は、イベントが syncplicity をトリガーするため、マクロの速度を最大 15 倍遅くすることがわかりました。

Application.EnableEvents = False

;ここで仕事をしてください

Application.EnableEvents = True

速度が戻った。

于 2017-01-10T10:33:00.920 に答える