Avatar billede kgndksv Juniormester
21. oktober 2009 - 14:04 Der er 14 kommentarer og
1 løsning

Kan jeg bruge en anden kommando for at gøre koden hurtigere? Evt SELECT CASE??

Sub Headcount()

If Not Selection.Value = "MANDAG" Xor Selection.Value = "TIRSDAG" Xor Selection.Value = "ONSDAG" Xor Selection.Value = "TORSDAG" Xor Selection.Value = "FREDAG" Xor Selection.Value = "LØRDAG" Xor Selection.Value = "SØNDAG" Then
Exit Sub
Call nytark
Else

If Selection.Value = "MANDAG" Then
Call Mandag
Else

If Selection.Value = "TIRSDAG" Then
Call Tirsdag
Else

If Selection.Value = "ONSDAG" Then
Call Onsdag
Else

If Selection.Value = "TORSDAG" Then
Call Torsdag
Else

If Selection.Value = "FREDAG" Then
Call Fredag
Else

If Selection.Value = "LØRDAG" Then
Call Lørdag
Else

If Selection.Value = "SØNDAG" Then
Call Søndag

End If
End If
End If
End If
End If
End If
End If
End If

Worksheets("Headcount").Activate
Call SkjulRk
Columns("D:S").EntireColumn.Hidden = False
End Sub
Avatar billede tjacob Juniormester
21. oktober 2009 - 14:21 #1
Du er godt klar over at Call nytark ALDRIG sker? Den skal stå FØR Exit Sub hvis den skal eksekveres.

Jeg er ikke sikker på at denne kode er hurtigere, men den er da noget kortere:

Select Case Selection.Value
        Case "MANDAG"
            Call Mandag
        Case "TIRSDAG"
            Call Tirsdag
        Case "ONSDAG"
            Call Onsdag
        Case "TORSDAG"
            Call Torsdag
        Case "FREDAG"
            Call Fredag
        Case "LØRDAG"
            Call Lørdag
        Case "SØNDAG"
            Call Søndag
        Case Else
            EVT: Call nytark
            Exit Sub
    End Select
    Worksheets("Headcount").Activate
    Call SkjulRk
    Columns("D:S").EntireColumn.Hidden = False
Avatar billede martin_moth Mester
21. oktober 2009 - 14:22 #2
Jo, det er helt oplagt med Select case

Select case Selection.Value
case "MANDAG"
  call Mandag
case  "TIRSDAG"
  call Tirsdag
... osv

Case else
  exit sub
End select

Jeg ville undgå ÆØÅ i min kode!
Avatar billede martin_moth Mester
21. oktober 2009 - 14:23 #3
for langsom... :-(
Avatar billede martin_moth Mester
21. oktober 2009 - 14:23 #4
tjacob: hvordan skriver du en del af dit svar som kode
Avatar billede tjacob Juniormester
21. oktober 2009 - 14:31 #5
Med div tag sådan:

hvor rund parentes erstattes med kantet parentes:

(div)tekst(/div)
Avatar billede tjacob Juniormester
21. oktober 2009 - 14:33 #6
Der er i øvrigt lige lavet en guide: http://www.eksperten.dk/guide/1325
Avatar billede kgndksv Juniormester
21. oktober 2009 - 15:53 #7
Arhh.. det forklare et andet spørgsmål... Ja... Jeg er temmelig begrænset i VBA... :-) sender du et svar tjacob :-)


Forresten vil det sige at jeg ikke kan få denne kode til at køre særlig meget hurtigere som den ser ud...?
Avatar billede Slettet bruger
21. oktober 2009 - 16:02 #8
Den kode, vi har set, eksekverer hurtigt (Jeg vil skyde på nogle få ms).
Hvis du har problemer med, at din applikation er langsom, må du poste noget mere kode og evt. udskrive nogle timestamps for at finde ud af, hvilken funktion, der er problemer med.

/1
Avatar billede tjacob Juniormester
21. oktober 2009 - 16:16 #9
Svar kommer her......

MHT hastigheden: Det er som kvadratrodenaf1 siger. Hvis det er noget der tager tid, så er det fordi din kode gennemløber mange tusinde celler.

En af de ting der bl.a. tager tid er opdatering af skærmen, så det er en god ide at du i dine subs/funktioner starter koden med:
Application.ScreenUpdating = False
og slutter den med:
Application.ScreenUpdating = True

Hvis ikke du har det allerede, kan det afkorte tiden noget. Du kunne f.eks. sætte det ind i ovennævnte sub. Så behøver du ikke gøre det i alle "Undersubs" (Mandag, Tirsdag osv) medmindre de også bliver kaldt andre steder.
Avatar billede Slettet bruger
21. oktober 2009 - 16:40 #10
Hvis du laver mange celleopdateringer, er det et must at slå formel opdatering fra under kørsel:
Application.Calculation = xlCalculationManual

Og slå udregningen til efter kørsel:
Application.Calculation = xlCalculationAutomatic

/1
Avatar billede martin_moth Mester
21. oktober 2009 - 20:41 #11
evt. også slå skærmopdatering fra

application.screenupdate = false

(og true igen efter kørt kode)
Avatar billede martin_moth Mester
21. oktober 2009 - 20:42 #12
Det kan faktisk betyde en hel del for hastigheden (screenupdate, altså)
Avatar billede kgndksv Juniormester
21. oktober 2009 - 22:45 #13
Tusind tak for hjælpen begge to...

Håber det er ok jeg deler pointene mellem jer...

Det var egentlig en forglemmelse at jeg ikke havde deaktiveret application.screenupdate, og jeg kan også se at koden ikke køre så hurtigt efter jeg har prøvet at køre den på min egen PC, det er nok en meget langsom computer jeg har arbejdet på på skolen...!! med deaktiveret screenupdate køres den på et splitsekund på min egen PC :-)

Men hvad er timestamps??
Avatar billede Slettet bruger
22. oktober 2009 - 09:32 #14
Det er en representation af tid - Now() funktionen returnerer et timestamp.

Du kan bruge det til at måle, hvor lang tid, hver funktion tager:

Debug.Print Now 'Udskriver timestamp
Application.Wait Now + 1 / 24 / 60 / 60 'Venter 1 sekund
Debug.Print Now 'Udskriver timestamp

For at se hvad der er blevet udskrevet skal du åbne Immediate window (Ctrl + G)
Avatar billede tjacob Juniormester
22. oktober 2009 - 10:10 #15
Du kan nok ikke bruge Now() til at lave tidsmålinger på subs/funktioner, da den har en opløsning på 1 sekund.

Du kan i stedet bruge en simpel API-funktion kaldet GetTickCount.

Øverst i et modul (uden for subs) placerer du linien:
Public Declare Function GetTickCount Lib "kernel32" () As Long

Nu kan du hvorsomhelst i din kode bruge:

Eksempel:

dim StartTid as long, TidGået as long

StartTid = GetTickCount

-KODEN HER

Tidgået = GetTickCount - Starttid

Nu har den forbrugte tid i millisekunder.
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
Kurser inden for grundlæggende programmering

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