2017-09-27 4 views
2

Ich verwende Excel VBA-Makro zum Senden von automatisierten E-Mails (Outlook 2013), die mit Windows Taskplaner ausgeführt wird (Ich verwende Batch-Datei, um das zu tun) zur angegebenen Zeit jeden Tag. Wenn ich mein Makro ohne Taskplaner ausführen, wird es normal ausgeführt (E-Mails werden gesendet), aber wenn ich den Taskplaner für den Laufzeitfehler 429 verwende, tritt dies nur auf, wenn der VBA-Makro versucht, ein Outlook-Objekt zu erstellen:Excel VBA-Code löst Laufzeitfehler 429 beim Senden von Outlook-E-Mail mit Taskplaner

Dim OutApp As Object 
Dim OutMail As Object 

Set OutApp = CreateObject("Outlook.Application") 'The error happens here 
Set OutMail = OutApp.CreateItem(0) 

On Error Resume Next 
With OutMail 
    .to = "[email protected]" 
    .CC = "" 
    .BCC = "" 
    .Subject = "subj" 
    .Body = "body" 
    .Attachments.Add ActiveWorkbook.FullName 
    .Send 
End With 
On Error GoTo 0 

Set OutMail = Nothing 
Set OutApp = Nothing 

Der obige Fehler tritt nur auf, wenn die Outlook-Anwendung auf dem Computer geöffnet ist. Nun, was ich nicht verstehe, ist:

  1. Warum funktioniert die Makro Arbeit in der Regel ohne Task-Scheduler (trotz Outlook geöffnet ist oder nicht) und warum es nicht dort arbeiten?

  2. Wie wird der gesamte Prozess mit Taskplaner ausgeführt und nicht davon abhängig, dass die Outlook App geöffnet oder geschlossen ist? (Ich möchte, dass das Makro ausgeführt wird, unabhängig davon, welche Anwendungen geöffnet/geschlossen sind).

Beratung wäre sehr geschätzt.

Edit: Hier ist der VBScript-Code Ich bin mit Makro auszuführen (in repsonse zu LS_ᴅᴇᴠ Frage):

Dim WshShell 
Set WshShell = CreateObject("WScript.Shell") 

' Create an Excel instance 
Dim myExcelWorker 
Set myExcelWorker = CreateObject("Excel.Application") 

' Disable Excel UI elements 
myExcelWorker.DisplayAlerts = False 
myExcelWorker.AskToUpdateLinks = False 
myExcelWorker.AlertBeforeOverwriting = False 
myExcelWorker.FeatureInstall = msoFeatureInstallNone 

' Tell Excel what the current working directory is 
' (otherwise it can't find the files) 
Dim strSaveDefaultPath 
Dim strPath 
strSaveDefaultPath = myExcelWorker.DefaultFilePath 
strPath = WshShell.CurrentDirectory 
myExcelWorker.DefaultFilePath = strPath 

' Open the Workbook specified on the command-line 
Dim oWorkBook 
Dim strWorkerWB 
strWorkerWB = strPath & "\____DailyReport.xlsm" 

Set oWorkBook = myExcelWorker.Workbooks.Open(strWorkerWB) 

' Build the macro name with the full path to the workbook 
Dim strMacroName 
strMacroName = "'" & strPath & "\____DailyReport.xlsm'" & "!Module1.____DailyRep" 
on error resume next 
    ' Run the calculation macro 
    myExcelWorker.Run strMacroName 
    if err.number <> 0 Then 
     ' Error occurred - just close it down. 
    End If 
    err.clear 
on error goto 0 

'oWorkBook.Save 
'oWorkBook.Close <<--- we don't need these two because we close the WB in the VBA macro 

myExcelWorker.DefaultFilePath = strSaveDefaultPath 

' Clean up and shut down 
Set oWorkBook = Nothing 

' Don’t Quit() Excel if there are other Excel instances 
' running, Quit() will 
'shut those down also 
if myExcelWorker.Workbooks.Count = 0 Then 
    myExcelWorker.Quit 
End If 

Set myExcelWorker = Nothing 
Set WshShell = Nothing 
+0

Was ist das für ein Excel-Makro, den Sie im Taskplaner abgelegt haben? –

+0

