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 d'exécution 48 [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 222
    Par défaut erreur d'exécution 48
    Bonjour,
    Je possède 2 PC (1 fixe et 1 portable). Tous les deux sont sous Windows 10 avec Office 2010. Mes deux PC sont configurés de la même manière.

    Quand je déclenche ma macro avec mon fixe tout se passe bien alors que lorsque je la déclenche avec mon portable, j’ai ce msg d’erreur : « Erreur d’exécution ‘48’ – Erreur de chargement de la DLL »

    J’ai cherché sur le net mais je n’ai pas vraiment de solution à ce problème.

    Quelle est donc cette DLL afin que je puisse la coller dans mon portable.

    Ma macro est sensée ouvrir OUTLOOK afin d’envoyer par mail une feuille Excel enregistrée au format Pdf.

    Voici la ligne de commande où ça me met ce msg d’erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Contrôler dans Visual Basic/Outils/Références/que Microsoft Outlook --,- Object Librairy est bien coché
            Dim olapp As Outlook.Application
    Je tiens à préciser qu’au niveau des references dans VBA, tout est identique sur les 2 PC (outlook n’est pas manquant)

    Cordialement

  2. #2
    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,

    il est possible que tu ai développé ton projet sous une référence Microsot Outlook XX.X Object Library et que ton second environnement possède la référence YY.Y

    pour éviter ces problèmes de références, quand un projet est porté sur plusieurs machines, on peut travailler en liaison tardive afin de ne pas utiliser une librairie définie, mais la librairie disponible sur la machine utilisée

    la conversion n'est pas très compliquée, on utilise plus les objets "nommés" de Outlook, on passe par des variables Object et seulement à l'exécution on dis à VBA ce qu'est l'objet

    ainsi un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim olapp As Outlook.Application
    Set olapp = New Outlook.Application
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim olapp As Object
    Set olapp = CreateObject("Outlook.Application")
     
    'ici on créer un mail qu'on va envoyer
    With OlApp.CreateItem(0)
        .Subject = Sujet
        .Body = Corps
        .To = Destinataire
        .Send
    End With

    Il y a donc deux choses à veiller :

    - on va devoir soi-même désigner ce qu'est l'objet en le créant
    - nous n'avons plus accès aux constantes du modèle objet Outlook, raison pour laquelle j'ai mis en exemple la création d'un Item mail ... qui en liaison précoce accepte .CreateItem(olMailItem) mais qui en liaison tardive oblige à utiliser la constante numérique plutôt que la constante nommée (.CreateItem(0))


    Quand on a pas trop l'habitude des objets d'une librairie, on développer son projet en liaison précoce, on a ainsi accès aux constantes et à la saisie intuitive ... et quand le projet est bouclé on converti ça en liaison tardive (remplacement des constantes et gestion des objets à créer)


    Voici pour plus de détails : http://mhubiche.developpez.com/vba/f...endre/binding/

  3. #3
    Membre éprouvé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 222
    Par défaut
    Bonjour Joe et merci pour tes explications
    Donc pour résumé, voici le nouveau code :
    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
            'Envoi du mail
            'Contrôler dans Visual Basic/Outils/Références/que Microsoft Outlook --,- Object Librairy est bien coché
            'Dim olapp As Outlook.Application
            Dim olapp As Object
    Set olapp = CreateObject("Outlook.Application")
     
           'Contrôle la validité ou la présence d'adresse mail en B7
            Dim msg As MailItem
            Set olapp = New Outlook.Application
            Set msg = olapp.CreateItem(olMailItem)
            'Adresse de la cellule contenant la liste des adresses mails
            msg.To = Range("B7").Value
            'Envoi en copie
             msg.CC = " "
            'Envoi en copie cachée
            msg.BCC = " "
            'Saisir le sujet de l'envoi
            msg.Subject = "Fiche du processus " & Feuil9.Range("A2")
            'Saisie du message
            'Saisir Corps du message
            msg.Body = "Le xxx vous transmet la fiche de votre processus." & Chr(13) & Chr(13) & "En cas de désaccord avec les informations transmises, veuillez transmettre les correctifs au plus vite par mail uniquement à l'adresse suivante : xxxxx@gmail.com" & Chr(13) & Chr(13) & "En cas de non réponse de votre part sous 5 jours calendaires, la fiche sera considérée comme correcte." & Chr(13) & Chr(13) & Chr(13) & "Ci-joint la fiche concernant votre processus." & Chr(13) & Chr(13) & Chr(13) & "Respectueusement," & Chr(13) & "L'équipe xxx."
            'Adresse de la pièce jointe
            msg.Attachments.Add Source:=sNomPdf
     
            msg.Display
            'Transmission du message
            msg.Send
    Sinon comment dois je disposer ton code en remplacement du mien à partir de la ligne 8 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With olapp.CreateItem(0)
        .Subject = Sujet
        .Body = Corps
        .To = Destinataire
        .Send
    End With

  4. #4
    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
    Tu as mélangé liaison précoce et tardive

    ligne 4 et 5 tu crées ton objet Outlook.application via une nouvelle instance du client
    et ligne 9 tu repasses sur ta variable, en créant une nouvelle instance Outlook via une liaison précoce


    Quand on fait du Outlook dans Excel, c'est vraiment conseillé de décomposer les tâches récurrentes en sous-procédure

    voici une sous-procédure qui effectue le travail de créer un mail et de l'envoyer.
    il faut simplement que l'objet OlApp ai été crée par la procédure appelante ... là encore je passe personnellement par une sous-procédure

    Créer l'instance si elle n'existe pas (sinon on la récupère par un GetObject)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim olapp As Object
    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")
    End Sub
    Envoyer un mail, avec Sujet/Corps/Destinataire/Eventuelle pièce jointe (on peut ajouter des paramètres pour la mise en copie ou copie cachée si on veut ... et d'autres paramètres encore)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub EnvoiMail(ByVal Sujet As String, ByVal Corps As String, ByVal Destinataire As String, Optional Pj As String = "")
        With olapp.CreateItem(0)
            .Subject = Sujet
            .Body = Corps
            .To = Destinataire
            If Pj <> "" Then .Attachments.Add Pj
            .Send
        End With
    End Sub

    Et voici notre procédure appelante, elle est chargée de transmettre les ordres et les informations aux sous-procédures
    J'ai utilisé des variables optionnelles pour que l'appel de la fonction EnvoiMail soit simple pour toi à comprendre ... on peut parfaitement s'en passer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
    Dim UnSujet As String, UnDestinataire As String, UnCorps As String, UnePj As String
     
    InitialisationOutlook
        UnSujet = "Fiche du processus " & Feuil9.Range("A2").Value
        UnDestinataire = Range("B7").Value
        UnCorps = "Le xxx vous transmet la fiche de votre processus." & Chr(13) & Chr(13) & "En cas de désaccord avec les informations transmises, veuillez transmettre les correctifs au plus vite par mail uniquement à l'adresse suivante : xxxxx@gmail.com" & Chr(13) & Chr(13) & "En cas de non réponse de votre part sous 5 jours calendaires, la fiche sera considérée comme correcte." & Chr(13) & Chr(13) & Chr(13) & "Ci-joint la fiche concernant votre processus." & Chr(13) & Chr(13) & Chr(13) & "Respectueusement," & Chr(13) & "L'équipe xxx."
        UnePj = sNomPdf
    Call EnvoiMail(UnSujet, UnCorps, UnDestinataire, UnePj)
    End Sub


    Maintenant, t'as deux briques fondamentales qui tu peux utiliser partout dans ton projet, copier dans d'autres projets etc...
    tu n'as plus à te soucier de créer ou récupérer Outlook, ou envoyer un mail !


    Partant de là, c'est la porte ouverte à beaucoup de possibilités pour organiser des projets complexes

    Tiens, des exemples :
    Partant d'un Objet "dossier Outlook", ici on fait la sommes de toutes les éléments du dossier et de ses sous dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function SommeArbo(Undossier As Object, Optional ListeExclusion As Variant) As Long
    ' ListeExclusion est un Array composé de noms de dossiers qu'on ne voudrait pas inclure dans la somme
    Dim LeDossier As Object
    SommeArbo = Undossier.Items.Count
        For Each LeDossier In Undossier.Folders
            If Not IsMissing(ListeExclusion) Then
                If Not IsInArray(LeDossier.Name, ListeExclusion) Then SommeArbo = SommeArbo + LeDossier.Items.Count
            Else
                SommeArbo = SommeArbo + LeDossier.Items.Count
            End If
        Next LeDossier
    End Function
    Ici, on calcule le mail le plus ancien dans l'arborescence
    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
    Function PlusAncienArbo(Undossier As Object, Optional ListeExclusion As Variant) As Long
    Dim LeDossier As Object
     
    On Error Resume Next
        PlusAncienArbo = CLng(Date)
        If Undossier.Items.Count > 0 Then PlusAncienArbo = Application.Min(PlusAncienArbo, CLng(CDate(Left(Undossier.Items(Undossier.Items.Count).ReceivedTime, 10))))
            For Each LeDossier In Undossier.Folders
                If LeDossier.Items.Count > 0 Then
                    If Not IsMissing(ListeExclusion) Then
                        If Not IsInArray(LeDossier.Name, ListeExclusion) Then PlusAncienArbo = Application.Min(PlusAncienArbo, CLng(CDate(Left(LeDossier.Items(LeDossier.Items.Count).ReceivedTime, 10))))
                    Else
                        PlusAncienArbo = Application.Min(PlusAncienArbo, CLng(CDate(Left(LeDossier.Items(LeDossier.Items.Count).ReceivedTime, 10))))
                    End If
                End If
            Next LeDossier
    On Error GoTo 0
     
    If PlusAncienArbo = 0 Then PlusAncienArbo = CLng(Date)
    End Function
    Il y a une fonction utilisée dans ces deux fonctions : IsInArray (pour vérifier si un élément existe dans un array)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function IsInArray(ValeurCherchée As Variant, ArrayDeRecherche As Variant) As Boolean
    ' récupéré par auteur Inconnu || adaptée et commentée
    ' fonction qui vérifie si une chaine de caractère est dans un Array
    ' retourne Vrai si c'est dedans, sinon retourne Faux
        If Not IsArray(ArrayDeRecherche) Then Exit Function
        IsInArray = InStr(1, vbNullChar & Join(ArrayDeRecherche, vbNullChar) & vbNullChar, vbNullChar & ValeurCherchée & vbNullChar) > 0
    End Function
    Là, on fait la même chose, mais on ne travaille que dans le dossier, sans s'occuper de ses sous-dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function PlusAncienNonArbo(DossierRecherche As Object) As Long
    On Error Resume Next
        With DossierRecherche
            If .Items(.Items.Count).class = 43 Then
                PlusAncienNonArbo = CLng(CDate(Left(.Items(.Items.Count).ReceivedTime, 10)))
            Else
                PlusAncienNonArbo = CLng(CDate(Left(.Items(.Items.Count).CreationTime, 10)))
            End If
        End With
    On Error GoTo 0
     
    If PlusAncienNonArbo = 0 Then PlusAncienNonArbo = CLng(Date)
     
    End Function


    La porte ouverte à tout, j'ai dis

  5. #5
    Membre éprouvé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 222
    Par défaut
    Merci à toi Joe, pour tes reponses rapides et faciles a comprendre.
    Je teste tout çà sur mon portable et te tiens au courant fin d'aprem.

  6. #6
    Membre éprouvé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 222
    Par défaut
    Joe,

    Je constate que tu as donc créé 3 modules mais pour ma macro comment dois je procéder car celle-ci se déroule de la maniere suivante :
    Avant d'envoyer le mail, elle va renseigner une feuille à partir de plusieurs feuilles, cette feuille renseignée se nomme "Synthese", ensuite la macro enregistre cette feuille au format Pdf pour ensuite la transmettre par mail mais ma macro ne se termine pas là, car ensuite, elle va imprimer cette feuille "synthese" puis enfin vider la feuille "synthese" des renseignements qui y ont ete mis par le biais de ma macro.
    voici mon code, je n'ai pas mis le debut car trop long
    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
        If Mail = "Oui" Then
            'Création du Pdf
            Dim sNomPdf As String
            Dim sDossier As String
            Dim Destinataire As String
     
            sDossier = ThisWorkbook.Path
     
            sNomPdf = sDossier & "\" & "Synthese du processus " & Feuil9.Range("A2") & " _ Extraction du " & _
                      Replace(Replace(Replace(Left(Now, 16), ":", "h"), " ", " à "), "/", "-") & ".pdf"
     
            Feuil9.ExportAsFixedFormat _
                    Type:=xlTypePDF, _
                    Filename:=sNomPdf, _
                    Quality:=xlQualityStandard, _
                    IncludeDocProperties:=True, _
                    IgnorePrintAreas:=False, _
                    OpenAfterPublish:=False
     
    *
            'Envoi du mail
            On Error Resume Next: Set olapp = GetObject(, "Outlook.Application"): On Error GoTo 0
        If olapp Is Nothing Then Set olapp = CreateObject("Outlook.Application")
     
     
          End If
     
        'Procédure de demande d impression
        If Imprim = "OUI" Then
     
            ActiveWindow.SelectedSheets.PrintOut Copies:=NbreCopie
            End If
     
     
        ' Reprise de la macro jusqu'à la fin des processus sélectionnés
     
     
     
        'Affichage feuille
        Application.ScreenUpdating = True
     
        'Protection de la feuille
        ActiveSheet.Protect
        Range("A9").Select
    /est il possible de mettre les codes de tes 3 modules dans ma macro à partir de la ligne 22 ou pas ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JVM][8.1.7] Erreur d'exécution de initjvm.sql
    Par Escuzze dans le forum Oracle
    Réponses: 4
    Dernier message: 01/07/2005, 15h39
  2. Message d'erreur à l'exécution d'une install
    Par titof dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 22/03/2005, 11h20
  3. [CR8][VB6] Erreur d'exécution 20533
    Par pvava dans le forum SDK
    Réponses: 1
    Dernier message: 01/02/2005, 10h27
  4. Erreurs d'exécution sous delphi 5
    Par nkd dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2004, 17h25
  5. [Apache Perl] Erreur à l'exécution de mes cgi
    Par GLDavid dans le forum Apache
    Réponses: 4
    Dernier message: 28/08/2004, 20h23

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