IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur MACRO Via tache planifiée Windows


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut Erreur MACRO Via tache planifiée Windows
    Bonjour à tous,

    J'ai un fichier Excel (2013) ou est inséré une requête SQL (PhpMyadmin) avec actualisation automatique.
    Dans ce fichier, j'ai réaliser une macro qui capture le résultat d'un tableau croisé dynamique et me l'envoi dans un mail via l'application OUTLOOK.
    J'utilises la référence MICROSOFT Outlook 15.0 Object Library sous EXCEL

    En local, lors d'un double clique sur mon fichier, tout est OK. Le fichier s'ouvre, s'actualise, la macro s'exécute et m'envoi le mail.

    J'ai donc créé un (mini) batch pour réaliser cette opération en automatique chaque matin.

    BATCH (non finalisé, car cela plante avant)

    start C:\RapportAuto\HeureTechnicienParMoisEnCours.xlsm
    En local, le batch fonctionne, je clique dessus et le fichier Excel fonctionne correctement.

    En tache planifiée avec les autorisations maximales, j'exécute et la, j'obtiens une erreur sur "Set Ol_App = Outlook.Application"
    Comme s'il ne trouvait pas la référence.

    Avez vous une idée ?

    Le problème se situe dans la tache planifiée ? mon code ?

    Ci dessous "mon" code.
    J'ai un peu piocher ici et la pour le créer, je ne suis pas un expert VBA

    Module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Sub Resultat()
     
    ' Dimensionnement des variables----------------------------------------------------------------------------------------------------------------------------------------------------
    Dim LeNom As String, MonTo As String, strBody As String
    Dim LaLigne As Long, NbAd As Long, DerLig As Long, r As Long
    Dim MaRech As Range, rng As Range
    Dim Ol_App As Outlook.Application
    Dim Ol_Item As Outlook.MailItem
    Dim S As Shape
    Dim MoisInt As Integer
    Dim Mois As String
    Dim XX As String
     
    ' Récupère le tableau -------------------------------------------------------------------------------------------------------------------------------------------------------------
        Set rng = Nothing
        Set rng = Sheets("Résultat").UsedRange
    '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     MoisInt = Month(Date)
     Mois = MonthName(MoisInt, False)
     
     
    ' Envoi du mail via Outlook--------------------------------------------------------------------------------------------------------------------------------------------------------
    strBody = "Bonjour," & "<br>" & _
              "Voici les heures renseignées dans GLPI par les techniciens pour le mois de " & "<br>" & Mois
    Set Ol_App = Outlook.Application
    Set Ol_Item = Ol_App.CreateItem(olMailItem)
     
    With Ol_Item
        .To = "x.y@societe.com"
       .Subject = "Rapport quotidien Helpdesk - Heure par Technicien" 'Défini le sujet du message
        .BodyFormat = olFormatHTML 'Défini le format du mail
        .HTMLBody = strBody & RangetoHTML(rng) 'Affecte le corps du message et lance la function pour insérer la "tableau"
        .Send 'Envoi le message !!cette procédure oblige une confirmation manuelle
    End With
     
    Set Ol_Item = Nothing 'Décharge
    Set Ol_App = Nothing 'Décharge
     
     ActiveWorkbook.Save
     
    End Sub

    THISWorkBook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Workbook_Open()
    'IL FAUT QUE LE TABLEAU SOIT EN "ACTUALISER CETTE CONNEXION A LA COMMANDE ACTUALISER TOUT"
     
     Sheets("Tableau").Select
     ActiveWorkbook.RefreshAll
     'Application.ScreenUpdating = False
     Sheets("Résultat").Select
     ActiveWorkbook.RefreshAll
     
     Call Resultat
     End Sub

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,
    pour que le simple
    Set Ol_App = Outlook.Application
    Ca impliquerait que Outlook soit deja present d'uine facon ou une autre et ouvert dans l'outil =]

    2 approches possibles :
    1/ tu gardes ton code actuel mais tu forces la creation d'une instance d'Outlook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Ol_App = New Outlook.Application
    2/ tu supprimes les references a outlook et tu passes par des GetObject et CreateObject
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Indépendamment du fait qu'il faut utiliser creatObject, comment as-tu définis ta tache planifié?

    Avec session ouverte ou nom, avec un login admin? Car si la machine se connecte à son nom, j'espère qu'elle a une boite mail! Et si elle doit avoir accès à un répertoire réseau, les chemins sont les n adresse ip car le mappage de lecteurs ne seront peut-être pas fait!

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut
    Bonjour Messieurs,

    Merci d'avoir pris le temps de me répondre.

    Grace a tes explications "Jean-Philippe André", j'ai un peu plus compris le fonctionnement des objets

    J'ai mise à jour mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim Ol_App As Object
    Dim Ol_Item As Object
     
    Set Ol_App = CreateObject("Outlook.Application")
    Set Ol_Item = Ol_App.CreateItem(olMailItem)
    Cela fonctionne presque parfaitement.
    Lorsque je fais un test en double cliquant sur le fichier Excel, le mail est envoyé sans problème.

    Lorsque je passe par la tache planifiée et que je force son lancement, SI mon OUTLOOK est ouvert, plantage, si non, si celui ci est fermé, cela fonctionne.
    J'ai essayé de jouer avec "NEW" mais cela n'a pas été concluant.

    Une idée du pourquoi le fichier plante via la tache planifiée si mon Outlook est ouvert ?


    dysorthographie : J'ai fais pour l'instant du basique. La tache planifiée s'exécute sur mon poste lorsque ma session est ouverte.
    Plus tard, le but est d'automatiser cela sur un serveur.

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici une procédure standard que j'utilise dans tout mes projets
    les variables utilisées sont publiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub InitialisationOutlook()
        On Error Resume Next: Set OlApp = GetObject(, "Outlook.Application"): On Error GoTo 0
        If OlApp Is Nothing Then Set OlApp = CreateObject("Outlook.Application")
        Set OlNmSpace = OlApp.GetNamespace("MAPI")
    End Sub
    On tente de chopper l'instance Outlook
    Si ça marche pas, on la crée
    La dernière ligne de code ne te sera peut-être pas utile si tu fais simplement un Create MailItem sur la boite principale du compte

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    la double instance Outlook c'est pas toujours top, donc comme le note dysortho, je pense que passer dans un premier temps par un GetObject(), de tester si l'objet est Nothing et si c'est le cas (outlook pas ouvert), faire un createobject, sinon utiliser directement l'objet (outlook deja ouvert).


    edit : j'ai mis trop de temps a taper mon message
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut
    Merci joe.levrai , merci Jean-Philippe André

    Je me suis empressé de tester cette manip et ... bah c'est pas encore cela.
    Le programme plante exclusivement via la tache planifiée lorsque Outlook est ouvert.
    Si Outlook est fermé, par la tache planifiée, cela fonctionne.
    Sans tache planifié, ouvert ou fermé, cela fonctionne.

    Ca plante ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Ol_App = CreateObject("Outlook.Application")
    Message d'erreur :
    Erreur d'execution 429 Un composant Active X ne peut pas créer d'objet

    Code entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
    Sub Resultat()
     
    ' Dimensionnement des variables----------------------------------------------------------------------------------------------------------------------------------------------------
    Dim LeNom As String, MonTo As String, strBody As String
    Dim LaLigne As Long, NbAd As Long, DerLig As Long, r As Long
    Dim MaRech As Range, rng As Range
    Dim S As Shape
    Dim MoisInt As Integer
    Dim Mois As String
    Dim XX As String
     
    Dim Ol_App As Object
    Dim Ol_Item As Object
     
     
    ' Récupère le tableau -------------------------------------------------------------------------------------------------------------------------------------------------------------
        Set rng = Nothing
        Set rng = Sheets("Résultat").UsedRange
    '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     MoisInt = Month(Date)
     Mois = MonthName(MoisInt, False)
     
     
    ' Envoi du mail via Outlook--------------------------------------------------------------------------------------------------------------------------------------------------------
    strBody = "Bonjour," & "<br>" & _
              "Voici les heures renseignées dans GLPI par les techniciens pour le mois de " & "<br>" & Mois
     
        On Error Resume Next: Set Ol_App = GetObject(, "Outlook.Application"): On Error GoTo 0
        If Ol_App Is Nothing Then Set Ol_App = CreateObject("Outlook.Application")
        Set OlNmSpace = Ol_App.GetNamespace("MAPI")
     
    Set Ol_Item = Ol_App.CreateItem(olMailItem)
     
    With Ol_Item
        .To = "x.y@societe.com"
        .Subject = "Rapport quotidien Helpdesk - Heure par Technicien" 'Défini le sujet du message
        .BodyFormat = olFormatHTML 'Défini le format du mail
        .HTMLBody = strBody & RangetoHTML(rng) 'Affecte le corps du message et lance la function pour insérer la "tableau"
        .Send 'Envoi le message !!cette procédure oblige une confirmation manuelle
    End With
     
    Set Ol_Item = Nothing 'Décharge
    Set Ol_App = Nothing 'Décharge
     
     ActiveWorkbook.Save
     
    End Sub
    Ya un truc qui m'échappe...

Discussions similaires

  1. Lancer cygwin via tache planifiée windows
    Par anodaim dans le forum Windows
    Réponses: 6
    Dernier message: 24/09/2012, 10h14
  2. lancement macro par tache planifiée
    Par arctica dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/11/2009, 11h45
  3. Tache planifié windows
    Par yidboulmane dans le forum Windows Forms
    Réponses: 20
    Dernier message: 05/11/2008, 18h09
  4. Tache planifiée windows
    Par Z3phur dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 07/05/2008, 12h53
  5. gbak et taches planifiées windows
    Par lio33 dans le forum Administration
    Réponses: 2
    Dernier message: 07/12/2005, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo