3

Excel シートのデータをループするために使用しているかなり単純なコードがあります。基本的に、150,000 行を超えるデータがあり、「Instrument Failure」を含む行を除くすべての行を削除したいと考えています。失敗)。これが私のコードです:

Sub UnsignedFailure()
Application.ScreenUpdating = False
'Start point
Set r = Range("E1")

'Loop, total rows is a function, executes quickly
For t = 3 To TotalRows
    'Check for a failure
    k = InStr(1, r.Cells(t, 1).Value, "Instrument Failure")
    'Verify that it corresponds to a GC
    b = InStr(1, r.Cells(t, 1).Offset(0, -3).Value, "GC")
    If k <> 0 And b <> 0 Then
    'Skip two rows if it is true
        t = t + 2
    Else
    'Delete the previous row since this row is not a failure
        r.Cells(t - 1, 1).EntireRow.Delete
    'Go back a row to account for the deleted row
        t = t - 1
    End If
Next t

Application.ScreenUpdating = True
End Sub

ステップスルーしてこれを確認しましたが、動作します。ただし、「IF」が真になるたびにコードを中断しても、中断間の時間は非常に長いようです (20,000 セルをチェックするのにおそらく 5 分)。コードを中断せずに実行すると、まだ完了していません (コンピューターがフリーズします)。コードに何か欠けている、または非効率的ですか? どんな助けでも大歓迎です!

4

1 に答える 1

12

Excel マクロの経験から、一致しない行を削除するのではなく、条件に一致するデータを新しいシートにコピーする方がはるかに効率的であることがわかりました。

行を削除するたびに、Excel がシートを再計算するのに数ミリ秒かかります (数式がない場合でも、すべてのセルをチェックして更新が必要かどうかを確認します)。ユーザーへの表示を更新します。すでに画面の更新を無効にしているため、この時間の一部が確実に短縮されます。もう 1 つの方法は、Excel の計算をオフにApplication.Calculation = xlCalculationManualし、サブの上部に配置して再計算を無効にApplication.Calculation = xlCalculationAutomaticし、下部に配置して再度有効にすることです。 このサイトには、Excel 用の VBA コードの最適化に関する適切な指針がいくつかあります。

先ほども言いましたが、条件が合ったときにデータを新しいシートに移動するのが最も効率的だと思います。

于 2013-04-23T15:35:34.123 に答える