Avatar billede mrkr Juniormester
02. november 2008 - 16:04 Der er 8 kommentarer og
1 løsning

Sætte farten op på en kode

Jeg har en kode der henter data fra fra ark "2008" til arket "timesedler"

Koden virker godt nok, men jeg kunne godt bruge at den blev speedet lidt op da den skal løbe op til 100.000 linjer igennem.

Jeg er klar over at den kan køres på meget kort tid, hvis blot den bliver læst korrekt ind i arrays.

Jeg har forsøgt alt muligt men kan ikke få den forbedret.

Som I kan se i koden nedenfor er der 3 kriterier der er gældende
Området "timesedler_fradato"  (feks. 01-01-2008)
Området "timesedler_tildato"  (feks. 30-06-2008)
Området "timesedler_init"  (tal fra 1 til 10)

Er der nogen der kan hjælpe mig med at få den speedet lidt op?


Sub timesedler_hent_udfra_dato()
   
    Dim intI As Integer
    Dim intJ As Integer
   
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
   
    Rows("5:5000").Select
    Selection.Delete Shift:=xlUp
    Range("a1").Select
   
    Set shtime = ThisWorkbook.Sheets("timesedler")
    Set sh2008 = ThisWorkbook.Sheets("2008")
    Set shstam = ThisWorkbook.Sheets("stam")
   
    intJ = 5
    Do Until (ThisWorkbook.Sheets("timesedler").Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop
   
    rk08 = sh2008.Cells(250000, "B").End(xlUp).Row
    initial = shstam.Range("timesedler_init")
    x = Application.CountIf(sh2008.Range("D5:D" & rk08), initial)
    RK = 4
 
    For intI = 5 To x
      rk1 = sh2008.Range("D" & RK & ":D250000").Find(revinit, LookIn:=xlValues, LookAt:=xlWhole).Row
      RK = rk1
     
    If sh2008.Cells.Range("C" & RK) >= shstam.Cells.Range("timesedler_fradato") And _
        sh2008.Cells.Range("C" & RK) <= shstam.Cells.Range("timesedler_tildato") Then
       
        sh2008.Range("A" & RK & ":T" & RK).Copy shtime.Range("A" & intJ)
       
        intJ = intJ + 1
        End If
        'Application.StatusBar = "Henter data fra " & x & " linjer!"
  Next
 
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
   
End Sub


ALTERNATIV KODE SOM IKKE VIRKER

Sub timesedler_hent_udfra_dato_ny_test()
    Dim RW As Long, Data1 As Variant
    Dim intI As Integer

    RW = ThisWorkbook.Sheets("2008").Range("S65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("2008").Range("C5:D" & RW)
    For intI = 1 To UBound(Data1)
        If Data1(intI, 1) >= Sheets("stam").Range("timesedler_fradato") And Data1(intI, 1) <= Sheets("stam").Range("timesedler_tildato") Then
            ThisWorkbook.Sheets("2008").Cells.Range("A" & intI & ":T" & intI).Copy ThisWorkbook.Sheets("timesedler").Range("A" & intJ)
        End If
    Next intI
End Sub
Avatar billede kabbak Professor
02. november 2008 - 16:41 #1
Jeg har kikket på den sidste

Sub timesedler_hent_udfra_dato_ny_test()
    Dim RW As Long, Data1 As Variant
    Dim intI As Long, intJ As Long
    Dim Fra As Date, Til As Date
    Fra = Sheets("stam").Range("timesedler_fradato")
    Til = Sheets("stam").Range("timesedler_tildato")

    RW = ThisWorkbook.Sheets("2008").Range("S65536").End(xlUp).Row' ER DU SIKKER PÅ AT DER ER DATA I DENNE KOLLONNE "S"
    Data1 = ThisWorkbook.Sheets("2008").Range("C1:D" & RW)
   
    For intI = 5 To UBound(Data1)
        If Data1(intI, 1) >= Fra And Data1(intI, 1) <= Til Then
      intJ = ThisWorkbook.Sheets("timesedler").Range("A65536").End(xlUp).Row
            ThisWorkbook.Sheets("2008").Range("A" & intI & ":T" & intI).Copy ThisWorkbook.Sheets("timesedler").Range("A" & intJ)
        End If
    Next intI
End Sub
Avatar billede mrkr Juniormester
02. november 2008 - 18:50 #2
Jeg kan ikke rigtig få den til at virke.
Koden er meget hurtig men der bliver slet ikke hentet data ind i arket timesedler.


Jeg har rettet lidt i denne linje:
RW = ThisWorkbook.Sheets("2008").Range("C65536").End(xlUp).Row

Da der ALTID er data i denne kolonne. Men det har ikke hjulpet.
Avatar billede kabbak Professor
02. november 2008 - 18:58 #3
prøv lige at sende et eksempelark, så ser jeg på det.

kabbak snabela tiscali dot dk
Avatar billede kabbak Professor
02. november 2008 - 21:07 #4
Prøv denne, der må IKKE være data i sidste række på ark 2008, altså række 65536


Sub timesedler_hent_udfra_dato_ny_test()
    Dim RW As Long, Data1 As Variant
    Dim intI As Long, intJ As Long, Synlig As Boolean
    Dim Fra As Date, Til As Date
    Synlig = False
    If Application.DisplayStatusBar Then
        Synlig = True
    Else
        Synlig = False
        Application.DisplayStatusBar = True
    End If


    ThisWorkbook.Sheets("timesedler").Rows("4:65536").ClearContents, tømmer arket "timesedler" for gamle data
    Fra = Sheets("stam").Range("timesedler_fradato")
    Til = Sheets("stam").Range("timesedler_tildato")

    Application.ScreenUpdating = False
    Application.Calculation = xlManual

    RW = ThisWorkbook.Worksheets("2008").Range("C65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("2008").Range("C1:C" & RW)

    For intI = 2 To UBound(Data1)
        If Data1(intI, 1) > Til Then Exit For
        If Data1(intI, 1) >= Fra And Data1(intI, 1) <= Til Then
            intJ = ThisWorkbook.Sheets("timesedler").Range("B65536").End(xlUp).Row + 1
            ThisWorkbook.Sheets("2008").Range("A" & intI & ":T" & intI).Copy ThisWorkbook.Sheets("timesedler").Range("A" & intJ)
        End If

        Application.StatusBar = " Kikker på række " & intI & " af " & RW & " heraf kopieret " & intJ - 3
    Next
    Application.StatusBar = ""
    MsgBox "Færdig"
    If Not Synlig Then Application.DisplayStatusBar = False
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Avatar billede kabbak Professor
03. november 2008 - 09:26 #5
NB Datokolonnen skal være sorteret stigende
Avatar billede mrkr Juniormester
03. november 2008 - 20:08 #6
Så fik jeg tid til at se på sagerne.
Den henter fint tallene ind og fint lille detalje med statusbaren :-)
Men den tager for lang tid om at hente datane.

Den allerførste kode jeg lavede så ud som nedenfor anført.
Den er rimelig hurtig, men efter jeg har set hvor hurtig i har kunnet hente andre data ud, tænkte jeg at man kunne gøre det endnu bedre med arrays.
Men måske er det utopi.

Prøv evt. at teste denne kode for at se hastigheden.


Sub timesedler_hent_udfra_dato_oprindelig()
    Application.ScreenUpdating = False
   
    Dim intI As Integer
    Dim intJ As Integer
   
    Rows("5:500").Select
    Selection.Delete Shift:=xlUp

    Range("a1").Select
   
    intJ = 5
    Do Until (ThisWorkbook.Sheets("timesedler").Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If (ThisWorkbook.Sheets("2008").Cells.Range("C" & intI) >= ThisWorkbook.Sheets("stam").Cells.Range("timesedler_fradato") _
            And ThisWorkbook.Sheets("2008").Cells.Range("C" & intI) <= ThisWorkbook.Sheets("stam").Cells.Range("timesedler_tildato") _
            And ThisWorkbook.Sheets("2008").Cells.Range("D" & intI) = ThisWorkbook.Sheets("stam").Cells.Range("timesedler_init")) _
Then
            ThisWorkbook.Sheets("2008").Cells.Range("A" & intI & ":O" & intI).Copy ThisWorkbook.Sheets("timesedler").Range("A" & intJ)
            intJ = intJ + 1
        End If
    Next intI
End Sub
Avatar billede kabbak Professor
03. november 2008 - 22:19 #7
Ok skal vi lave konkurrence, test denne

Sub timesedler_hent_udfra_dato_ny_test2()
    Dim RW As Long, Data1 As Variant, Uddata() As Variant
    Dim intI As Long, intJ As Long
    Dim Fra As Date, Til As Date, X As Long
 

    ThisWorkbook.Sheets("timesedler").Rows("4:65536").ClearContents
    Fra = Sheets("stam").Range("timesedler_fradato")
    Til = Sheets("stam").Range("timesedler_tildato")

    Application.ScreenUpdating = False
    Application.Calculation = xlManual

    RW = ThisWorkbook.Worksheets("2008").Range("C65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("2008").Range("C1:C" & RW)

    For intI = 2 To UBound(Data1)
        If Data1(intI, 1) > Til Then Exit For
        If Data1(intI, 1) >= Fra And Data1(intI, 1) <= Til Then
          ReDim Preserve Uddata(X)
          Uddata(X) = ThisWorkbook.Sheets("2008").Range("A" & intI & ":T" & intI)
          X = X + 1
        End If

    Next
    For i = 0 To X - 1
    ThisWorkbook.Sheets("timesedler").Range("A" & i + 4 & ":T" & i + 4) = Uddata(i)
    Next
   
    MsgBox "Færdig"
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Avatar billede mrkr Juniormester
03. november 2008 - 22:30 #8
Den virker rigtig godt.
Den er noget hurtigere end min oprindelige kode.
Så du vinder :-D

Mange tak for indsatsen.

Nu mangler vi bare at afregne :-)
Avatar billede kabbak Professor
03. november 2008 - 22:35 #9
et svar ;-))
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