Avatar billede TUFexcel Juniormester
21. juli 2011 - 15:54 Der er 23 kommentarer og
1 løsning

Sæt makro igang når og hvis..

Hejsa

Jeg har et problem jeg tumler en del med. Jeg får data ind fra internettet. På forskellige tidspunkter, igennem 8 timer skal en makro gå igang og udføre en opgave. Der har jeg brugt denne simple  makro:

Application.OnTime TimeValue("12:00:00"), "Makro1" '
Application.OnTime TimeValue("12:10:00"), "Makro1" '

Problemet med den er at når man først har sat den igang, er den ikke til at stoppe igen(og den kører som sagt 8 timer), derfor fik jeg den ide at dele den op i 8 tidsmakro. Så er problemet da det mindre, hvis man af den ene eller anden grund vil stoppe.
så fik jeg den ide at lade en anden makro starte disse tidsmakroer. Så hvis A1 =1, kør Makrokl9; hvis A2 = 1, kør Makrokl10 osv. De her 1 taller fremkommer ved en kombination af HVIS formler og NU, således at de står på skærmen ca 5 sekunder, og skulle så trigge tidsmakroerne en efter en. Ved at google har jeg fundet frem til denne kode:

Sub Kørmakro()
If Range("A2").Value = 1 Then
Call Makrokl10
Else
Exit Sub
End If
End Sub

Men der sker ingenting. Jeg er kommet frem til at den kun virker hvis A2 =1 når den sættes igang. Den skal sættes igang NÅR (og hvis) A2 = 1

Det her er bare en måde at få en tidsmakro til at stoppe. Hvis der er andre måder så er de også velkomne.
Nogen der er skrappe til det har?
Avatar billede Ialocin Novice
22. juli 2011 - 00:21 #1
Hej TUFexcel

Jeg er ikke sikker på, at jeg er helt med på din indledende forklaring ?

Det korte af det lange er det ikke, at du søger en måde at stoppe din OnTime makro ?? ... Hvis JA, må det så være ved hjælp af en stopknap på Excel arket ?


Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
22. juli 2011 - 01:21 #2
Hej TUFexcel

Jeg har lavet en lille test ... Hvor min Ontime starter 5 sekunder efter jeg har åbnet min workbook - herefter fylder den så cellerne i kolonne A med tallene fra 1 til "indtil jeg stopper den" med stop knappen ... Og det fungerer.
Jeg har også lavet en start knap, som starter tælleriet fra hvor jeg stoppede :o)


Det jeg har gjort er:


I min Excelfil´s VBA editor har jeg oprettet et modul, hvori jeg har min Ontime procedure.

Koden ser således ud i mit modul:

---------

'offentlig variabel til OnTime funktionens starttidspunkt
'Variablen tilgåes fra hele workbook´en.
Public starttid As Date

'OnTime procedure
Sub OntimeTid()

'set starttid = tiden nu + 5 sekunder
starttid = Now + TimeValue("00:00:05")

'når de 5 sekunder er gået .... kald det DU ønsker
Application.OnTime starttid, ".. din egen makro .."
   
End Sub

----------

Grunden til, at Ontime metodens start tidspunkt placeres i en variabel (starttid) er den, at variablen er et statisk navn, hvilket gør, at Excel kan finde ud af, at det netop er denne OnTime metode der skal handles på ..... modsat en OnTime metode, hvor start tidspunktet eksempelvis er tiden Now, som er  en dynamisk/generel størrelse!!

OnTime proceduren kaldes når min workbook åbnes ... men den kan i princippet kaldes, hvorfra man lyster ??


På mit Excel ark har jeg oprettet 2 knapper.
En stop knap, som stopper OnTime proceduren i mit modul. .... og en start knap, som starter OnTime proceduren igen.


'Stop knap
Private Sub cmdStopOntime_Click()

  Application.OnTime starttid, "OntimeTid", , False

End Sub


** Trick´et i forhold til at stoppe Ontime metoden er det sidste argument, som skal være sat til False  (default er True)



'Start knap
Private Sub cmdStartOntime_Click()
 
  Application.OnTime starttid, "OntimeTid", , True

End Sub



Håber det gi´r mening ?
Ellers lad høre ....

Med venlig hilsen, Nicolai
Avatar billede finb Ekspert
22. juli 2011 - 09:12 #3
ser med...
Avatar billede TUFexcel Juniormester
22. juli 2011 - 14:03 #4
Hej lalocin

