Avatar billede xane Nybegynder
29. marts 2009 - 20:29 Der er 3 kommentarer og
1 løsning

Optimering af For-sætning

Hej Eksperter

Jeg har nedenstående kode, som jeg vil hører om man ikke kan optimere. Synes det tager lidt lang tid for pc'en at regne. (1-2 sek.)

Application.ScreenUpdating = False

Dim ws_BSimData, ws_Temp, ws_Settings As Worksheet
Dim rngC, rng1 As Range
Dim TempData, WorkingWeek, WorkingYear, TempData_Week, TempData_Days, TempData_Time As Range
Dim TempDataWork(8760, 1), TempWork() As Double
Dim Y, X, Z, S, i As Long

' Temperature calculations
Set ws_BSimData = ActiveWorkbook.Worksheets("BSim-data")
Set ws_Temp = ActiveWorkbook.Worksheets("Results_Temp")
Set ws_Settings = ActiveWorkbook.Worksheets("Settings")

Set TempData = ws_BSimData.Range("BSim_Top")
Set TempData_Days = ws_BSimData.Range("A2:A8761")
Set TempData_Time = ws_BSimData.Range("F2:F8761")
Set TempData_Week = ws_BSimData.Range("B2:B8761")

Set WorkingWeek = ws_Settings.Range("A2:Y9")
Set WorkingYear = ws_Settings.Range("A13:BA14")

S = 0


For Z = 1 To 8760
    For i = 1 To 53
        If WorkingYear(1, i) = TempData_Week(Z, 1) Then
            If WorkingYear(2, i) = "x" Then
                For X = 2 To 8
                    If WorkingWeek(X, 1) = TempData_Days(Z, 1) Then
                        For Y = 2 To 25
                            If WorkingWeek(1, Y) = TempData_Time(Z, 1) Then
                                If WorkingWeek(X, Y) = "x" Then
                                    S = S + 1
                                    TempDataWork(S, 1) = TempData(Z, 1)
                                End If
                            End If
                        Next
                    End If
                Next
            End If
        End If
    Next
Next

S = S + 1
   
ws_Temp.Range("D1:E8761").ClearContents
ws_Temp.Range("D2").Resize(S, 1) = TempDataWork

Er der ikke en måde man kan optimere disse løkker.

Sig endelig til hvis I har brug for noget mere forklaring.
Avatar billede kabbak Professor
29. marts 2009 - 22:08 #1
Måske, det kommer an på om der er flere værdier, der skal findes, ellers kan du hoppe ud af løkkerne

For Z = 1 To 8760
        For i = 1 To 53
            If WorkingYear(1, i) = TempData_Week(Z, 1) And WorkingYear(2, i) = "x" Then

                For X = 2 To 8
                    If WorkingWeek(X, 1) = TempData_Days(Z, 1) Then

                        For Y = 2 To 25

                            If WorkingWeek(1, Y) = TempData_Time(Z, 1) And WorkingWeek(X, Y) = "x" Then
                                S = S + 1
                                TempDataWork(S, 1) = TempData(Z, 1)
                                ' hvis den kun skal finde en unik værdi, kan du hoppe ud af loop med Exit For
                                'Exit For
                            End If

                        Next Y
                        ' Exit For
                    End If
                Next X
                Exit For
            End If
        Next i
    Next Z
Avatar billede xane Nybegynder
30. marts 2009 - 13:11 #2
Hej Kabbak

Mange tak for det svar. Prøver det lige af i aften om det virker. Så må jeg se om den er blevet hurtigere :-)
Avatar billede xane Nybegynder
05. april 2009 - 14:28 #3
Hej Kabbak

Det hjalp en lille smule, dog ikke helt så meget som jeg have håbet. Du kan ikke komme på en nemmere måde for mig, hvordan jeg kan løbe igennem alle disse værdier og dermed spare tid?

Ellers må du jo smide et svar så du kan få dine point.

mvh
Xane
Avatar billede kabbak Professor
05. april 2009 - 14:49 #4
Hvis du kun skal finde 1n bestemt værdi, så fjern ' foran alle  'Exit For
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