2016-06-25 3 views
0

Ich habe ein Makro, das einige Informationen aus dem Internet herunterlädt und ich muss es zu einem bestimmten Zeitpunkt des Tages automatisch ablaufen und laufen beide in festgelegten Zeitintervallen, obwohl gelegentlich zu bestimmten Zeiten Ausgabe durch das Makro.Führen Sie Makro automatisch über VBScript von Timer

Ich habe das Problem auf zwei Arten angesprochen, von denen beide Probleme haben, die ich nicht herausfinden kann. Der erste Ansatz besteht darin, eine Zeitgeberkomponente zu verwenden, die den Makro mithilfe des Befehls Application.OnTime ausführt, wobei die Laufzeit von einer Zelle in der Arbeitsmappe abgeleitet wird, die vom Makro aktualisiert wird.

Diese Methode funktioniert ziemlich gut, wenn ich auf dem Computer etwas anderes mache. Ich habe jedoch bemerkt, dass, wenn ich gehe, auch wenn der Computer nicht schlafen geht, das Programm unweigerlich nach etwa 30 Minuten wieder läuft. Manchmal hört es auch auf, wenn ich auf dem Computer aktiv bin. Warum ist das? Was könnte das verursachen? Natürlich kann ich das Programm auch nicht so programmieren, dass es automatisch innerhalb des Makros geöffnet und ausgeführt wird. Daher wandte ich mich an die Taskplaner-Methode VBScript & für diesen Teil der Lösung.

Ich habe jedoch zwei Probleme mit der Ausführung des VBScript aufgetreten. Erstens kann es oft nicht gestartet werden, wenn es vom Taskplaner ausgeführt wird. Zweitens, wenn es ausgeführt wird, funktioniert der Application.OnTime Befehl innerhalb des Makros nicht. Dies ist ein Problem, da das Makro manchmal in unregelmäßigen Zeitintervallen ausgeführt werden muss, die im Laufe des Tages ermittelt werden, während das Makro seine Iterationen durchläuft. Warum sollte das VBScript nicht ausgeführt werden, wenn der Task-Manager es versucht, und warum würde es den Befehl "application.ontime" nicht so starten, wie es das Makro tut, wenn ich es manuell ausführe?

VBA Timer-Code:

