Wpis z mikrobloga

#excel #vba #programowanie

Strasznie wolno działa mi ten kod:

Application.ScreenUpdating = False

Dim fullRange As Range
Set fullRange = Range("A1", Cells(Rows.Count, "A").End(xlUp))

Dim lastRow As Integer
lastRow = Cells(Rows.Count, "A").End(xlUp).Row

Dim r As Integer

For Each a In fullRange

For r = 1 To lastRow - a.Row

If a.Value = a.Offset(r, 0).Value Then
a.Offset(0, 1).Value = a.Offset(0, 1).Value + 1
a.Offset(r, 0).EntireRow.Delete

r = r - 1
End If
Next r

Next a

Application.ScreenUpdating = True

W komórkach A1 do A9000 są jakieś losowe słowa
a kolumna B jest wypełniona jedynkami

Jak jest wierszy 8000 to jeszcze pójdzie w te 50 sekund, ale 9000 excel nie ogarnia.

Można powyższy kod jakoś zoptymalizować?

A działanie polega na usunięciu duplikatów i zliczeniu ile razy się powtórzyły
  • 9
  • Odpowiedz
@scorpio18k: rozmawialiśmy ze 2 dni temu i twierdziłeś, że jak kod ma "przerobić" 12k wierszy i działa 50+ sekund, to już pewnie nie da się go usprawnić. Dziś @matti05 podał linka do kodu, który to samo robi dużo efektywniej. Z ciekawości napisałem swoją wersję i porównałem wydajność kodu dla 2 przykładowych zbiorów 500k wierszy generowanych losowo:

A) słowa 5-33 znaków, duża powtarzalność (~200) unikatów:

=POWT(ZNAK(97+LOS.ZAKR(0;23));LOS.ZAKR(5;33))
  • Odpowiedz