Ja, alt hvad jeg ønsker er at være i stand til at stoppe en makro der kører på tid. Specielt når den kører over så lang tid, er det ret enerverende,hvis man bliver nødt til at trække strømmen for at få uhyret til at stoppe!

Hvad angår VBA er jeg ret så grøn, så der er sikkert noget at det fundamentale jeg ikke forstår, bl.a hvor koder skal placeres.
Hvis jeg har fundet noget på nettet, f.eks ontime koden, har jeg bare startet og slukket makrooptageren, og gået ind og sat koden ind der.
Pt. læser jeg en bog om emnet, og jeg kan forstå at der er forskellige steder koder skal sættes ind.

Det jeg ønsker at Ontime skal gå igang hvert hele kvarter.
Kl. 9:00 Kl. 9:15 og så fremdeles til kl 1700. Så den første kode du skrev forstår jeg ikke rigtigt, og er heller ikke det jeg vil. Den anden del, den med stop knappen ku' være interessant. Virker den kun hvis man bruger den første kode?

Hvis vi nu siger at jeg har denne her kode:

Sub Tid()
Application.OnTime TimeValue("09:00:00"), "Makro1" '
Application.OnTime TimeValue("09:15:00"), "Makro1" '
Application.OnTime TimeValue("09:30:00"), "Makro1" '
Application.OnTime TimeValue("09:45:00"), "Makro1" '

End Sub

Hvis jeg kl. 9:13 ønsker at stoppe, hvordan gør jeg så. Og hvor placeres koden?
Avatar billede Ialocin Novice
22. juli 2011 - 14:59 #5
Hej TUFexcel

Jeg sidder på telefonen p.t.  ... Så jeg kigger lige på det senere.

Med venlig hilsen, Nicol
Avatar billede Ialocin Novice
22. juli 2011 - 16:27 #6
Hej TUFexcel

Sidder stadig på telefonen ... Men har lige lidt indledende spørgsmål:

Hvordan kalder/starter du din Subtid() ?
Hvad gør Makro1 ... Bare ganske kort ?

Med venlig hilsen Nicolai
Avatar billede TUFexcel Juniormester
22. juli 2011 - 17:23 #7
Hej lalocin

Jamen der går jeg bare op i udvikler/makroer og starter den der.
Nogle gange laver jeg en makroknap når jeg har en kode jeg bruger ofte.

Makro 1 kopier kurser som kommer ind på mit ark fra internettet, og laver dermed en kursliste, der vokser som dagen skrider frem.

Venlig hilsen Frank
Avatar billede Ialocin Novice
22. juli 2011 - 18:35 #8
Hej Frank
Er dit regneark altid åben ... Eller åbner du det hver morgen, hvorefter du starter din makro ?
Jeg tænker her om din makro ikke bare skulle starte, når du åbnede dit ark ?

Med venlig hilsen, Nicolai
Avatar billede TUFexcel Juniormester
22. juli 2011 - 19:28 #9
Hej lalocin

Nej det er ikke så godt, da jeg først skal foretage nogle indledende øvelser. Anyway, der er ikke meget arbejde i at trykke på en knap.
Ontime koden kan jeg egentlig godt li, den er simpel og er der til tiden, så at sige..Eneste problem er at den er ikke sådan er til at stoppe...
Avatar billede Ialocin Novice
22. juli 2011 - 20:20 #10
Hej Frank

Super ... Jeg kigger på det i aften ... Du hører nærmere :ò)

Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
22. juli 2011 - 22:21 #11
Hej Frank

Tror ikke vi kommer udenom at skulle benytte lidt VBA kode.
Men det kigger vi på :o)

Kunne du evt. sende din makro kode ? ... så skal jeg forsøge, at lave de procedurer der skal til.


Med venlig hilsen, Nicolai
Avatar billede TUFexcel Juniormester
22. juli 2011 - 23:28 #12
Mener du makro 1? Det er bare en banal procedure jeg selv har optaget.
Avatar billede TUFexcel Juniormester
22. juli 2011 - 23:39 #13
Hvis ja, så er den her:


Sub Makro1()
'
' Makro1 Makro
'

    Sheets("Ark2").Select
    Range("X15:HZ15").Select
    Selection.Copy
    Range("X17").Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Range("X17:HZ196").Select
    Application.CutCopyMode = False
    Selection.Cut
    Range("X18").Select
    ActiveSheet.Paste
    Selection.Copy
   
    Range("IC18").Select
    ActiveSheet.Paste
    Sheets("Ark1").Select
    ActiveWorkbook.Save
