Я написал следующий код, чтобы очистить набор данных от дубликатов, если он соответствует определенным критериям (столбец E). Он сканирует 1216 строк данных (LastRow имеет 1216 попаданий) и очищает дубликаты. Единственная проблема, с которой я столкнулся, заключалась в том, что если бы у меня было 2 или 3 дубликата, он удалил бы только 1 дубликат.
Поэтому я написал еще одну строку кода, в которой сообщалось, что если один элемент (столбец B) был найден несколько раз, то переменная с именемутверждение равно TRUE. Поэтому я хочу, чтобы цикл продолжался до тех пор, пока в наборе данных не будет дубликатов, что также превратит переменную в ЛОЖЬ и остановит цикл. Однако цикл, кажется, продолжается бесконечно. Когда я останавливал сценарий вручную, он, казалось, очистил все дубликаты, но сценарий все еще продолжается.
Может кто-нибудь сказать мне, что вызывает этот бесконечный цикл в моем сценарии?
Sub ClearDataSet()
Dim LastRow As Integer
Dim i As Integer
Dim Rng, cell As Range
Dim Statement As Boolean
Set ws1 = ThisWorkbook.Worksheets("sheet1")
Set Rng = ws1.Range(("D1"), ws1.Range("D1").End(xlDown))
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
ws1.Range("A1").CurrentRegion.Sort _
key1:=ws1.Range("D1"), order1:=xlAscending, _
Key2:=ws1.Range("E1"), order2:=xlAscending, Header:=xlYes
Do
For i = 2 To LastRow
If ws1.Cells(i, "D") = ws1.Cells(i + 1, "D") And _
(ws1.Cells(i, "E") < ws1.Cells(i + 1, "E") Or ws1.Cells(i, "E") = ws1.Cells(i + 1, "E")) Then
Rows(i).Delete
End If
Next i
For Each cell In Rng
If WorksheetFunction.CountIf(Rng, cell.Value) > 1 Then
Statement = True
End If
Next cell
Loop Until Statement <> True
End Sub
РЕДАКТИРОВАТЬ: Настроенный (и более эффективный) скрипт после решения M Schalk
Sub ClearDataSet()
Dim LastRow As Integer
Dim i As Integer
Dim Rng, cell As Range
Dim Statement As Boolean
Dim StartTime As Long
Dim TimeElapsed As Long
StartTime = Timer
Set ws1 = ThisWorkbook.Worksheets("sheet1")
Set Rng = ws1.Range(("D1"), ws1.Range("D1").End(xlDown))
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
ws1.Range("A1").CurrentRegion.Sort _
key1:=ws1.Range("D1"), order1:=xlAscending, _
Key2:=ws1.Range("E1"), order2:=xlAscending, Header:=xlYes
For i = 2 To LastRow
If ws1.Cells(i, "D").Value = "" Then
GoTo OverStepcode
ElseIf _
ws1.Cells(i, "D") = ws1.Cells(i + 1, "D") And _
(ws1.Cells(i, "E") < ws1.Cells(i + 1, "E") Or _
ws1.Cells(i, "E") = ws1.Cells(i + 1, "E")) Then
Rows(i).Delete
i = i - 1
End If
Next i
OverStepcode:
TimeElapsed = Round(Timer - StartTime)
MsgBox "The code ran successfully in " & TimeElapsed & " seconds vbinformation"
End Sub