Avatar billede RixJohannsen Nybegynder
05. maj 2010 - 13:24 Der er 4 kommentarer og
1 løsning

Optimering af VBA kode for bedre hastighed

Hejsa
Jeg har forholdsvis ny i VBA kode sammenhæng.
Jeg har lavet noget kode i VBA for Excel, der samler data fra flere rækker på en, afhængig af en værdi i en bestemt kolonne.

Efterfølgende skal de øvrige rækker slettes.
Men det tog alt alt for lang tid at slette disse rækker i mit Loop. Derfor har jeg ændret kode så disse rækker markeres med "S" og sluttelig i koden slettes disse rækker så.

Min datamængde er på ca. 150.000 rækker.
Jeg har lavet en test med 1500 rækker og det tager 4 min. som koden er nu. Det vil derfor betyde at det tager 6,5 time at køre denne makro.

Håber der en der kan hjælpe med at optimere koden yderligere.

På forhånd tak.


Sub Saml_Linier()
Dim Slutrække As Long
Dim startcelle As String
Dim startrække As Long
Dim i As Long
Dim vaerdi As String
Dim vaerdi2 As String

Application.ScreenUpdating = False

Sheets("FS").Select
starttid = Time
    Columns("A:A").Select
    Selection.ClearContents
   
    Columns("L:M").Select
    Selection.ClearContents
   
    Columns("V:V").Select
    Selection.ClearContents
   
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "=RC[3]&"" ""&RC[4]&"" ""&RC[5]"

    Range("B2").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(0, -1).Select
    ActiveCell.FormulaR1C1 = "x"
    Range("A2").Select
    Selection.Copy
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

    Range("C2").Select
    Slutrække = ActiveCell.Row
    Selection.End(xlDown).Select
   
    ' Her findes start række nr.
    startcelle = ActiveCell.Address()
    startrække = ActiveCell.Row
 
    i = ActiveCell.Row()
    ActiveCell.Offset(1, 0).Select
    vaerdi = ActiveCell
    Range(startcelle).Select
   
Do
  Do While i > Slutrække - 1
   
    If ActiveCell = vaerdi Then
      vaerdi2 = ActiveCell
      tilbagetilCelle = ActiveCell.Address()
      ActiveCell.Offset(0, 9) = ActiveCell.Offset(1, 4).Value
   
      If ActiveCell.Offset(1, 9) <> "" Then
        ActiveCell.Offset(0, 10) = ActiveCell.Offset(1, 9).Value
      End If
   
      If vaerdi2 <> "" Then
        ActiveCell.Offset(1, 19) = "S"
      End If
       
    End If
    vaerdi = ActiveCell
    If ActiveCell.Row > 1 Then
      ActiveCell.Offset(-1, 0).Activate
    End If
    i = ActiveCell.Row()
  Loop
  Loop Until Slutrække = i + 1
 
   
  ' Her sorteres kolonne 3 for at finde de rækker der skal slettes
  ActiveWorkbook.Worksheets("FS").ListObjects("Tabel_Forespørgsel_fra_AVIS").Sort _
        .SortFields.Add Key:=Range("Tabel_Forespørgsel_fra_AVIS[Kolonne3]"), SortOn _
        :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("FS").ListObjects("Tabel_Forespørgsel_fra_AVIS") _
        .Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' Her findes rækker markeret med S, og slettes

    Range("V2").Select
    Selection.End(xlDown).Select
    Start = 2
    slut = ActiveCell.Row
    Range("A2").Select
    rækker = Start & ":" & slut
    Rows(rækker).Select
    Selection.Delete Shift:=xlUp

sluttid = Time
MsgBox "Det tog " & DateDiff("n", starttid, sluttid) & "minutter"

End Sub
Avatar billede kabbak Professor
05. maj 2010 - 23:08 #1
hvis jeg får noget at arbejde med , en fil med data i, skal jeg kikke på det.

kabbak snabela vip dot cybercity dot dk
Avatar billede RixJohannsen Nybegynder
06. maj 2010 - 07:11 #2
Super - tak. Men jeg kan ikke se din mail adresse. Hvor skal jeg sende filen hen? (Jeg er ny på dette site, og jeg kan ikke se at man kan uploade en fil her).
Avatar billede kabbak Professor
06. maj 2010 - 10:26 #3
kabbak snabela vip dot cybercity dot dk

dot  = punktum
snabela = @

alt indtastes uden mellemrum
Avatar billede RixJohannsen Nybegynder
12. maj 2010 - 09:27 #4
Tak for din hjælp. Jeg har fjernet al kode i cellerne, således at det kun er i hukommelsen at der arbejdes. Det gør det langt hurtigere. Så har jeg blot indsat koden i felterne efterfølgende.
Det er dog stadig ikke lynhurtigt, men det er også MEGET store datamængder.
Avatar billede kabbak Professor
12. maj 2010 - 18:26 #5
prøv at se koden her, hvordan jeg skriver til arkene, fra mine variabler.
http://www.eksperten.dk/spm/909007#reply_7588908
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