2017-11-13 10 views
0

指定された値を含む行を削除しようとしています。以下のコードは〜200k行のシートで動作しましたが、350k行のシートで実行しようとするとクラッシュします。それをより効率的にする方法はありますか?どうもありがとう!彼らは、アレイ内の項目と一致した場合、時間の選択とフィルタリング350K行1を参照してください:あなたの現在のコードはかなり可能な限り最も非効率的なことをやっている次のVBAコードをより効率的に作成する

Sub MultiDelete() 

    With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    End With 

    Range("A1").Activate 'change to suit the column containing the names 
    Dim MultiDelete 
    MultiDelete = Array("Name1", "Name2", "Name3") 'put as many names as you like in the array 
    Dim G As Variant 
    While ActiveCell.Value <> "" 
    G = Filter(MultiDelete, ActiveCell.Value) 
    If UBound(G) <> -1 Then 
     Selection.EntireRow.Delete 
    Else 
     ActiveCell.Offset(1, 0).Activate 
    End If 
    Wend 
    With Application 
    .ScreenUpdating = True 
    .DisplayAlerts = True 
    End With 
    End Sub 
+1

これで問題が完全に解決されるかどうかはわかりませんが、VBAの組み込み関数を使用することは、通常は自分で処理するよりも大幅に低くなります。たとえば、ActiveCell.Offsetを使用すると、forループを使用してセルを反復処理するよりもスループットが低下する可能性があります。同じことが、細胞の活性化にも当てはまります。このコマンドを使用することなく、値を取得して変更することができます。 – KM529

答えて

2

代わりに、オートフィルタを追加するか、範囲をExcel Table/ListObjectに変換します(フィルタが組み込まれているため)。マクロレコーダーを起動し、3つの用語を手動でフィルタリングし、マクロレコーダーを停止し、生成したコードを見てください。

マクロレコーダーは、どのように動くかを検討する際には、最初のコールポートである必要があります。それは常にエレガントで効率的なコードを生成するわけではありませんし、しばしばそれをきれいにする必要がありますが、この場合、あなたは氷河からワープ速度に移行します。

+0

ありがとう!私は〜40項をフィルタリングしています。これはより良く機能しています。 – MA123

+0

あなたの問題を解決するなら、私の答えを受け入れてください。 – jeffreyweir

関連する問題