End Sub '
Avatar billede Ialocin Novice
23. juli 2011 - 00:30 #14
Hej Frank

Mange tak.

Og så lige et sidste spørgsmål inden dynen kalder :o)

Din makro køres hvert kvarter ... Skal det forståes således, at hvis du aktiverer Ontime funktionen mellem to tidsintervaller, så skal makroen først køres igen når næste tidsinterval nåes ... og ikke her og nu ??

Eksempel: 
Du aktiverer funktionen kl. 09:01:00 ... så køres makroen først kl. 09:15:00  ?? ... og ikke kl. 09:01:00

Og det samme, hvis du aktiverer funktionen før kl. 09:00:00 og igen efter kl. 17:00:00 ??

Med venlig hilsen, Nicolai
Avatar billede TUFexcel Juniormester
23. juli 2011 - 01:33 #15
Hej igen

Ja det er ved at blive sent.

Det sker jo helt af sig selv, det er sådan at de virker. Hvis jeg sætter den igang kl 09:01 kører den først kl 09.15. Kommer man for sent, ja så er det tog kørt. hvis jeg aktivere før kl 09:00, starter den kl 09:00: Efter kl 17.00 ved jeg ikke, eftersom at dagen er gået og der derfor ikke er nogen point i  at starte den der. Jeg har mulighed for at downloade historiske data helt op til det nuværende tidspunkt, så det er ikke det store problem hvis jeg først kommer ind efter kl 09:00

det bliver spændende at se hvad du når frem til

Hilsen Frank
Avatar billede Ialocin Novice
23. juli 2011 - 02:21 #16
Hej Frank

Yes .. vi må se hvad jeg kommer op med.
Jeg er først tilbage i morgen aften ... håber det er ok ?


Med venlig hilsen, Nicolai
Avatar billede TUFexcel Juniormester
23. juli 2011 - 11:28 #17
Hej lalocin

Ja, selvfølgelig. Tag din tid. Spørgsmålet er reserveret til dig.

Hilsen Frank
Avatar billede Ialocin Novice
24. juli 2011 - 11:46 #18
Hej Frank

Bedre sent end aldrig :o)

Jeg har ikke glemt dig ... men der kom noget i vejen i aftes.

Kigger på det senere i dag.

Med venlig hilsen, Nicolai
Avatar billede anlu Nybegynder
24. juli 2011 - 20:04 #19
Kan du ikke bare bruge Ctrl+Break for at stoppe din makro?
Avatar billede TUFexcel Juniormester
24. juli 2011 - 22:36 #20
Nix, det virker ikke. ja, det vil sige den stopper midlertidig, men er ikke endegyldig standset. Hvis man har en stak ontime tidspunkter og aktiverer makroen, så ønsker den at køre bunken igennem.
Avatar billede anlu Nybegynder
24. juli 2011 - 23:26 #21
Ja, det pauser eksekveringen, og så kan du jo stoppe den, men jeg har ikke sat mig grundigt ind i hvad det er du vil opnå, så jeg håber på at Nicolai finder en løsning til dig, så :-)
Avatar billede Ialocin Novice
25. juli 2011 - 22:31 #22
Hej Frank

Har du evt. en mail adresse, udover den her på Eksperten ?
Så vil jeg poste dig lidt vedhæftede vejledninger sammen med 1. Version af koden.

Og beklager min manglende onlinehed ... Men jeg sidder i et sommerhus på Djursland, sammen med familien ... Indtil på lørdag :o)
Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
30. juli 2011 - 23:17 #23
Hej Frank

Godt at høre, at det fungerer ... Hermed et "svar" fra mig :o)

For go´ ordens skyld, så kommer her de koder, som jeg har postet til dig.


I et modul har jeg oprettet 4 public variabler, som kan tilgåes fra hele workbook´en.


Public start As Date    'til OnTime start
Public starttid As Date 'til OnTime starttid
Public onstart As Boolean 'holder styr på om ontime Start er aktiveret/deaktiveret ?
Public onstarttid As Boolean 'holder styr på om ontime Starttid er aktiveret/deaktiveret ?


Følgende procedure er oprettet i samme modul som variablerne.
Proceduren kalder sig selv hvert kvarter (minuttal: 15, 30, 45 og 00, som startknappen styrer) via Ontime funktionen .... Din kode (Makro1) kaldes ligeså, da den også indgår i proceduren.
Kl. 17.00 kalder Ontime funktionen proceduren for sidste gang, da ontime funktionen stoppes ved næste interval kl. 17.15.



