Avatar billede quiw Nybegynder
29. maj 2013 - 12:42 Der er 6 kommentarer

VBA Excel loop problem.

Kære Eksperter. Håber jeg smider spørgsmålet i den rette kategori. Jeg mener at det er mere kode orienteret end Excel orienteret.

Jeg har et excelark, hvor der er en masse duplicates. Jeg vil gerne fjerne alle dem som IKKE er duplicates. Til det har jeg fremstillet følgende:

Sub Remove_Singles()
    Dim x As Variant, y As Variant, z As Integer, o As Integer
   
    z = 0
    o = 0
   
    For Each x In Selection
        o = o + 1
        For Each y In Selection
            If x = y Then z = z + 1
        Next y
       
        If z < 2 Then Cells(o, 1).EntireRow.Delete
       
        z = 0
    Next x
    MsgBox "Done"
End Sub

Det fungerer egentlig udmærket, den fjerner alle singles. Problemet er bare, at det er som om at den stopper midt i loopet. F.eks med følgende data:
d
d
e
f

Bliver resultatet:
d
d
f

Hvorfor fjerner den kun e, og ikke også f? Det er som om den stopper efter at have fjernet e.

På forhånd tak.
Avatar billede tjp Mester
29. maj 2013 - 13:22 #1
Formentlig fordi du opdaterer/sletter rækker under et loop. Når du sletter en række rykker de resterende rækker opad, men foreach-pointeren opdateres ikke, men går blot videre med næste række...
Avatar billede tjp Mester
29. maj 2013 - 13:29 #2
Brug fx almindelige for-løkker med index og start evt. nedefra, så er der ingen ikke-undersøgte rækker der rykker opad.
Avatar billede quiw Nybegynder
29. maj 2013 - 13:43 #3
Okay. Hvor meget data kan sådan en macro håndtere? Vil man kunne køre det over 100.000 rækker?
Avatar billede tjp Mester
29. maj 2013 - 15:17 #4
Hvis du  bruger Long som i nedenstående omskrivning, skal du op på over 2.147.483.647 rækker for at få problemer med antallet, hvilket jo er 'lidt' mere end de 1.048.576 der er mulige i Excel 2010. (Rækkerne som skal undersøges skal som hidtil markeres før kørsel af makro.)
Du er obs på at Fortryd ikke dur efter en makro i Excel?

Sub Remove_Singles_II()
    Dim x As Variant, y As Variant, z As Long, o As Long, cnt As Long
    z = 0
    o = Selection.Count
    cnt = Selection.Count
    For x = cnt To 1 Step -1
        For y = 1 To cnt
            If Selection(x) = Selection(y) Then z = z + 1
        Next y
       
        If z < 2 Then
          Cells(o, 1).EntireRow.Delete
          cnt = cnt - 1
        End If
        o = o - 1
        z = 0
       
    Next x
    MsgBox "Done"
End Sub
Avatar billede quiw Nybegynder
31. maj 2013 - 12:56 #5
Yeah, det virker, smid et svar :)
Avatar billede tjp Mester
31. maj 2013 - 13:17 #6
Here U R.. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester