21. juli 2011 - 15:54Der 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:
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?
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 ?
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)
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?
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 ?
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...
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 ??
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
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.
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å :-)
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
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
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.
Den virker perfekt. Den var ved at gå mig på nerverne. så godt at den kunne standses. God sommer.
Venlig hilsen Frank
Synes godt om
Ny brugerNybegynder
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.