Sub Timer() 
    Dim Runtime As Date 

    If Time <= TimeValue("17:45:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 10 
    ElseIf Time > TimeValue("17:45:00") And Time <= TimeValue("18:15:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 13 
    ElseIf Time > TimeValue("18:15:00") And Time <= TimeValue("18:45:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 16 
    ElseIf Time > TimeValue("18:45:00") And Time <= TimeValue("19:15:00") Then 
     Workbooks("10am_Swing_Report").Sheets("Parameters").Cells(17, 2).Value = 19 
    End If 

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Calculate 
    If Time > Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value Then 
     Runtime = Time + TimeValue("00:00:30") 
    Else 
     Runtime = Workbooks("10am_Swing_Report").Sheets("Parameters").Range("B16").Value 
    End If 

    Application.OnTime TimeValue(Runtime), "Swingtimer" 

    Workbooks("10am_Swing_Report").Sheets("Parameters").Range("C16").Value = Runtime 
    Workbooks("10am_Swing_Report").Save 
End Sub 

Dank!

Ich habe den Vbs-Code aktualisiert, um eine Überprüfung zu enthalten, dass die Laufzeit übergeben wurde, aber ich habe immer noch ein Problem mit Taskplaner fehlgeschlagen, um die Aufgabe zu starten. Ich erhalte den folgenden Fehler: "Launch-Anfrage ignoriert, Instanz läuft bereits", gefolgt von: "Task Start Failed". Ich dachte ursprünglich, dies sei, weil das VBScript immer noch von der vorherigen Instanz lief, aber ich bekomme das von Anfang an.

Option Explicit 


Dim xlApp  
Dim xlBook  
Dim runtime 
Dim xlSheet 



Set xlApp = CreateObject("Excel.Application") 
xlApp.DisplayAlerts = False 
'xlApp.Application.DisplayAlerts = True 
Set xlBook = xlApp.Workbooks.Open("C:\Users\DORIAN\Dropbox\Swing_Report.xlsm",1,False) 
Set xlSheet = xlBook.Sheets("Parameters") 

'xlBook.application.Visible = True 

'MsgBox FormatDateTime(xlSheet.Range("B16").Value,3) 
runtime = TimeValue(FormatDateTime(xlSheet.Range("B16").Value,3)) 
'MsgBox runtime 


If Time > runtime Then 
    xlApp.Run "Swingtimer" 
    'MsgBox "Running..." 
    WScript.Sleep 30000 
Else 
xlApp.Application.OnTime runtime, "Swingtimer" 
'MsgBox "Timer Set" 
End If 


xlbook.close True 

WScript.Quit 
+0

Bitte geben Sie den Code sowohl der VBA und VBScript Teile. Wie es jetzt gesagt wird, gibt es nicht viel, was als Antwort zur Verfügung gestellt werden kann. – trincot

Antwort

0

Könnten Sie es anders machen? 1) Führen Sie vbscript es in Windows Scheduler sagen alle 1 Minute oder 1 Stunde oder ....

2) Legen Sie einige Validierung innerhalb VBscript
Wenn Bedingung dann Code ausführen Else Stopp Vbscript End if

Mit diesem werden Sie wahrscheinlich loswerden Event-Handler OnTime

Mit freundlichen Grüßen bekommen können Alex

+0

Danke. Ich habe es derzeit auf Taskplaner eingerichtet, um alle fünf Minuten zu laufen. Ich möchte nicht, dass es öfter läuft, aber manchmal muss es zwischen den Intervallen von fünf Minuten laufen, d. H. Um 8:52, wenn es normalerweise um 8:50 & 8:55 läuft. Ich habe mich gefragt, ob ich die Laufzeit von der Arbeitsmappe in das VBScript statt in VBA zeichnen könnte. Aber ich kann nicht herausfinden, wie es funktioniert. In Bezug auf eine Validierung, habe ich nichts zu validieren. Ich möchte, dass das Programm alle fünf Minuten läuft, manchmal aber auch dazwischen. – Dorian821

+0

@ Dorian821, Sie können den Taskplaner so ändern, dass er von einem Ereignis und einem Timer ausgelöst wird (suchen Sie im Stackoverflow nach, wie ein Ereignis mit VBS erstellt wird). – Jules

+0

@ Dorian821 Als ich den Ausdruck 'Validierung' benutzte, meinte ich die Entscheidung: basierend auf Ihren Bedingungen zu laufen oder nicht zu laufen. Zum Beispiel "schießt" Ihr Scheduler alle 1 Minute: 8:50 - Lauf (nach Zeit); 8:51 - nicht laufen; 8:52 - Lauf (durch eine zusätzliche Bedingung); 8:53 - nicht laufen, usw. – Alex

0

Ich denke, Sie sind vorbei Dinge zu komplizieren. Sie benötigen nur ein Workbook_Open-Ereignis und Windows Taskplaner.

So etwas (anpassen an Ihre Bedürfnisse anpassen).

Private Sub Workbook_Open() 
    Msgbox Date 
    Worksheets("Sheet1").Range("A1").Value = Date 
End Sub 

Planen Sie das Ereignis mithilfe des Windows-Taskplaners.

http://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html

+0

danke. Du hast Recht, dass ich es einfacher machen könnte. Derzeit funktioniert der Code jedoch einwandfrei, und ich bevorzuge die Validierung, um zu verhindern, dass der VBA-Code unnötigerweise ausgeführt wird. Das Problem scheint tatsächlich beim Taskplaner zu liegen. Das Skript läuft sehr gut manuell, aber ich stehe ständig auf Probleme, es nach einem Zeitplan mit Taskplaner zu starten. Im Moment scheint es nicht einmal das Skript zu öffnen. Es stagniert bei "Created Task Process" und bleibt nur für Stunden dort. Inzwischen gibt es im Task-Manager keine Spur eines Wscript- oder Excel-Prozesses – Dorian821

+0

Dies ist eine bessere Lösung. Wenn Sie einen Ad-hoc-Lauf ausführen möchten, ändern Sie die Aufgabe so, dass sie in einem Ereignisprotokoll ausgeführt wird. Sie können ein VBS-Modul schreiben, um das Ereignis zu erstellen und auf eine Desktop-Verknüpfung zu setzen. – Jules

+0

Ich sehe nicht, wie das helfen oder vereinfachen würde. Die Kriterien für das Programm sind einfach zeitbasiert und ich möchte, dass es täglich auf meinem Server läuft. Wie kann daher das Einrichten eines anderen Programms mit einer Desktopverknüpfung und Ereignisprotokollen besser als ein zeitbasierter Zeitplan ausgeführt werden? – Dorian821

Verwandte Themen