Avatar billede snej Nybegynder
22. marts 2006 - 22:46 Der er 5 kommentarer og
1 løsning

Finde sidste forekomst vha. makro.

Jeg har en makro hvor jeg i en kolonne har nogle forskellige bogstaver

Disse bogstaver er sorteret, og på et tidspunkt skal jeg have indsat en blank linie efter det sidste U, det har jeg så løst på følgende måde, hvor den finder det første U, og så ved hjælp af en løkke rykker ned indtil der ikke længere er et U og så indsætter linien.

        Columns("O:O").Select
        Range("O6").Activate
        Selection.find(What:="U", After:=ActiveCell).Activate
        Do Until ActiveCell.Value = ""
            If ActiveCell.Value = "U" Then
                ActiveCell.Offset(1, 0).Select
                Else
                Selection.EntireRow.Insert
            End If
        Loop

Spørgsmålet er om der er en hurtigere måde, at finde den sidste forekomst af et U som i dette eksempel.

Det kan  jo godt tage lidt tid at rykke igennem 10-20.000 linier.
Avatar billede kabbak Professor
22. marts 2006 - 23:01 #1
prøv at teste denne

Public Sub test2()
Dim RW As Long, D As Variant, I As Long
RW = Range("O65536").End(xlUp).Row + 1
D = Range("O1:O" & RW)
For I = RW To 2 Step -1
If D(I - 1, 1) = "U" Then
Range("O" & I).EntireRow.Insert
  Range("O" & I).Select
  Exit For
  End If
  Next
  D = Empty
End Sub
Avatar billede snej Nybegynder
23. marts 2006 - 10:14 #2
Den virker jo hurtigt og perfekt.

Jeg kan bare ikke lige se, hvad det er der gør at den fungere så hurtigt.

Umiddelbart ligner det at den bare tjekker kolonnen nedefra, men jeg har testet med over 40.000 linier, og det sker jo øjeblikkeligt.

Jeg er forholdsvis ny til makroer, og det kunne jo være man kunne bruge det et andet sted. Så det ville være rart med en forklaring af hvad der sker.
Avatar billede kabbak Professor
23. marts 2006 - 10:59 #3
Public Sub test2()
    Dim RW As Long, D As Variant, I As Long
    RW = Range("O65536").End(xlUp).Row + 1
    ' finder den række der er under den sidste udfyldte celle
    D = Range("O1:O" & RW)
    ' læser cellerne ind i  variabelen D, det er hurtigere at finde i en variabel en ved at
    ' tjekke celler, derfor hastigheden.

    For I = RW To 2 Step -1
        ' læser baglæns, for st finde det sidste U
        If D(I - 1, 1) = "U" Then
            ' når U er fundet
            Range("O" & I).EntireRow.Insert
            ' sættes en række ind
            Range("O" & I).Select
            ' aktiverer cellen
            Exit For
            ' hopper ud af løkken
        End If
    Next
    D = Empty    ' tømmer variablen
End Sub
Avatar billede snej Nybegynder
23. marts 2006 - 11:15 #4
Tak det virker jo perfekt og så blev man igen lidt klogere.
Avatar billede kabbak Professor
23. marts 2006 - 17:17 #5
husk at lukke, marker mit navn i boksen til venstre og tryk accepter ;-))
Avatar billede snej Nybegynder
25. marts 2006 - 16:14 #6
Jeg mente ellers jeg accepterede sidst, men så forsøger vi da bare igen.

Fortsat god weekend.
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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