02. november 2008 - 16:04Der 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?
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
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
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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")
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
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
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")
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
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.