Avatar billede HHA Guru
17. marts 2022 - 12:59 Der er 3 kommentarer og
1 løsning

VBA kopiere linjer mellem ark og springe dem over som indeholder xxx er langsom

Hejsa,

Jeg sidder med en prisfil der er på 30500 linjer og der ønsker jeg at lave en sortering når jeg kopierer noget af filen over i et andet ark.
Når jeg overfører, ændrer jeg på rækkefølgen af indholdet i kolonnerne.
Men der er nogle enheder jeg ikke ønsker at have med over i den nye fil.
Jeg ønsker fx kun at have linjer hvor enheden er "stk" og "mtr" overført til det andet ark.

Jeg bruger denne kode, men den tager meget, som i rigtig meget lang tid at køre, når der er over 30.000 linjer.
Hvis der er en der har et bud på en kode der kører hurtigere, vil jeg være meget taknemmelig.

Excel testfil kan hentes her (Dog ikke med 30.000 linjer):
http://46.32.50.245:8082/share.cgi?ssid=0vbdcT8


Sub Opret_Ny_Fil()
'
' Opret_Ny_Fil Makro
'

'
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim LR1 As Long, LR2 As Long, Lastrow As Long
   
   
    Set ws1 = Sheets("Leverandør")
    Set ws2 = Sheets("Ark2")
    ws2.Cells.ClearContents
     
       
    LR1 = ws1.Range("A" & Rows.Count).End(xlUp).Row
       
    Application.ScreenUpdating = False
   
    LR2 = 1
   
    For i = 2 To LR1
     
       
        If ws1.Range("C" & i).Value = "stk" Or ws1.Range("C" & i).Value = "mtr" Then
            ws2.Cells.NumberFormat = "@"
            ws2.Cells(LR2, "A").Value = ws1.Cells(i, "H").Value
            ws2.Cells(LR2, "B").Value = ws1.Cells(i, "G").Value
            ws2.Cells(LR2, "C").Value = ("")
            ws2.Cells(LR2, "D").Value = ws1.Cells(i, "C").Value
            ws2.Cells(LR2, "E").Value = ws1.Cells(i, "D").Value
            ws2.Cells(LR2, "F").Value = ws1.Cells(i, "E").Value
            ws2.Cells(LR2, "G").Value = ("DKK")
            ws2.Cells(LR2, "H").Value = ws1.Cells(i, "E").Value
            ws2.Cells(LR2, "I").Value = ("DKK")
            ws2.Cells(LR2, "J").Value = ws1.Cells(i, "E").Value
            ws2.Cells(LR2, "K").Value = ("DKK")
            ws2.Cells(LR2, "L").Value = ws1.Cells(i, "E").Value
            ws2.Cells(LR2, "M").Value = ("DKK")
            ws2.Cells(LR2, "N").Value = ws1.Cells(i, "E").Value
            ws2.Cells(LR2, "O").Value = ("DKK")
           
            Worksheets("Ark2").Columns("A:CC").AutoFit
           
            LR2 = LR2 + 1
         
        End If
        Next i
       
       
           
        Worksheets("Ark2").Columns("E").NumberFormat = "0.00"
        Worksheets("Ark2").Columns("F").NumberFormat = "0.00"
        Worksheets("Ark2").Columns("H").NumberFormat = "0.00"
        Worksheets("Ark2").Columns("J").NumberFormat = "0.00"
        Worksheets("Ark2").Columns("L").NumberFormat = "0.00"
        Worksheets("Ark2").Columns("N").NumberFormat = "0.00"
       
       
Application.ScreenUpdating = True

MsgBox "Filen er klar!"

End Sub
Avatar billede kim1a Ekspert
17. marts 2022 - 14:22 #1
Er du nogenlunde velbevandret i VBA? Mit forslag ville være at lave en sortering en gang for alle på dine kriterier og så kopiere det over på een gang.

Det her var hvad recorderen gav:
Sub Macro1()
    Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$R$11").AutoFilter Field:=3, Criteria1:="=mtr", _
        Operator:=xlOr, Criteria2:="=stk"
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Sheets("Ark2").Select
    Range("A12").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

Der skal du naturligvis have sat dine variable ind rigtigt, men det bør være markant hurtigere end at løbe hvad linje igennem.
Avatar billede HHA Guru
18. marts 2022 - 06:33 #2
Hej kia1a,

Velbevandret er vist så meget sagt....
Men den kode ovenfor vil kun kopiere mtr og stk over på ark 2, som jeg lige kan gennemskue, rigtigt?
Herefter skal jeg så lave den omrokering af kolonner?
Kan det gøres på samme ark eller skal det kopieres over i et andet ark?
Avatar billede kim1a Ekspert
18. marts 2022 - 06:52 #3
Åh, den del havde jeg da fuldstændig overset igen.
Jeg ville nok kopiere kolonnerne en for en så og sætte dem ind, det vil stadig gøre den markant hurtigere, selvom du skal kopiere og indsætte x antal kolonner.

Så når du har filtreret så kopier ved at selecte en overskrift celle og så marker den og indsæt den i det andet ark. Altså:
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Ark2").Select
Range("A12").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Denne kører du så de 6 gange det er nødvendigt (Varetekst1    ProduktID    Bonus    ItemUnit    Nettopris    Bruttopris) derefter er det vist bare flad tekst (valuta DKK) og kopier af bruttopris.
Avatar billede HHA Guru
22. marts 2022 - 18:55 #4
kim1a,
Den må jeg lige dyrke lidt.
Kan godt se logikken i det, tak.
Venter lige med en løsning, til jeg har fået det testet.
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
Excel-kurser for alle niveauer og behov – find det kursus, der passer til dig

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