大量のデータを含むシート (sheet1) があります。このデータにはいくつかの列があり、そのうちの 1 つは nameColumn と呼ばれます。nameColumn には、行ごとに 1 つの単語が含まれます。
シート 2 には、600 語のリストがあります。
シート2の単語と一致するnameColumnの単語を含むシート1からすべての行を削除する必要があります
sheet1 を nameColumn でアルファベット順に並べ替え、sheet2 もアルファベット順に並べ替えました。
私が書いたコードは機能しますが、ひどいものです。シート 1 の行数に対して for ループを作成し、内部にネストされた while ループを作成します。このループは 2 つのシート間で値を比較し、nameColumn で一致が見つかった場合は行を削除します。シート1の問題の単語がシート2の単語よりもアルファベット順で「大きい」場合にのみ「i」を増やすようにwhileループに指示することで、「最適化」を試みました。
このコードは、約 10,000 行を処理するのに 20 分かかります。どうすれば速くなりますか?
一致しない行を別のシートにコピーするようにコードを変更しようとしたことに注意してください。これは単に遅いようです。この投稿Excel / VBA Remove duplicate rows by cross referencing 2 different sheets then delete 1 rowも見ましたが、率直に言って、それを実装しようとするのに十分な理解がありません。
Sub removerows3()
Application.ScreenUpdating = False
Dim numberof_data_rows As Long
numberof_data_rows = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
Dim numberof_alert_rows As Long
numberof_alert_rows = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
Dim nameColumn As Integer
nameColumn = 3
Dim current_alert_row As Integer
current_alert_row = 2
Dim current_data_row As Long
current_data_row = 2
Dim keep_searching_dosealert As Integer
keep_searching_dosealert = 1
For current_data_row = 2 To numberof_data_rows
Do While keep_searching_dosealert = 1
If Sheet2.Cells(current_alert_row, 1) = Cells(current_data_row, nameColumn)
Cells(current_data_row, nameColumn).EntireRow.Delete
keep_searching_dosealert = 0
current_data_row = current_data_row - 1
numberof_data_rows = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
ElseIf StrComp(Sheet2.Cells(current_alert_row, 1), Sheet1.Cells(current_data_row, nameColumn)) = 1 Then
keep_searching_dosealert = 0
current_alert_row = current_alert_row - 1
ElseIf StrComp(Sheet2.Cells(current_alert_row, 1), Sheet1.Cells(current_data_row, nameColumn)) = -1 Then
keep_searching_dosealert = 1
current_alert_row = current_alert_row + 1
Else
MsgBox ("error")
End If
Loop
keep_searching_dosealert = 1
Next current_data_row
End Sub