2017-09-27 3 views
2

J'utilise la macro Excel VBA pour envoyer des courriels automatisés (Outlook 2013) qui s'exécute avec le planificateur de tâches Windows (j'utilise le fichier de commandes) à l'heure spécifiée chaque jour. Lorsque j'exécute ma macro sans Task Scheduler, il s'exécute normalement (les emails sont envoyés), mais quand j'utilise Task Scheduler pour cela je reçois "run-time error 429", cela arrive seulement quand la macro VBA essaye de créer un objet Outlook:Le code VBA Excel génère une erreur d'exécution 429 lors de l'envoi de courrier électronique Outlook à l'aide du planificateur de tâches

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 

L'erreur ci-dessus se produit uniquement si l'application Outlook est ouverte sur l'ordinateur. Maintenant, ce que je ne comprends pas:

  1. Pourquoi le travail macro normalement sans le Planificateur de tâches (en dépit d'Outlook être ouvert ou non) et pourquoi ne pas travailler là-bas? Comment faire en sorte que l'ensemble du processus s'exécute en utilisant le Planificateur de tâches et ne pas dépendre de l'ouverture ou de la fermeture de l'application Outlook? (c'est-à-dire que je veux que la macro s'exécute quelles que soient les applications ouvertes/fermées).

Un conseil serait grandement apprécié.

Edit: Voici le code VBScript J'utilise pour exécuter macro (en repsonse à la question de LS_ᴅᴇᴠ):

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

Étant une macro Excel, quel lot avez-vous mis dans le planificateur de tâches? –

+0

@ LS_ᴅᴇᴠ J'utilisais le script VBScript décrit ici: [Excel: Exécuter Excel sur le planificateur de tâches Windows] (http://krgreenlee.blogspot.com/2006/04/excel-running-excel-on-windows-task.html) et mon fichier batch ressemblait à ceci: 'start" "" D: \ Documents \ Macros \ ___ \ Run__Rep.vbs "' –

+0

Donc, une autre question ... Que contient VBS? –

Répondre

0

S'il vous plaît suivre le ci-dessous:

1) dans un fichier Excel qui enregistré en tant que SendEmail.xlsm, votre sous:

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) Ouvrez une écriture de bloc-notes ce code et l'enregistrer comme VBS (SendEmail.vbs)

Dim args, objExcel 

Set args = WScript.Arguments 
Set objExcel = CreateObject("Excel.Application") 

objExcel.Workbooks.Open args(0) 
objExcel.Visible = True 

objExcel.Run "send_email" 

objExcel.ActiveWorkbook.Save 
objExcel.ActiveWorkbook.Close(0) 
objExcel.Quit 

3) Ouvrez un bloc-notes écrivez ce code et sauvegardez comme bat (SendEmail.bat), je l'ai enregistré sur mon bureau, vous pouvez l'enregistrer partout où vous voulez.

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

4) Créer une tâche dans le planificateur qui appelle la SendEmail.bat

+0

merci beaucoup! Votre méthode a fonctionné!J'utilisais la méthode décrite ici: Excel: [Exécution d'Excel sur le planificateur de tâches Windows] (http://krgreenlee.blogspot.com/2006/04/excel-running-excel-on-windows-task.html) mais il wouldn ne fonctionne pas comme je l'ai mentionné ci-dessus. Il ne me reste qu'une question: dans le script décrit sur le site, il y a moyen de ne pas quitter Excel s'il y a d'autres instances en cours, mais avec votre script il ne quitte toujours pas les autres instances d'Excel, je devrais le laisser tel quel , ou utilisez cette méthode de vérification? –

+0

voulez-vous quitter toutes les instances ou seulement l'instance du script? –

+0

Seule l'instance du script, ce qui signifie que je veux laisser les autres instances en cours d'exécution (au cas où il y aurait d'autres instances). –

1

Vous devez d'abord vérifier si Outlook est en cours d'exécution et si oui, joindre à elle et non la création d'une nouvelle session:

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

Merci pour la réponse. J'ai essayé de le modifier à votre guise, mais malheureusement, je reçois la même erreur en essayant de l'exécuter à partir de Task Scheduler (sinon cela fonctionne très bien, encore une fois). La chose est que, apparemment, lors de l'exécution de Task Scheduler, le code a omis la ligne 'GetObject' et a lancé une erreur sur la ligne 'CreateObject'. –

+1

Vous devez vérifier les privilèges de TS. Apparemment, ils ne suffisent pas ... – peakpeak

+0

Vous avez totalement raison. J'exécutais la tâche avec "les plus hauts privilèges", quand je l'ai décoché le script exécuté normalement. –

1

la raison qui a été traduit par erreur était que je tentais d'exécuter la tâche « avec plus de privilèges »:

C'était apparemment pas possible dans mon environnement, donc quand je décoche à la fois le VBScript que j'utilisais et VBScript suggéré par @ Nikolaos Polygenis exécuter normalement.