Sub Tid()

    'hvis ontime funktionen start er aktiveret
    If onstart = True Then
   
        'set variablen onstart = false, så stopknappen ved at ontime funktionen start er deaktiveret
        onstart = False
   
        'Indsæt den kode/det kald der ønskes udført for hvert interval ... herunder
        Module1.Makro1
       
             
        'set variable starttid = tiden nu + 15 minutter
        'hvilket gør, at funktionen kalder sig selv igen efter 15 minutter
        starttid = Time + TimeSerial(0, 15, 0)
       
        'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
        Application.Ontime Format(starttid, "hh:mm"), "Tid"
       
               
    'ellers er ontime funktionen starttid aktiveret
    Else
       
       
        'set variablen onstarttid = true, så stopknappen ved at ontime funktionen starttid er aktiveret
        onstarttid = True
       
        'Indsæt den kode/det kald der ønskes udført for hvert interval ... herunder
        Module1.Makro1
        'set variable starttid = tiden nu + 15 minutter
        'hvilket gør, at funktionen kalder sig selv igen efter 15 minutter
        starttid = Time + TimeSerial(0, 15, 0)
       
        'hvis den aktuelle systemtid er >= tidspunktet for sidste kald
        If Time >= TimeValue("17:15:00") Then
           
            'set variablen onstarttid = false, så stopknappen ved at ontime funktionen starttid er deaktiveret
            onstarttid = False
        End If
       
       
        'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
        '... og kald sidste gang kl. "17:15:00", hvorefter ontime funktionen stoppes
        Application.Ontime Format(starttid, "hh:mm"), "Tid", TimeValue("17:15:00")
       
       
  End If
   
End Sub



Start knappen.
Start knappen spø´r på, hvornår der er klikket start i forhold til den aktuelle systemtid ??

Hvis der er klikket start efter kl. 17.00, så skal der ikke ske noget!

Hvis der er klikket start før klokken 09.00, kaldes din makro kl. 9 og efterfølgende hvert kvarter indtil kl. 17.00.

Hvis der er klikket start efter klokken 09.00, tjekker koden minuttallet for klikket.
Er der klikket mellem minuttallet 1-15, kaldes din makro på minuttallet 15 og efterfølgende hvert kvarter indtil kl. 17.00.

Er der klikket mellem minuttallet 16-30, kaldes din makro på minuttallet 30 og efterfølgende hvert kvarter indtil kl. 17.00

Er der klikket mellem minuttallet 31-45, kaldes din makro på minuttallet 45 og efterfølgende hvert kvarter indtil kl. 17.00

Er der klikket mellem minuttallet 46-59, kaldes din makro på minuttallet 00 og efterfølgende hvert kvarter indtil kl. 17.00

Start knappen har følgende kode:

Private Sub cmdStartMakro_Click()

Dim nu As Date          'tiden nu
Dim h As Integer        'timen
Dim m As Integer        'minuttet
Dim rminut As Integer  'tiden i minutter til næste interval


    'set den aktuelle systemtid nu
    nu = Time
   
    'udled time og minut ud af den aktuelle systemtid
    h = Hour(nu)
    m = Minute(nu)
     
     
    'hvis der ikke allerede er klikket på cmdStartMakro
    If onstart = False Then
     
 
            'vælg handling ud fra hvornår der er klikket start i forhold
            'til den aktuelle systemtid (nu)
            Select Case nu
       
       
                'hvis der klikkes start efter klokken 17.00
                Case Is > Format(TimeValue("17:00:00"))
               
                    'Meddelelse til brugeren om, at Makroen holder fyraften
                    MsgBox "Makroen holder fri indtil imorgen kl. 09.00", vbInformation
                 
                 
                 
                'hvis der klikkes start før klokken 09.00
                Case Is <= Format(TimeValue("09:00:00"))

                    'set start = det ønskede start tidspunkt
                    start = TimeValue("09:00:00")
               
                  'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                  Application.Ontime Format(start, "hh:mm"), "Tid"
                                   
                  'set variablen onstart = true
                  'så stop knappen ved, at Ontime start er aktiv
                  onstart = True
               
               
               
                'hvis der klikkes start efter klokken 09:00
                Case Is > Format(TimeValue("09:00:00"))
               
                    'vælg handling ud fra i hvilket minut der er klikket start
                    Select Case m
               
                               
                        'minuttal fra 1 til 15 ... starter ontime funktionen på minuttallet 15
                        Case 1 To 15
               
                            'set variablen rminut = minuttet 15 - det aktuelle minuttal (tiden til næste interval (15))
                            rminut = 15 - m
               
                            'set variablen start = tidspunktet NU + tiden til næste interval (15)
                            start = Time + TimeSerial(0, rminut, 0)
                           
                           
                            'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                            Application.Ontime Format(start, "hh:mm"), "Tid"
               
                           
                            'set ontime variabel onstart = true
                            onstart = True
               
               
               
                        'minuttal fra 16 til 30 ... starter ontime funktionen på minuttallet 30
                        Case 16 To 30
               
                            'set variablen rminut = minuttet 30 - det aktuelle minuttal (tiden til næste interval (30))
                            rminut = 30 - m
               
                            'set variablen start = tidspunktet NU + tiden til næste interval (30)
                            start = Time + TimeSerial(0, rminut, 0)
                           
                            'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                            Application.Ontime Format(start, "hh:mm"), "Tid"
                                           
                           
                            'set ontime variabel onstart = true
                            onstart = True
               
               
               
                        'minuttal fra 31 til 45 ... starter ontime funktionen på minuttallet 45
                        Case 31 To 45
               
                            'set variablen rminut = minuttet 45 - det aktuelle minuttal (tiden til næste interval (45))
                            rminut = 45 - m
               
                            'set variablen start = tidspunktet NU + tiden til næste interval (45)
                            start = Time + TimeSerial(0, rminut, 0)
               
                            'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                            Application.Ontime Format(start, "hh:mm"), "Tid"
               
                                           
                            'set ontime variabel onstart = true
                            onstart = True
               
               
               
                        'minuttal fra 46 til 59 + 1 ... starter ontime funktionen på minuttallet 59 + 1
                        Case 46 To 59
               
                            'set variablen rminut = minuttet 59 - det aktuelle minuttal + 1 (tiden til næste interval (00))
                            rminut = 59 - m + 1
               
               
                            'set variablen start = tidspunktet NU + tiden til næste interval (00)
                            start = Time + TimeSerial(0, rminut, 0)
               
                            'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                            Application.Ontime Format(start, "hh:mm"), "Tid"
                               
                           
                            'set ontime variabel onstart = true
                            onstart = True
             
               
               
                        'minuttallet 00 ... starter ontime funktionen på minuttallet 00
                        Case Else
       
                            'set variablen start = tidspunktet NU
                            start = Time
                                         
                            'kald proceduren Tid() i module1 når det ønskede start tidspunkt nåes
                            Application.Ontime Format(start, "hh:mm"), "Tid"
               
               
                            'set ontime variabel onstart = true
                            onstart = True
             
       
               
                    End Select
           
             
                   
                   
                End Select
               
                       
    End If
End Sub



Stop knappen
Stop koden stopper den aktuelle Ontime funktion.
Hvis/når der er klikkes start igen .... køres hele start proceduren igennem igen .... alt efter det aktuelle tidspunkt ??
Ligger starttidspunktet efter klokken 09.00 og før klokken 17.00 kaldes din makro ved næste kvarter-minuttal (15, 30, 45 eller 00)


Stop knappens kode:


Private Sub cmdStopMakro_Click()

    'hvis ontime variabel = true (Ontime "Tid" er aktiveret!)
    If onstart = True Then

        'Stop Ontime funktionen "Tid"
        Application.Ontime Format(start, "hh:mm"), "Tid", , False
       
        'set ontime variabel = false (ontime "Tid" deaktiveret!)
        onstart = False
       
    End If
   
   
    'hvis ontime variabel = true (Ontime "Tid" er aktiveret!)
    If onstarttid = True Then

        'Stop Ontime funktionen "Tid"
        Application.Ontime Format(starttid, "hh:mm"), "Tid", , False
       
        'set ontime variabel = false (ontime "Tid" deaktiveret!)
        onstarttid = False
       
    End If
End Sub



Der er kun det men ... at går pc´en i dvale .. gør OnTime funktionen det også ... dog fortsætter funktionen fra den aktuelle systemtid, hvor pc´en vækkes igen.


Med venlig hilsen, Nicolai
Avatar billede TUFexcel Juniormester
31. juli 2011 - 19:10 #24
Tak Nicolai

Den virker perfekt. Den var ved at gå mig på nerverne. så godt at den kunne standses.
God sommer.

Venlig hilsen Frank
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