2017-04-12 13 views
0

I持って2枚(ProductListとCurrentProducts)私は、次のコードを持っている検索し、削除VBAコードを最適化する必要が

でExcelワークブック:これは何

Sub Macro1() 

Dim Lastrow As Integer 
Dim x As Integer 
Dim BinNo As String 
Dim MyCell As Range 

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

Lastrow = Sheets("ProductsList").Range("A65536").End(xlUp).Row 

For x = Lastrow To 2 Step -1 

BinNo = Sheets("ProductsList").Range("A" & x).Value 

With Sheets("CurrentProducts").Range("A:A") 
    Set MyCell = .Find(What:=BinNo, _ 
        After:=.Cells(.Cells.Count), _ 
        LookIn:=xlValues, _ 
        LookAt:=xlWhole, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlNext, _ 
        MatchCase:=False) 

    If Not MyCell Is Nothing Then 
     Sheets("CurrentProducts").Range(MyCell.Address).EntireRow.Delete 
    End If 
End With 

Next 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 

End Sub 

が列Aからそれぞれの値を取るですCurrentProductsでその製品を検索し、値が見つかった場合はCurrentProductsから行全体を削除するので、CurrentProductsシートに新しい製品が残っています。

このコードは機能しますが、非常に遅く、実行に約5分かかります。

各シートには約30,000行があります。

これを高速化する方法はありますか、それともそれほど多くの行があるからですか?

+2

...このような何かを試してみて、あなたが最適化/レビューを必要とする、あなたは**コードレビューでそれを投稿する必要がありますが**セクション、でます。http:/ /codereview.stackexchange.com/ –

+3

このトピックは、ここで規定されているCodeReviewに移行する必要があるため、このトピックはオフトピックとしてフラグを立てています。http://meta.stackoverflow.com/questions/266749/migration-of-code-questions -from-stack-overflow-to-code-review理由:コードが動作しており、OP自身が作業コードのパフォーマンスを向上させる方法を求めています。克服するバグやエラーはありません。 – Ralph

答えて

1

これは、数式を使用することでこれをもっと早く行うことができると私は示唆しています。たとえば、あなたはvlookupを行うことができます。その後、シートをソートし、値を返した行を削除することができます。

これは1つの解決策です。

私が考えることができる多くの同様のことがあります。しかし、数式を使うのが最も簡単です。

0

コードが動作する場合あなたが

Sub DeleteRows() 
Dim ws1 As Worksheet, ws2 As Worksheet 
Dim lr As Long 
Application.ScreenUpdating = False 
Set ws1 = Sheets("ProductsList") 
Set ws2 = Sheets("CurrentProducts") 

With ws2 
    lr = .Cells(Rows.Count, 1).End(xlUp).Row 
    .Columns(1).Insert 
    .Range("A2:A" & lr).Formula = "=IF(COUNTIF(" & ws1.Name & "!A:A,B2),NA(),"""")" 
    On Error Resume Next 
    .Range("A2:A" & lr).SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete 
    .Columns(1).Delete 
End With 
Application.ScreenUpdating = True 
End Sub 
関連する問題