15. maj 2004 - 14:39Der er
26 kommentarer og 1 løsning
Fejl ved Workbook_Open
Jeg har et ark som indeholder makroer som køre automatisk med 30 min. mellemrum hele døgnet. Jeg gerne vil have at arket køre mere end een dag ad gangen. Derfor har jeg indsat:
Call Workbook_Open
lige inden 'end sub' i Workbook_Open.
Problemet er at nu fejler arket når det åbnes:
Run-time error '28': Out of stack space
Nogen bud på hvordan jeg kommer af med dette problem ?
Public RunWhen As Double Public Const cRunWhat = "Proc"
Sub StartProc() RunWhen = Now + TimeSerial(0, 30, 0) Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _ schedule:=True
End Sub
Sub Proc() ' din kode der skal køre hver halve time
Call StartProc ' starter en ny igen, om en halv time End Sub
Sub StopTimer() 'Her stoppes den automatiske makro, hvis det er nødvendig On Error Resume Next Application.OnTime earliesttime:=RunWhen, _ procedure:=cRunWhat, schedule:=False End Sub
LIdt mere forklaring: Jeg har en makro som jeg kører 24 gange i døgenet via Application.OnTime osv. i 'ThisWorkbook'
når jeg åbner arket kører makroen 24 gange - og så stopper den. Derfor har jeg (jfr http://www.eksperten.dk/spm/312783) indsat 'call Workbook_Open' inden End Sub i ThisWorkbook. Ups.... Jeg kan nu se at jeg måske skal indsætte det i den makro som jeg kalder og ikke i ThisWorkbook.
jeg har prøvet at lave en test med RunWhen og det virker når jeg kun har een makro som jeg gerne vil køre. Men problemet er lidt at det drejer sig om flere makroer som skal køre på forsklellige tidspunkter. Et par af dem skal kun køre 1-2 gange i døgnet på FASTE tidspunkter og et par andre hver halve time. Det er vigtigt at de køre på faste klokkeslet hver dag.
i This Workbook er meget overskuelig og præcis (selv om det er mange linier). Er det overhovdet muligt at gøre det på den måde eller skal jeg opgive og bruge RunWhen osv. ?
En ide... Opret et ekstra ark hvor du laver hele køreplanen med makronavn i kolonne A og kørselstidspunkt i kolonne B. Sorter efter kørselstidspunkt.
Brug så en makro som denne
Public Række as Long 'husk at få denne linie med
Sub ScheduleNext() rk = ThisWorkbook.Sheets("Ark1").Range("A1").End(xlDown).Row If rk = række Then række = 1 Else række = række + 1 makro = ThisWorkbook.Sheets("Ark1").Range("A" & række).Value tid = ThisWorkbook.Sheets("Ark1").Range("B" & række).Text Application.OnTime tid, makro End Sub
i bunden af de makroer du nu vil kalde indsætter du så denne linie
ScheduleNext
Nu vil hver makro på arket blive kørt på det kørselstidspunkt du har angivet og når den sidste er kørt startes automatisk forfra.
I ThisWorkBook kan du sætte denne sub for at starte på næstkommende tidspunkt:
Private Sub Workbook_Open() Dim x, y As Long ' find NU-tidspunkt x = Now() - Date 'gå skemaet igennem og find den næste/første tid, der skal køres en makro With ThisWorkbook.Sheets("Ark1") For y = 1 To .Range("A1").End(xlDown).Row If x <= .Range("B" & y) Then Række = y 'sæt 1. tid og makro ScheduleNext Exit Sub End If Next End With End Sub
I et almindeligt modul indsætter du så denne:
Sub ScheduleNext() Dim rk As Long, Makro As String, Tid With ThisWorkbook.Sheets("Ark1") rk = .Range("A1").End(xlDown).Row If rk = Række Then Række = 1 Else Række = Række + 1 Makro = .Range("A" & Række).Value Tid = .Range("B" & Række).Text End With Application.OnTime Tid, Makro End Sub
hvis du giver en email-adr sender jeg et eksempel.
der skal lige byttes to linier for at det skal være helt korrekt
Sub ScheduleNext() Dim rk As Long, Makro As String, Tid With ThisWorkbook.Sheets("Ark1") rk = .Range("A1").End(xlDown).Row Makro = .Range("A" & Række).Value Tid = .Range("B" & Række).Text Application.OnTime Tid, Makro If rk = Række Then Række = 1 Else Række = Række + 1 End With 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.