J'ai créé plusieurs scripts pour envoyer des e-mails après avoir effectué certaines analyses. Cela a fonctionné auparavant. Maintenant, quelques-uns des scripts échouent et donnent le message d'erreur suivant:
Erreur d'exécution "429":
Le composant ActiveX ne peut pas créer d'objet
Il fait alors référence à la ligne de code Outlook Object comme erreur.
Le script s'exécute lorsque je quitte MS Outlook et bogue si Outlook est en cours d'exécution. J'utilise un planificateur de tâches pour l'exécuter et Outlook est généralement en cours d'exécution.
Private Sub Send_Ratings_Email() Dim OutApp As Object, OutMail As Object Dim rng As Range Dim StrBody As String StrBody = "Please find Maturities for the Current Week Below: " Application.ScreenUpdating = False On Error Resume Next Set OutApp = GetObject(, "Outlook.Application") On Error GoTo 0 If OutApp Is Nothing Then Set OutApp = GetObject("Outlook.Application") On Error GoTo cleanup Set OutMail = OutApp.CreateItem(0) On Error Resume Next Call AddAzureLabel(OutMail, "Restricted - Internal") With OutMail .To = " example.com" .Subject = "Weekly Maturities - W/C " & Format(Now, "dd-mmm-yy") .HTMLBody = StrBody & RangetoHTML(rng) .Display 'Or use .Send End With On Error GoTo 0 Set OutMail = Nothing cleanup: Set OutApp = Nothing Application.ScreenUpdating = True
Powershell Script fonctionne lorsqu'il est exécuté manuellement.
3 Réponses :
Vous créez une instance d'Outlook si elle ne fonctionne pas, vérifiez plutôt si elle est déjà en cours d'exécution et récupérez l'application en cours d'exécution ou créez-en une si ce n'est pas le cas:
On Error Resume Next Set OutApp = GetObject(, "Outlook.Application") On Error GoTo 0 If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")
Je placerais OEG0 après avoir obtenu obj au cas où la création d'obj échouerait également.
Vous créez une instance d'Outlook si elle ne fonctionne pas Ce n'est pas vraiment vrai. Vous pouvez CreateObject
même si Outlook est déjà en cours d'exécution. Dans ce cas, CreateObject
renvoie l'instance déjà en cours d'exécution.
Remplacez votre ligne Set OutApp ...
par le bloc sur ma réponse, cela devrait résoudre le problème.
merci ... obtenir une erreur disant qu'il ne peut pas créer de composant. Mettre en surbrillance 'Set OutApp = Create' .... dans l'instruction IF. D'autres idées?
La bibliothèque d'objets Microsoft Outlook XX.X
est-elle cochée dans vos références? Être XX.X la version de vos perspectives.
Oui - fait vérifier la bibliothèque de références d'objets pour Outlook. Outlook16.0 - Edit: le script semble fonctionner lorsque j'exécute manuellement la macro mais pas avec le planificateur de tâches - ce qui est fou car il a fonctionné dans le passé
C'est bizarre ... vraiment pas de logique sur votre erreur. Pour commencer, si Outlook est déjà ouvert, il devrait éviter le deuxième ensemble, et si ce n'est pas le cas ... Vous n'avez eu aucun problème avec cela.
bon sang - je suppose que je ne pourrais rien faire d'autre? Je ne peux juste pas comprendre pourquoi ça ne marche pas
Ajouter ceci comme réponse pour le moment, mais vraiment essayer de déboguer d'une manière qui ne rentre pas dans les commentaires. Similaire à l'autre réponse, mais l'idée est de l'utiliser pour créer un cas de test et voyons si nous pouvons le faire fonctionner dans votre cas Planificateur de tâches> Powershell.
Demandez à votre PS d'exécuter le foo code> ou la procédure
foo2
ici, et j'ai encapsulé l'instanciation Outlook en tant que fonction autonome pour essayer de garder les choses propres et d'isoler l'erreur.
try { stop-process -Name "outlook" -ErrorAction Stop Write-Host "Stopped the running instance of Outlook Application" } catch { Write-Host "outlook was not already running" } $excel = new-object -comobject excel.application $file = "C:\debug\ps-excel.xlsm" $wb = $excel.workbooks.open($file) $excel.run("Module1.foo")
que je cours depuis PS comme:
$excel.Run("Module1.foo2")
Et:
$excel = new-object -comobject excel.application $file = "C:\debug\ps-excel.xlsm" $wb = $excel.workbooks.open($file) $excel.Run("Module1.foo")
Dans le foo ,
GetObject
génère une erreur mais ce n'est pas une erreur 429, et le contrôle passe à CreateObject
qui instancie avec succès l'application. Donc, malheureusement, je ne suis pas en mesure de reproduire l'erreur sous aucune combinaison de foo
/ foo2
et si Outlook est déjà ouvert ne semble pas non plus.
Donc, c'est un peu hack-y parce que je ne pense pas que cela résout la cause profonde (et parce que je ne peut pas reproduire votre erreur, cela ne résoudra peut-être rien) mais ça vaut le coup, comme vous le notez:
Il est important de noter que le script s'exécute lorsque je quitte MS Outlook et bogue si Outlook est déjà en cours d'exécution
Mon idée est de simplement modifier votre PS pour vérifier l'instance en cours d'exécution d'Outlook et de la fermer via la stop-process
Cmdlet.
Option Explicit Sub foo() Dim olApp As Object Set olApp = GetApplication("Outlook.Application") End Sub Sub foo2() Dim olApp As Object Set olApp = GetApplication2("Outlook.Application") End Sub Function GetApplication2(className As String) As Object ' function to encapsulate the instantiation of an application object Dim theApp As Object On Error Resume Next Set theApp = CreateObject(className) If theApp Is Nothing Then MsgBox "Unable to get a handle on " & className Else MsgBox "Successfully got a handle on " & className & ", returning to caller" End If Set GetApplication2 = theApp End Function Function GetApplication(className As String) As Object ' function to encapsulate the instantiation of an application object Dim theApp As Object On Error Resume Next Set theApp = GetObject(, className) If Err.Number <> 0 Then MsgBox "Unable to Get" & className & ", attempting to CreateObject" Set theApp = CreateObject(className) End If If theApp Is Nothing Then Err.Raise Err.Number, Err.Source, "Unable to Get or Create the " & className & "!" Set GetApplication = Nothing End If MsgBox "Successfully got a handle on Outlook Application, returning to caller" Set GetApplication = theApp End Function
J'ai couru ceci via - TS / PS et il s'ouvre et aucune fenêtre contextuelle n'est apparue dans les deux cas. Cependant, lorsque je lance manuellement à partir de Powershell, l'instance fonctionne
@dsound J'ai révisé mes fonctions de test pour essayer de donner plus de détails lors de l'exécution à partir de PS.
@dsound essayez-vous d'utiliser l'applet de commande stop-process
pour tuer Outlook s'il est déjà en cours d'exécution, via PowerShell? Une sorte de piratage, mais cela pourrait fonctionner.
ahh inutile - l'erreur est toujours à venir avec le hack. Il dit que Outlook n'était pas déjà en cours d'exécution, puis continue avec l'erreur :(
c'est farfelu, rien à ce sujet n'a de sens - alors maintenant, même si Outlook n'est PAS en cours d'exécution (PS tue le processus), il y a toujours des erreurs? J'aimerais pouvoir reproduire votre erreur, mais je ne peux pas. Cela fonctionne pour moi exactement comme je le pense. Il doit y avoir une sorte de problème de configuration, de registre ou d'autorisations de votre côté, mais je ne sais pas comment aider à isoler cette cause racine :(
Ouais, ça craint - j'ai téléchargé Advanced Task Scheduler - j'ai exécuté le script PowerShell là-bas et aucun problème. Le seul problème est que Adv. Le planificateur de tâches n'est pas gratuit, ce n'est qu'un essai.
Je suis même allé plus loin et j'ai essayé d'exécuter le mien via le planificateur de tâches (je venais juste d'exécuter PS à partir de l'invite de commande). Je ne parviens toujours pas à obtenir l'erreur, le mien ferme avec succès l'instance en cours d'exécution d'Outlook (si elle est ouverte) et, dans les deux cas, fait ce qu'elle doit faire dans Excel. Je vérifierais deux et trois fois les options du planificateur de tâches. Sinon, désolé, je ne peux pas être plus utile!
Décochez "Exécuter avec les privilèges les plus élevés" dans votre tâche du planificateur de tâches
Votre environnement a-t-il récemment changé? Il peut s'agir d'un paramètre de sécurité dans Outlook qui n'autorise pas l'accès par programme. Vous devrez peut-être basculer cela dans Fichier> Options> Centre de gestion de la confidentialité> Paramètres du centre de confiance> Accès par programme.
Salut David - merci pour votre aide. Cette section semble convenir. Je ne comprends pas pourquoi la macro Excel lorsqu'elle est appelée à partir d'un script Powershell dans le planificateur de tâches ne fonctionne pas
Hmmmm. Il existe BEAUCOUP d'informations sur la source d'erreur possible via Microsoft, ici: support.microsoft.com/en-us/help/828550/...
Je serais curieux de savoir si vous obtenez la même erreur PowerShell / planificateur de tâches en utilisant
GetObject
au lieu deCreateObject
.J'ai sorti le code If OutApp Is Nothing Then Set OutApp = CreateObject ("Outlook.Application") et maintenant tout ce qui se passe est le planificateur de tâches effectue l'analyse et se ferme
Ce n'est pas ce que j'ai demandé, cependant. Cette ligne de code semble n'avoir pratiquement aucun effet réel,
OutApp
n'est toujours rien tant qu'elle n'est pas instanciée, et à moins que vous n'utilisiez des variables globales de portée (ne le faites pas), elle ne sera pas instanciée tant que vous appelezCreateObject
ouGetObject
pour gérer l'instance éventuellement déjà en cours d'exécution.Cela pourrait vous aider de réviser votre question pour afficher le code que vous utilisez actuellement :)
Problèmes toujours. que ce ne soit pas possible. Difficile de croire que même lorsque j'exécute manuellement le script PowerShell, cela fonctionne, mais le planificateur de tâches ne fonctionne pas
Il est possible que vous fassiez simplement quelque chose de mal ou que vous ayez quelque chose de mal configuré, et nous n'avons pas encore compris de quoi il s'agit :)
code modifié pour montrer ce que j'utilise - afin de réduire les commentaires, je vais simplement modifier celui-ci pour les réponses. J'espère vraiment que nous pouvons résoudre ce problème
Set OutApp = GetObject ("Outlook.Application")
est incorrect, vous devez utiliserGetObject (, "Outlook.Application")
ouCreateObject ("Outlook .Application ")
. C'est pourquoi votre programme se ferme simplement dans ce cas, vous obtenez une erreur sur cette affectation et il suit lenettoyage GoTo
.Le planificateur de tâches exécute-t-il PS à partir du même compte? Sinon, cela pourrait être un problème d'autorisations ou une autre configuration. Avez-vous essayé de réparer les installations d'Outlook et d'Excel? Au cas où.
Ouais - le TS exécute le PS à partir du même compte. les réparations sont correctes. L'erreur à venir est que le composant ActiveX ne peut pas créer d'objet. Mais Outlook est déjà ouvert. Le TS fonctionne lorsque les perspectives ne sont pas ouvertes
voir ma "réponse" ci-dessous, je suis curieux de savoir ce qui se passe si nous encapsulons l'instanciation Outlook. Pouvez-vous exécuter cette procédure
foo
à partir de PS et voir ce qui se passe?Bien sûr - je n'ai pas tenté de chance, il s'ouvre et je ne crois même pas qu'il exécute la macro. manuellement sur PowerShell cela fonctionne cependant.