@ LS_ᴅᴇᴠ Ich benutzte das hier beschriebene VBScript: [Excel: Excel auf Windows Taskplaner ausführen] (http://krgreenee.blogspot.com/2006/04/excel-running-excel-on-windows-task.html) und meine Batch-Datei sah so aus: 'start '" "D: \ Dokumente \ Makros \ ___ \ Run__Rep.vbs" ' –

+0

Also, eine andere Frage ... Was enthält VBS? –

Antwort

0

Bitte folgen Sie den unten:

1) in einer Excel-Datei, die gespeichert als SendEmail.xlsm, Ihre Sub:

Option Explicit 

Public Sub send_email() 



Dim OutApp As Object 
Dim OutMail As Object 

Set OutApp = CreateObject("Outlook.Application") 
Set OutMail = OutApp.CreateItem(0) 

On Error Resume Next 
With OutMail 
    .to = "[email protected]" 
    .CC = "" 
    .BCC = "" 
    .Subject = "subj" 
    .Body = "body" 
    .Attachments.Add ActiveWorkbook.FullName 
    .Send 
End With 
On Error GoTo 0 

Set OutMail = Nothing 
Set OutApp = Nothing 

End Sub 

2) dieser Kodex einen Notizblock Schreib öffnen und als vbs speichern (SendEmail.vbs)

3) Öffnen Sie einen Notizblock schreiben Sie diesen Code und speichern Sie als bat (SendEmail.bat), ich habe es auf meinem Desktop gespeichert, können Sie es überall dort speichern, wo Sie wollen.

cscript "D:\desktop\SendEmail.vbs" "D:\desktop\SendEmail.xlsm" 

4) Erstellen Sie eine Aufgabe im Scheduler, der die SendEmail.bat ruft

+0

vielen dank! Deine Methode hat geklappt!Ich verwendete die Methode, die hier beschrieben wird: Excel: [Excel auf Windows Taskplaner ausführen] (http://krgreenee.blogspot.com/2006/04/excel-running-excel-on-windows-task.html) aber es würde nicht Ich arbeite nicht wie oben erwähnt. Ich habe nur noch eine Frage: In dem auf der Website beschriebenen Skript gibt es die Möglichkeit, Excel nicht zu beenden, wenn andere Instanzen laufen, aber mit Ihrem Skript werden andere Instanzen von Excel nicht beendet, sollte ich es so lassen wie es ist oder diese Prüfmethode verwenden? –

+0

Möchten Sie alle Instanzen oder nur die Instanz des Skripts beenden? –

+0

Nur die Instanz des Skripts, dh ich möchte, dass andere Instanzen ausgeführt werden (falls andere Instanzen vorhanden sind). –

1

sollten Sie zunächst prüfen, ob Outlook ausgeführt wird und wenn ja, daran binden und nicht eine neue Sitzung zu erstellen:

On Error Resume Next 
Set objOutlook = GetObject(, "Outlook.Application") 'Error if Outlook not running 
On Error GoTo 0 
If objOutlook Is Nothing Then 'Outlook not running so start it 
    Set objOutlook = CreateObject("Outlook.Application") 
End If 
+0

Vielen Dank für die Antwort. Ich habe versucht, es auf Ihre Weise zu ändern, aber leider bekomme ich den gleichen Fehler, wenn ich versuche, es vom Taskplaner aus zu starten (ansonsten funktioniert es wieder gut). Die Sache ist, dass der Code, wenn er aus dem Task Scheduler kommt, offensichtlich die 'GetObject'-Zeile weggelassen hat und einen Fehler bei der' CreateObject'-Zeile geworfen hat. –

+1

Sie müssen die Berechtigungen für TS überprüfen. Anscheinend sind sie nicht genug ... – peakpeak

+0

Sie sind völlig richtig. Ich habe die Aufgabe mit "höchsten Privilegien" ausgeführt, als ich das Skript normal ausgeführt habe. –

1

Der Grund, die Fehler führt wurde, war, dass ich versuche, die Aufgabe „mit höchsten Privilegien“ auszuführen:

Dies war in scheinbar nicht machbar meinem Umgebung, so dass, wenn ich es deaktiviert hatte, sowohl das VBScript, das ich verwendete, als auch VBScript, das von @Nikolaos Polygenis vorgeschlagen wurde, normal ausgeführt wurde.

Verwandte Themen