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 :

Commande SQL / Word et macro Excel [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut Commande SQL / Word et macro Excel
    Bonjour à toutes et tous,

    J'ai créé un publipostage sous Word 2016 pour réaliser des étiquettes. Les champs sont alimentés par un fichier Excel nommé Base Étiquettes dans lequel sont copiées (par une macro " Export_Étiquettes ") les données d'un TCD qui se trouve dans mon fichier principal.

    Quand j'ouvre le fichier Word en double cliquant dessus depuis l'explorateur Windows, le ficher s'ouvre et un message apparaît disant " L'ouverture de ce document exécute la commande SQL suivante SELECT*FROM 'Feuil1$' ", ce qui à mon sens est normal puisque il va chercher les données des champs du fichier Base Étiquettes.
    En répondant oui au message, le fichier s'ouvre avec les champs mis à jours.
    Jusque là pas de problème.

    En revanche, c'est la macro ci dessous qui me pose problème.

    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
    Sub Ouverture_Etiquettes_Word()
    'Ouvre le fichier Word Etiquettes.docx
    'dont le chemin est renseigné cellule T6 dans feuille Accueil et dont le nom est cellule AA9 même feuille
     
    Dim Chemin_Fichier_Etiquettes_Word
    Dim Nom_Fichier_Etiquettes_Word
    Dim Adresse_Fichier_Etiquettes_Word
    Dim WordApp As Object
    Dim WordDoc As Object
     
        Chemin_Fichier_Etiquettes_Word = ThisWorkbook.Worksheets("accueil").Range("T6").Value
        Nom_Fichier_Etiquettes_Word = ThisWorkbook.Worksheets("accueil").Range("AA9").Value
        Adresse_Fichier_Etiquettes_Word = Chemin_Fichier_Etiquettes_Word & "\" & Nom_Fichier_Etiquettes_Word
        Debug.Print Adresse_Fichier_Etiquettes_Word
     
        Set WordApp = CreateObject("Word.Application")
        With WordApp
        Set WordDoc = .Documents.Open(Adresse_Fichier_Etiquettes_Word)
         .Visible = True
         .Activate
        End With
     
    Set WordApp = Nothing
    End Sub
    1) L'ouverture du fichier est très longue alors que pour mes tests je n'ai que 7 étiquettes. Chaque étiquette est composée de 8 champs. Une page peut contenir 18 étiquettes.
    2) Lorsque le fichier veut bien s'ouvrir, il n'est pas mis à jour (ce qui est normal car dans ma macro il n'y a pas d'instruction pour exécuter la commande SQL) et la fonction Publipostage n'est pas active.


    Une solution pour exécuter la commande SQL serait la bien venue (je n'ai pas trouvé ou su trouver la réponse à mon problème).

    Dans l'outil que je développe, je pourrais me passer de cette macro, l'utilisateur pourrais aller ouvrir le fichier Word via l'explorateur. Mais je voudrais me coucher moins bête.

    Merci à vous

    Philippe

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Bonjour

    Je n'ai pas de réponse à cette question, par contre, j'ai un conseil .

    Il y a deux méthodes de déclaration des applications externes (ici Word).
    Le Late et le Early Binding.
    Dans ton cas tu utilises le Late Binding qui a l'avantage d'éviter les problèmes de compatibilité et d'activation des Références.

    Mon conseil est le suivant, durant la phase de création du code, utilise plutôt le Early Binding.
    C'est à dire, va dans le menu Outils de VBE, puis "Références...". Dans la liste qui s'ouvre recherche et coche "Microsoft Word ....".

    Pour déclarer les variables il suffit maintenant de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim AppWord As New Word.Application
    Dim DocWord As Word.Document
    La ligne suivant n'est plus nécessaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set WordApp = CreateObject("Word.Application")
    Si je te fais faire ça, ça n'est pas pour simplifier quoi que ce soit mais pour permettre à VBE d'utiliser l’auto-complétion, c'est à dire la capacité de VBE à te proposer les méthodes, variables, ... disponible à la suite d'un point
    Par exemple si par la suite je tape
    VBE va ouvrir ça petite fenêtre qui propose tout ce qu'il est possible de mettre à la suite et ça, pour moi, c'est un régal pour rechercher quelques choses.

    Autre outil qui est super intéressant de connaitre à mon sens et qui va se nourrir de l'activation de la Référence, c'est l'explorateur d'objet, touche F2 (il est aussi dans les menu de VBE).
    Cet outil permet d'explorer comme son nom l'indique les objets, en haut à gauche tu peux limiter la recherche à Word, puis juste en dessous taper le mot clef qui t’intéresse et voir les variable ou méthodes qui y font référence. Et bien plus encore je te laisse fouiner.

    Sans oublier la possibilité d'utiliser l'aide en référence à Word avec la touche F1, qui du coup s'active également

    Pour ton problème de SQL, je n'ai rien trouvé de probant... mais ça reste à connaitre

    Une fois le code réalisé, tu pourras si besoin remettre les déclarations en Late Binding pour faciliter son déploiement.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut
    Bonjour Qwazerty,

    Je n'ai pas de réponse à cette question, par contre, j'ai un conseil .
    Merci pour tes conseils.
    Je vais regarder ceci.


    Mais le problème reste entier.

    Philippe

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut
    Bonjour à toutes et tous,

    Je réactive ce post n'ayant trouvé aucune solution à mon problème.

    Ci dessous le code initial modifié suites aux remarques de Qwazerty.
    Ce code fonctionne mais le problème reste entier.

    1) L'ouverture du fichier est très longue alors que pour mes tests je n'ai que 7 étiquettes. Chaque étiquette est composée de 8 champs. Une page peut contenir 18 étiquettes.
    2) Lorsque le fichier veut bien s'ouvrir, il n'est pas mis à jour (ce qui est normal car dans ma macro il n'y a pas d'instruction pour exécuter la commande SQL) et la fonction Publipostage n'est pas active.

    Une solution pour exécuter la commande SQL serait la bien venue.

    Sub Ouverture_Etiquettes_Word_1()
    'Le 09/05 Suite à réponse de Qwazerty marche mais n'ouvre pas le fichier word actualisé
    'Ouvre le fichier Word Etiquettes.docx
    'dont le chemin est renseigné cellule T6 dans feuille Accueil et dont le nom est cellule AA9 même feuille

    Dim Chemin_Fichier_Etiquettes_Word
    Dim Nom_Fichier_Etiquettes_Word
    Dim Adresse_Fichier_Etiquettes_Word
    'Dim WordApp As Object 'Qwazerty me le fait sortir
    'Dim WordDoc As Object 'Qwazerty me le fait sortir
    Dim AppWord As New Word.Application 'Qwazerty
    Dim DocWord As Word.Document 'Qwazerty

    Chemin_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("T6").Value
    Nom_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("AA9").Value
    Adresse_Fichier_Etiquettes_Word = Chemin_Fichier_Etiquettes_Word & "\" & Nom_Fichier_Etiquettes_Word
    Debug.Print Adresse_Fichier_Etiquettes_Word

    'Set WordApp = CreateObject("Word.Application") 'Qwazerty me le fait sortir
    'With WordApp
    With AppWord

    'Set WordDoc = .Documents.Open(Adresse_Fichier_Etiquettes_Word)
    Set DocWord = .Documents.Open(Adresse_Fichier_Etiquettes_Word)
    .Visible = True
    .Activate

    End With

    'Set WordApp = Nothing
    Set AppWord = Nothing

    End Sub
    Merci

    Philippe

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Toujours pas de réponse mais une proposition.
    Va dans ton fichier Word, lance l'enregistreur de Macro (onglet développeur à activer dans le menu Word).
    Fait les manipulation nécessaire à la mise à jour de ta requête SQL.
    Arrêtes l'enregistrement de la macro et va regarder ce qu'il a écrit comme code.
    Il suffira ensuite de trouver l'équivalence dans l'objet AppWord de ton code VBA Excel.

    Sinon, s'il s'agit juste de lancer le fichier Word sans avoir à faire d’interaction avec celui-ci via le code VBA Excel, tu peux utiliser ShellExecute.
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut
    Bonjour Qwazerty,

    Merci, je me penche dessus dans la semaine.

    Philippe

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut Pas tout à fait résolu
    Bonjour,

    Après voir farfouillé un peu partout j'ai finalement adapté mon code. La procédure de publipostage est le fruit de mes recherche sur le forum mais je ne me rappelle pas du nom de son auteur (merci à lui).

    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
    50
    51
    Sub Ouverture_Etiquettes_Lait()
    'Le 24/05 Fonctionne, ouvre le fichier de publipostage Etiquettes Lait.docx,
    'MAIS crée en plus un doc nommé Lettres Types 1 - Word,
    'Réalise publipostage
    'Ferme Etiquettes Lait.docx
    'MAIS LAISSE OUVERT LE FICHIER NOMME "Lettres Types 1 - Word"
     
    Application.ScreenUpdating = False
     
    'Dim Nom_Fichier_Etiquettes_Word               ' Fonctionne sans ces 2 lignes
    'Dim Adresse_Fichier_Etiquettes_Word As String
    Dim AppWord As New Word.Application 'Qwazerty
    Dim DocWord As Word.Document 'Qwazerty
    Dim Base As String
     
     
        Nom_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("AA9").Value
        Adresse_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("AA10").Value
        Debug.Print Adresse_Fichier_Etiquettes_Word
     
        Base = ThisWorkbook.WorkSheets("accueil").Range("AA8").Value 'Fichier source publipostage
     
        With AppWord
     
    '*************************************************************************************************
    '                                          Procédure publipostage
    '*************************************************************************************************
         Set DocWord = AppWord.Documents.Open(Adresse_Fichier_Etiquettes_Word, ReadOnly:=False) 'Récupération du modèle Etiquettes.docx
         .Visible = True
         '.Activate 'si je ne le mets pas cela permet de "figer" l'écran / remplace Application.ScreenUpdating = True
     
            With DocWord.MailMerge
            .OpenDataSource Name:=Base, Connection:="Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & Base & "; ReadOnly=True;", SQLStatement:="SELECT * FROM [Feuil1$]"
            .SuppressBlankLines = True 'Suppression des lignes blanches
     
                With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
                End With
     
        'Exécute l'opération de publipostage
            .Execute Pause:=False
            End With
     
          End With
     
    DocWord.Close False 'ferme le fichier Etiquettes Lait.docx
     
    'AppWord.Quit 'fonctionne mais ferme tous les fichiers en demandant pour chaque si on veut enregistrer
    End Sub
    Je réussi à ouvrir le fichier Word de publipostage "Etiquettes Lait.docx" avec mise à jour des champs. Donc la procédure exécute bien la commande SQL suivante SELECT*FROM 'Feuil1$' " qui me bloquait.

    En revanche, je me retrouve avec 2 fichiers Word ouverts.
    - Le bon fichier "Etiquettes Lait.docx", c'est à dire celui que je veux. C'est à partir de ce fichier que j'imprime les étiquettes.

    - Un fichier nommé "Lettres Types 1 - Word", qui est le reflet exact du fichier "Etiquettes Lait.docx". Dans le code ci-dessus, je ne vois nulle part comment ce fichier indésirable se crée.
    De plus, sur ce fichier si je peux faire de la saisie de texte, je ne peux rien faire de plus (les onglets ne sont pas accessibles, je ne peux accéder à l'impression, etc.)?. Je ne peux le fermer uniquement que par la croix en haut à droite et là il m'est demandé si je veux enregistrer ou non le fichier.
    Bien entendu, ce fichier que je qualifie de "fantôme" ne me sert à rien, si ce n'est de polluer ma macro.
    J'ai bien essayé de le faire fermer dans ma macro, mais je n'ai pas trouvé comment faire.

    Ma demande initiale de cette discussion était de pouvoir ouvrir un fichier de publipostage avec exécution de la commande SQL.

    Aujourd'hui ma demande évolue :
    - Comment empêcher la création de ce fichier "fantôme" ?
    - Et si on ne peut le faire, comment peut-on le fermer en ne laissant ouvert que le bon fichier ?

    Si il faut que j'ouvre une nouvelle discussion à ce propos merci de me le dire.

    Merci pour votre aide.

    Philippe

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Le mieux est d'exécuter ton code en mode pas à pas (lancement de la macro via la touche F8. A chaque appui de la touche F8, le programme avance d'un pas. Il te suffit de regarder à quel moment ce fichier apparait.
    Met en commentaire la ligne screenupdating = false


    'AppWord.Quit 'fonctionne mais ferme tous les fichiers en demandant pour chaque si on veut enregistrer
    Essai en lui passant des paramètres
    Nom : 2018-05-25_182054.png
Affichages : 1878
Taille : 2,8 Ko

    Si ça ne fonctionne pas essai en encadrant le code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False/True
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut Le mystère reste entier
    Bonjour Qwazerty

    Merci pour ces différentes pistes.

    Essai en lui passant des paramètres
    J'avais déjà tenté Dim AppWord As Word.Application.
    Cela génère un bug ligne 30 ==> "Variable objet ou variable de bolc With non définie (Erreur 91)"

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Sub Ouverture_Etiquettes_Lait()
    'Le 24/05 Fonctionne, ouvre le fichier de publipostage Etiquettes Lait.docx,
    'MAIS crée en plus un doc nommé Lettres Types 1 - Word,
    'Réalise publipostage
    'Ferme Etiquettes Lait.docx
    'MAIS LAISSE OUVERT LE FICHIER NOMME "Lettres Types 1 - Word"
     
    'Application.ScreenUpdating = False
     
    'Application.EnableEvents = False 'Qwazerty / n'apporte rien de plus
     
    'Dim Nom_Fichier_Etiquettes_Word               ' Fonctionne sans ces 2 lignes
    'Dim Adresse_Fichier_Etiquettes_Word As String
    Dim AppWord As New Word.Application 'Qwazerty
    Dim DocWord As Word.Document 'Qwazerty
    Dim Base As String
    'Dim AppWord As Word.Application 'Qwazerty ' génère bug ligne Set DocWord = AppWord.Do...... "Variable objet ou variable de bolc With non définie (Erreur 91)"
     
        Nom_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("AA9").Value
        Adresse_Fichier_Etiquettes_Word = ThisWorkbook.WorkSheets("accueil").Range("AA10").Value
        Debug.Print Adresse_Fichier_Etiquettes_Word
     
        Base = ThisWorkbook.WorkSheets("accueil").Range("AA8").Value 'Fichier source publipostage
     
        With AppWord
     
    '*************************************************************************************************
    '                                          Procédure publipostage
    '*************************************************************************************************
         Set DocWord = AppWord.Documents.Open(Adresse_Fichier_Etiquettes_Word, ReadOnly:=False) 'Récupération du modèle Etiquettes.docx
         .Visible = True    'C'est à partir de là que s'ouvre le fichier Fichier_Etiquettes_Lait ne laissant apparaître que les champs _
                            l'onglet Publipostage n'est pas actif
     
         '.Activate 'si je ne le mets pas cela permet de "figer" l'écran / remplace Application.ScreenUpdating = True
     
            With DocWord.MailMerge
            .OpenDataSource Name:=Base, Connection:="Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & Base & "; ReadOnly=True;", SQLStatement:="SELECT * FROM [Feuil1$]"
            .SuppressBlankLines = True 'Suppression des lignes blanches
     
                With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
                End With    'A ce niveau l'opération de publipostage n'a pas commencée / _
                            le fichier Fichier_Etiquettes_Lait ne laisse toujours qu'apparaître que les champs
     
        'Exécute l'opération de publipostage
            .Execute Pause:=False 'C'est ici que se crée en plus le doc nommé Lettres Types 1 - Word avec les résultats du publipostage _
                                   l'onglet Publipostage est actif tant que le fichier Etiquettes Lait.docx n'est pas fermé _
                                   et le fichier Etiquettes Lait.docx ne laisse apparaître que les champs (et non les résultats du publipostage) _
                                   mais l'onglet Publipostage est actif
            End With
     
          End With
     
    'Application.EnableEvents = True 'Qwazerty / n'apporte rien de plus
     
    'DocWord.Close False 'ferme le fichier Etiquettes Lait.docx
     
    'AppWord.Quit (SaveChanges = False) 'fonctionne mais ferme tous les fichiers en demandant pour chaque si on veut enregistrer
    End Sub
    Si ça ne fonctionne pas essai en encadrant le code par Application.EnableEvents = False/True
    Cela n'apporte rien de plus.

    exécuter ton code en mode pas à pas
    J'ai pu apporter des commentaires à différents endroits du code lors du pas à pas. C'est au moment de l’exécution de la ligne 48 que le fameux fichier indésirable apparaît.


    Le mystère reste entier.
    Je continue à farfouiller.

    Philippe

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Citation Envoyé par Phil333250 Voir le message
    J'avais déjà tenté Dim AppWord As Word.Application.
    Cela génère un bug ligne 30 ==> "Variable objet ou variable de bolc With non définie (Erreur 91)"
    Ça n'est pas ce que je voulais dire, si tu enlève New, aucune instance n'est créée donc il est normal que tu es une erreur lors de l'utilisation de la variable AppWord qui du coup ne pointe sur rien.

    Quand tu ouvres un fichier Word à la main, windows ouvre une instance de Word et charge le fichier dedans
    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim AppWord As Word.Application
    tu crées un objet qui est une coquille vide, capable de recevoir une instance de Word.
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim AppWord As New Word.Application
    'ou 
    Set AppWord = New Word.Application
    L'une ou l'autre de ces lignes ouvre une instance de Word, le programme Word est ouvert.
    Dans la suite de ton code, tu ouvres un document Word, via cette instance, c'est comme si tu ouvrais Word.exe (création de l'instance), puis que tu allais dans Fichier, Ouvrir. Tu ouvre un document via l'instance Word.

    Bref dans mon message précédent, j'attirais ton attention sur les paramètres de la méthode Quit proposés par l'autocomplétion du code (l'encadré jaune).
    Nom : 2018-05-25_182054.png
Affichages : 1891
Taille : 2,8 Ko
    Tu devrais essayer de mettre SaveChange à False
    Pour le publipostage, je vais regarder, n'y a-t-il pas des paramètres qui peuvent être passés à .Execute .... ?
    Si tu fais la manip à la main dans Word, tu es sûr qu'il n'ouvre pas lui aussi un nouveau fichier contenant le publipostage?
    Regarde également si .Execute ne retourne pas un pointeur vers ce nouveau Fichier, c'est souvent le cas, comme le .open qui retourne un pointeur vers le document qu'il est sensé ouvrir.

    [Edit]
    Pour MailMerge, regardes la documentation
    Citation Envoyé par Aide VBA
    Référence du développeur Word
    MailMerge, objet

    Représente la fonction de publipostage de Word. Remarques

    Pour renvoyer l'objet MailMerge, utilisez la propriété MailMerge. L'objet MailMerge est toujours disponible, que l'opération de publipostage ait commencé ou non. Pour déterminer l'état de l'opération de fusion et de publipostage, utilisez la propriété State. L'exemple suivant montre comment exécuter une opération de publipostage si le document actif est un document principal auquel une source de données est associée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If ActiveDocument.MailMerge.State = wdMainAndDataSource Then
        ActiveDocument.MailMerge.Execute
    End If
    L'exemple suivant montre comment fusionner le document principal avec les trois premiers enregistrements de la source de données associée et envoyer les résultats à l'imprimante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Set myMerge = ActiveDocument.MailMerge
    If myMerge.State = wdMainAndSourceAndHeader Or _
        myMerge.State = wdMainAndDataSource Then
        With myMerge.DataSource
            .FirstRecord = 1
            .LastRecord = 3
        End With
    End If
    With myMerge
        .Destination = wdSendToPrinter
        .Execute
    End With
    Et

    Citation Envoyé par Aide VBA
    Référence du développeur Word
    MailMerge.Destination, propriété

    Renvoie ou définit la destination du résultat de la fusion. Type de données WdMailMergeDestination en lecture-écriture. Syntaxe
    expression.Destination
    expression Obligatoire. Variable qui représente un objet MailMerge.
    Exemple

    Cet exemple envoie le résultat d'une opération de fusion et publipostage dans un nouveau document.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim mmTemp As MailMerge
     
    Set mmTemp = ActiveDocument.MailMerge
     
    If mmTemp.State = wdMainAndDataSource Then
        mmTemp.Destination = wdSendToNewDocument
        mmTemp.Execute
    End If
    Tu ne sembles pas définir Destination dans ton code, donc à mon avis par défaut il utilise wdSendToNewDocument

    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut
    Re,

    Merci beaucoup tu m'as remis sur le bon chemin.
    Je me focalisai sur ma pratique (plus que décennale) du publipostage sur Word en oubliant un élément important que je n'appliquai pas dans cette dite pratique.

    C'est cette remarque qui m'a fait tilt.
    Si tu fais la manip à la main dans Word, tu es sûr qu'il n'ouvre pas lui aussi un nouveau fichier contenant le publipostage?
    Dans ma pratique je ne finalisai jamais la procédure. C'est à dire que je réalisai le process d'import des données via la base Excel, j'imprimai ce que je souhaitai et fermai le fichier sans enregistrer.
    Et c'est comme cela que j'ai fait pour aborder ma macro.

    En fait, ce que j'appelai un fichier "fantôme", n'en est pas un, ce n'est que la génération du fichier finalisé du publipostage.
    Fichier que l'on obtient quand on termine le process de publipostage par la fonction "terminer & fusionner" accessible depuis l'onglet publipostage.

    Nom : onglet publipostage.jpg
Affichages : 1976
Taille : 56,5 Ko

    Donc j'ai modifié mon code en supprimant la ligne 48. Ainsi le process ne se termine pas et j'ai donc qu'un seul fichier, celui que je souhaitai avoir. et en mettant à la place le code suivant :

    .ViewMailMergeFieldCodes = wdToggle ===>qui permet d'afficher les résultats et non les champs de publipostage.

    Je suis satisfait, j'ai beaucoup appris (une fois de plus).

    Merci beaucoup Qwazerty pour ton aide précieuse.

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

Discussions similaires

  1. [XL-2007] Rechercher et afficher un text dans un fichier Word avec macro Excel
    Par ypelissier dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/03/2012, 17h51
  2. Démarrer macro Word depuis macro Excel
    Par nashiboy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/12/2009, 21h02
  3. Utliser la Commande DTEXEC depuis une macro EXCEL
    Par monseg dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/10/2009, 16h28
  4. Réponses: 4
    Dernier message: 29/11/2007, 00h07
  5. Comment ouvrir word depuis macro excel ?
    Par megapacman dans le forum VBA Word
    Réponses: 4
    Dernier message: 15/11/2006, 16h59

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