Remplacer un texte dans Word par une variable Excel

Jilde

XLDnaute Occasionnel
Bonjour à tous ;) !!

Voilà maintenant quelques jours que je me prends la tête à développer une machine à gaz pour ma boite.
Et jusqu'à maintenant, je m'en suis pas trop mal tirer !

La machine en question :
On alimente une base de données sous Excel.
Lorsqu'on a fini de remplir une ligne (nom, prénom, N° de sécu, Société, etc ...) :
1/ on clique sur un bouton,
2/ ça génère entre 4 et 6 fichiers à partir de modèles Word,
3/ ça renomme ces fichiers en fonction des données de la base (nom et prénom par ex),
4/ ça crée un répertoire au nom du client et ça met tous les fichiers Word dedans.

Jusque là, tout va bien, ça marche grâce aux infos que j'ai pu trouver sur ce sacré forum !

Mais maintenant, je bloque ...

Dans chacun des fichiers créés, je souhaite remplacer du texte par des valeurs de la base Excel.
J'ai donc créé des variables reprenant les valeurs de certaines cellules, mais je n'arrive pas à remplacer le texte dans Word par les valeurs de la base Excel ...

Je peux pas joindre les fichiers car ils sont assez important et contiennent des infos confidentielles.

Mais voici une partie du code :
Code:
'Déclaration, affectation et vérification de la variable extraite de la base Excel
'Intersection de la ligne active et de la colonne 14
Dim New_Text
New_Text = Cells(ActiveCell.Row, 14)
MsgBox "Le nouveau texte est :" & New_Text

'On définit un objet Word  :
Set WordApp = CreateObject("Word.application")

'On ouvre le fichier Word "New_Fichier" qui a été créé précédemment :
Set WordDoc = WordApp.Documents.Open(New_Fichier_1er_M3)

'On met Word au premier plan (True) durant la procédure pour voir ce qu'il s'y passe ...
WordApp.Visible = True
            
'C'est à partir de là ou ça merdouille ...
'Recherche dans le document Word le texte à remplacer
WordApp.Selection.Find.ClearFormatting
WordApp.Selection.Find.Text = "TEXTE_A_REMPLACER"

'Remplace le texte à remplacer par le nouveau texte
WordApp.Selection.Find.Replacement.ClearFormatting
WordApp.Selection.Find.Replacement.Text = New_Text

WordApp.Selection.Find.Execute Replace:=Word.WdReplace.wdReplaceAll


'On enregistre et on ferme le document word
WordDoc.Close True
'On laisse au systeme le temps d'enregistrer le fichier
DoEvents

'On quitte Word :
WordApp.Quit

'On vide les objets WordApp & WdDoc :
Set WordApp = Nothing
Set WordDoc = Nothing

Jusqu'à l'ouverture du fichier Word, tout va bien, mais après, Vb me dit "Objet requis" et stoppe.
Mon fichier reste ouvert, mais rien n'a été remplacer dedans ...

Alors je fais appel aux pros du VB pour avoir un coup de main !
S'il vous manque des infos, je ne suis pas loin.

Merci d'avance :; !!
 

Jilde

XLDnaute Occasionnel
Re : Remplacer un texte dans Word par une variable Excel

'lut vbacrumble ;) !

Bah le pb c'est que y'a trois tonnes de code, dont les trois quarts de commentaires et de MsgBox pour que je retrouves mes petits, et donc je crains que ça embrouille plus que ça n'éclaircisse le pb ...
Vous êtes prévenus !!!
Alors, pour ceux qui n'ont pas peur de devenir fou :
Code:
Sub Creation_Dossier()
'Si on on n'est pas sur une fiche de la base on sort de la procedure :
    If ActiveCell.Value = "" Or ActiveCell.Row = 1 Then 'Exit Sub
        MsgBox "La cellule active est vide ou est un en-tête de colonne." & Chr(13) & _
        "La commande a été annulée."
        Exit Sub
    Else
    End If
'Definition du chemin du dossier de travail (chemin seul)
Dim Chemin_Dossier As String
Chemin_Dossier = ThisWorkbook.Path
'Vérification du chemin enregistré
'MsgBox "Le fichier actuel se trouve dans le répertoire '" & Chemin_Dossier & "'"

'Definition du nom du dossier client à créer (nom seul)
Dim Nom_Dossier
Set Nom_Dossier = Cells(ActiveCell.Row, 2)
'Vérification du nom du dossier à créer
'MsgBox "Le nom du dossier à créer est '" & Nom_Dossier & "'"

'Définition complète du dossier client à créer (chemin + nom)
Dim Dossier
Dossier = Chemin_Dossier & "\" & Nom_Dossier
'Vérification du nom complet du dossier à créer
'MsgBox "Le nom COMPLET du dossier à créer est '" & Dossier & "'"

'Création du dossier client
Dim fso ' As Scripting.FileSystemObject
Dim fd ' As Scripting.Folder
Set fso = CreateObject("Scripting.FileSystemObject")
'Vérification de l'exsitance du dossier à créer
If Not fso.folderexists(Dossier) Then
    'fso.copyfolder Dossier_Modele, Dossier
    MkDir Dossier
    'Set fd = fso.créatefolder(Dossier)
    MsgBox "Le dossier " & Dossier & " a été créé"
Else
    Msg = "ATTENTION : Le dossier :" & Chr(13) & _
    Dossier & Chr(13) & _
    "existe déjà !" & Chr(13) & _
    "Êtes-vous sûr de vouloir continuer la copie des documents ?" & Chr(13) & _
    "Si vous continuez, les nouveaux documents écraseront les éventuels fichiers existants dans ce dossier."
    Style = vbYesNo + vbCritical + vbDefaultButton1
    Title = "> DOSSIER EXISTANT !!! <"
    Réponse = MsgBox(Msg, Style, Title, Help, Context)
        If Réponse = vbNo Then
            Exit Sub
        End If
End If

'Déclaration et définition des variables à copier dans Word
Dim Date_Commande 'Date de la Lettre de Commande
Date_Commande = Cells(ActiveCell.Row, 1)
MsgBox "Date de commande :" & Date_Commande
Dim Client_RV1 'Date du premier RDV
Client_RV1 = Cells(ActiveCell.Row, 26)
MsgBox "1er RDV :" & Client_RV1
Dim Client_RV1_Heure 'Heure du premier RDV
Client_RV1_Heure = Format(Cells(ActiveCell.Row, 33), "hh:mm")
'Client_RV1_Heure = Cells(ActiveCell.Row, 33)
MsgBox "1er RDV Heure :" & Client_RV1_Heure
Dim Client_RV2 'Date du second RDV
Client_RV2 = Cells(ActiveCell.Row, 27)
MsgBox "2nd RDV :" & Client_RV2
Dim Client_RV3 'Date du troisième RDV
Client_RV3 = Cells(ActiveCell.Row, 28)
MsgBox "3ème RDV :" & Client_RV3
Dim Client_RV4 'Date du quatrième RDV
Client_RV4 = Cells(ActiveCell.Row, 29)
MsgBox "4ème RDV :" & Client_RV4
Dim Client_RV5 'Date du cinquième RDV
Client_RV5 = Cells(ActiveCell.Row, 30)
MsgBox "5ème RDV :" & Client_RV5
Dim Client_RV6 'Date du sixième RDV
Client_RV6 = Cells(ActiveCell.Row, 31)
MsgBox "6ème RDV :" & Client_RV6
Dim Client_RV7 'Date du septième RDV
Client_RV7 = Cells(ActiveCell.Row, 32)
MsgBox "7ème RDV :" & Client_RV7
Dim Date_Fin_LC_Calculee 'Date de commande + 90 jours prenant en compte WE et jours fériés
Date_Fin_LC_Calculee = Cells(ActiveCell.Row, 3)
MsgBox "Date de finde LC calculée :" & Date_Fin_LC_Calculee

Dim Site_Realisation 'Site où va se réaliser la prestation
Site_Realisation = Cells(ActiveCell.Row, 6)
MsgBox "Site :" & Site_Realisation
Dim Consultant_Initiales 'Initiales du consultant 
Consultant_Initiales = Cells(ActiveCell.Row, 34)
MsgBox "Initiales du consultant :" & Consultant_Initiales
Dim Consultant_Nom 'Nom du consultant 
Consultant_Nom = Cells(ActiveCell.Row, 35)
MsgBox "Nom & prénom du consultant :" & Consultant_Nom
Dim Consultant_Mail 'Mail du consultant 
Consultant_Mail = Cells(ActiveCell.Row, 36)
MsgBox "Mail du consultant :" & Consultant_Mail

Dim Agence 'Agence du bénéficiaire
Agence = Cells(ActiveCell.Row, 8)
MsgBox "Agence :" & Pole_Emploi_Agence
Dim Conseiller_Nom 'Nom du conseiller du bénéficiaire
Conseiller_Nom = Cells(ActiveCell.Row, 9)
MsgBox "Nom du conseiller :" & Conseiller_Nom
Dim Conseiller_Prenom 'Prénom du conseiller du bénéficiaire
Conseiller_Prenom = Cells(ActiveCell.Row, 10)
MsgBox "Prénom du conseiller :" & Conseiller_Prenom
Dim Lettre_Comm ' Référence de la Lettre de Commande
Lettre_Comm = Cells(ActiveCell.Row, 13)
MsgBox "Référence de la Lettre de Commande :" & Lettre_Comm

Dim Module_Entree 'Module d'entrée du bénéficiaire
Module_Entree = Cells(ActiveCell.Row, 14)
MsgBox "Module d'entrée du bénéficiaire :" & Module_Entree
Dim Client_EC 'Titre du bénéficiaire (Mademoiselle, Madame ou Monsieur)
Dim Client_Nom 'Nom du bénéficiaire
Dim Client_Prenom 'Prénom du bénéficiaire
Dim Client_Identifiant 'Identifiant Pole Emploi du bénéficiaire
Client_EC = Cells(ActiveCell.Row, 16)
Client_Nom = Cells(ActiveCell.Row, 17)
Client_Prenom = Cells(ActiveCell.Row, 18)
Client_Identifiant = Cells(ActiveCell.Row, 19)
MsgBox "Bénéficiaire :" & Client_EC & " " & Client_Nom & " " & Client_Prenom & " (Id : " & Client_Identifiant & ")"

'Definition du chemin du dossier modèle source
Dim Dossier_Modele As String
Dossier_Modele = ThisWorkbook.Path & "\Base_Documents"
'MsgBox "Les fichiers de base se trouvent dans le répertoire : '" & Dossier_Modele & "'"

'Définition des fihciers sources
Dim Fichier_1er_M1
Dim Fichier_1er_M3
Dim Fichier_M1
Dim Fichier_M2
Dim Fichier_M3
Dim Fichier_Bilan
Dim Fichier_Stat
Fichier_1er_M1 = Dossier_Modele & "\01-M2C-1er-M1.dot"
Fichier_1er_M3 = Dossier_Modele & "\01-M2C-1er-M3.dot"
Fichier_M1 = Dossier_Modele & "\02-M2C-M1.dot"
Fichier_M2 = Dossier_Modele & "\03-M2C-M2.dot"
Fichier_M3 = Dossier_Modele & "\04-M2C-M3.dot"
Fichier_Bilan = Dossier_Modele & "\05-M2C-B.dot"
Fichier_Stat = Dossier_Modele & "\06-M2C-Stat.dot"
'MsgBox "Les fichiers sources sont :" & Chr(13) & _
    Fichier_1er_M1 & Chr(13) & Fichier_1er_M3 & Chr(13) & _
    Fichier_M1 & Chr(13) & Fichier_M2 & Chr(13) & Fichier_M3 & Chr(13) & _
    Fichier_Bilan & Chr(13) & Fichier_Stat
'Définition des fihciers à créer
Dim New_Fichier_1er_M1
Dim New_Fichier_1er_M3
Dim New_Fichier_M1
Dim New_Fichier_M2
Dim New_Fichier_M3
Dim New_Fichier_Bilan
Dim New_Fichier_Stat
New_Fichier_1er_M1 = Dossier & "\" & Nom_Dossier & "_1er_M1.doc"
New_Fichier_1er_M3 = Dossier & "\" & Nom_Dossier & "_1er_M3.doc"
New_Fichier_M1 = Dossier & "\" & Nom_Dossier & "_M1.doc"
New_Fichier_M2 = Dossier & "\" & Nom_Dossier & "_M2.doc"
New_Fichier_M3 = Dossier & "\" & Nom_Dossier & "_M3.doc"
New_Fichier_Bilan = Dossier & "\" & Nom_Dossier & "_B.doc"
New_Fichier_Stat = Dossier & "\" & Nom_Dossier & "_S.doc"
'MsgBox "Les futurs fichiers à créer sont :" & Chr(13) & _
    New_Fichier_1er_M1 & Chr(13) & New_Fichier_1er_M3 & Chr(13) & _
    New_Fichier_M1 & Chr(13) & New_Fichier_M2 & Chr(13) & New_Fichier_M3 & Chr(13) & _
    New_Fichier_Bilan & Chr(13) & New_Fichier_Stat

'Détermination du module d'entrée
Dim Module_Depart As String
Module_Depart = Cells(ActiveCell.Row, 14)
MsgBox "Le module d'entrée est " & Module_Depart
'Copie des fichiers adéquats
    If Module_Depart = "M3" Then
        Msg = "Les fichiers à créer sont :" & Chr(13) & _
            New_Fichier_1er_M3 & Chr(13) & New_Fichier_M3 & Chr(13) & _
            New_Fichier_Bilan & Chr(13) & New_Fichier_Stat
        Style = vbYesNo + vbCritical + vbDefaultButton1
        Title = "> COPIE DES FICHIERS DE BASE <"
        Réponse = MsgBox(Msg, Style, Title, Help, Context)
        If Réponse = vbYes Then
            FileCopy Fichier_1er_M3, New_Fichier_1er_M3
            FileCopy Fichier_M3, New_Fichier_M3
            FileCopy Fichier_Bilan, New_Fichier_Bilan
            FileCopy Fichier_Stat, New_Fichier_Stat

            'On definit un objet Word puis on l'ouvre :
            'Dim WordApp As Word.Application                     'instance de l'appli Word
            'Dim WordDoc As Word.Document              'instance du document Word à ouvrir
            Set WordApp = CreateObject("Word.application")
            Set WordDoc = WordApp.Documents.Open(New_Fichier_1er_M3)

            'On met Word au premier plan (True) ou en arrière plan (False) durant la procédure
            WordApp.Visible = True
            
    WordApp.Selection.Find.ClearFormatting
    WordApp.Selection.Find.Text = "LETTRE_COMMANDE"

    WordApp.Selection.Find.Replacement.ClearFormatting
    WordApp.Selection.Find.Replacement.Text = Lettre_Comm

    WordApp.Selection.Find.Execute Replace:=Word.WdReplace.wdReplaceAll


            'On enregistre et on ferme le document word
            WordDoc.Close True
            'On laisse au systeme le temps d'enregistrer le fichier
            DoEvents

            'On quitte Word :
            WordApp.Quit

            'On vide les objets WordApp & WdDoc :
            Set WordApp = Nothing
            Set WordDoc = Nothing

        Else
            MsgBox "Les fichiers n'ont pas été copiés !"
            Exit Sub
        End If
    Else
        If Module_Depart = "M2" Then
            Msg = "Les fichiers à créer sont :" & Chr(13) & _
                New_Fichier_1er_M1 & Chr(13) & _
                New_Fichier_M2 & Chr(13) & New_Fichier_M3 & Chr(13) & _
                New_Fichier_Bilan & Chr(13) & New_Fichier_Stat
            Style = vbYesNo + vbCritical + vbDefaultButton1
            Title = "> COPIE DES FICHIERS DE BASE <"
            Réponse = MsgBox(Msg, Style, Title, Help, Context)
                If Réponse = vbYes Then
                    FileCopy Fichier_1er_M1, New_Fichier_1er_M1
                    FileCopy Fichier_M2, New_Fichier_M2
                    FileCopy Fichier_M3, New_Fichier_M3
                    FileCopy Fichier_Bilan, New_Fichier_Bilan
                    FileCopy Fichier_Stat, New_Fichier_Stat
                Else
                    MsgBox "Les fichiers n'ont pas été copiés !"
                    Exit Sub
                End If
        Else
            Msg = "Les fichiers à créer sont :" & Chr(13) & _
                New_Fichier_1er_M1 & Chr(13) & New_Fichier_M1 & Chr(13) & _
                New_Fichier_M2 & Chr(13) & New_Fichier_M3 & Chr(13) & _
                New_Fichier_Bilan & Chr(13) & New_Fichier_Stat
            Style = vbYesNo + vbCritical + vbDefaultButton1
            Title = "> COPIE DES FICHIERS DE BASE <"
            Réponse = MsgBox(Msg, Style, Title, Help, Context)
                If Réponse = vbYes Then
                    FileCopy Fichier_1er_M1, New_Fichier_1er_M1
                    FileCopy Fichier_M1, New_Fichier_M1
                    FileCopy Fichier_M2, New_Fichier_M2
                    FileCopy Fichier_M3, New_Fichier_M3
                    FileCopy Fichier_Bilan, New_Fichier_Bilan
                    FileCopy Fichier_Stat, New_Fichier_Stat
                Else
                    MsgBox "Les fichiers n'ont pas été copiés !"
                    Exit Sub
                End If
        End If
    End If
End Sub

Et encore, j''ai fais un peu de ménage !

Comme vous pouvez le voir, la base Excel comporte plus d'une trentaine de colonnes ...

Bon courage !
 

vbacrumble

XLDnaute Accro
Re : Remplacer un texte dans Word par une variable Excel

Re

Ce que je voulais, c'était dans VBE, faire :
Fichier/Exporter Fichier
ce qui génère n fichier *.bas par module sélectionné avant l'export
Ensuite tu pouvais zippé tous ces fichiers.bas dans un seul zip

et poster ce zip dans ton fil de discussion.
 

vbacrumble

XLDnaute Accro
Re : Remplacer un texte dans Word par une variable Excel

Re


Mon second conseil c'était juste pour éviter que tu colles ton code VBA dans ton message afin d'éviter d'avoir un message hyperlong.

Tu ne peux pas créer un fichier Excel avec des données fictives ?

(que l'on puisse tester en situation)
 

Jilde

XLDnaute Occasionnel
Re : Remplacer un texte dans Word par une variable Excel

J'ai essayé ça aussi :
Code:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "LETTRE_COMMANDE"
        .Replacement.Text = "Lettre de commande"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

Mais ça marche pas non plus ... :eek:(
VB me renvoie "Nombre d'arguments incorrect ou affectation de propriété incorrecte" ...

M'sieur ! M'sieur ! Y'a Excel qui arrête pas de m'embêter !!!
 

vbacrumble

XLDnaute Accro
Re : Remplacer un texte dans Word par une variable Excel

RE



Code:
'On met Word au premier plan (True) ou en arrière plan (False) durant la procédure
WordApp.Visible = True
[COLOR="Green"]'ici ton ton document Word est ouvert[/COLOR]
[COLOR="Green"]'mais aucune Selection n'est en cours dans le document non ?   [/COLOR]     
WordApp.Selection.Find.ClearFormatting
 

myDearFriend!

XLDnaute Barbatruc
Re : Remplacer un texte dans Word par une variable Excel

Bonsoir Jilde, VBAcrumble, le Forum,

Jilde, il te faut activer la référence "Microsoft Word XX.X Object Library" dans VBE Excel, par le menu Outils / Références...

(XX.X dépend de ta version Word installée sur ta machine)

Cordialement,
 

Jilde

XLDnaute Occasionnel
Re : Remplacer un texte dans Word par une variable Excel

Salut myDearFriend !

j'ai activer "Microsoft Word XX.X Object Library" dans VBE Excel, et ...
Ce qui fonctionnait avant ne fonctionne plus .... Boouhhhhh .... :eek:(
J'y comprends plus rien ...

Bon, j'essaie de rectifier le tir ...
 

Jilde

XLDnaute Occasionnel
Re : Remplacer un texte dans Word par une variable Excel

YESSSSSSS !!!!!

Après recodification complète et pas à pas, ça roule !!!!
C'était bien le "Microsoft Word XX.X Object Library" qu'il fallait activer.
Mais ça semble rendre VBA plus sensible à la syntaxte ...
Les petites erreurs qui passaient sans ne passe plus avec ...
Etrange ...

Mais l'important est que ça marche !
Merci à vous deux pour le coup de main !!

J'yretourne pour paufiner tout ça !!

Bye ;) !!
 

myDearFriend!

XLDnaute Barbatruc
Re : Remplacer un texte dans Word par une variable Excel

Bonsoir Jilde, vbacrumble, le Forum,

YESSSSSSS !!!!!

Après recodification complète et pas à pas, ça roule !!!!
C'était bien le "Microsoft Word XX.X Object Library" qu'il fallait activer.
Mais ça semble rendre VBA plus sensible à la syntaxte ...
Les petites erreurs qui passaient sans ne passe plus avec ...
Etrange ...

Mais l'important est que ça marche !
Merci à vous deux pour le coup de main !!

J'yretourne pour paufiner tout ça !!

Bye ;) !!
Y'a rien d'étrange à ça... Une fois la bonne library activée (référence), VBA devient sensible à la syntaxe tout simplement parce qu'il devient apte à comprendre de quoi tu lui parles ;)

Cordialement,
 

Jilde

XLDnaute Occasionnel
Re : Remplacer un texte dans Word par une variable Excel

Damned !

J'ai crié victoire trop tot :( !

Le nouveau problème c'est que j'arrive pas à modifier plusieurs documents Word à la suite ...

Code:
'Remplacement New_Fichier_M1
            'On definit un objet Word puis on l'ouvre :
            Dim WordApp As Word.Application
            Dim WordDoc As Word.Document
            Set WordApp = CreateObject("Word.application")
            Set WordDoc = WordApp.Documents.Open(New_Fichier_M1)
            WordApp.Visible = True

            With WordDoc.Content.Find
                .ClearFormatting
                .Text = "Lettre_de_Commande"
                With .Replacement
                    .ClearFormatting
                    .Text = Lett_Comm
                End With
                .Execute Replace:=wdReplaceAll
                .Forward = True
                .Wrap = wdFindContinue
            End With

            'On enregistre et on ferme le document word en lui laissant le temps de le faire
            WordDoc.Close True
            DoEvents
            'On quitte l'application Word
            WordApp.Quit
            'On vide les objets WordApp & WdDoc
            Set WordApp = Nothing
            Set WordDoc = Nothing
'Fin remplacement New_Fichier_M1

'Remplacement New_Fichier_M2
            'On definit un objet Word puis on l'ouvre :
            Dim WordApp2 As Word.Application
            Dim WordDoc2 As Word.Document
            Set WordApp2 = CreateObject("Word.application")
            Set WordDoc2 = WordApp.Documents.Open(New_Fichier_M2)
            WordApp2.Visible = True

            With WordDoc2.Content.Find
                .ClearFormatting
                .Text = "Lettre_de_Commande"
                With .Replacement
                    .ClearFormatting
                    .Text = Lett_Comm
                End With
                .Execute Replace:=wdReplaceAll
                .Forward = True
                .Wrap = wdFindContinue
            End With

            'On enregistre et on ferme le document word en lui laissant le temps de le faire
            WordDoc2.Close True
            DoEvents
            'On quitte l'application Word
            WordApp2.Quit
            'On vide les objets WordApp & WdDoc
            Set WordApp2 = Nothing
            Set WordDoc2 = Nothing
'Fin remplacement New_Fichier_M2

Pour le premier remplacement dans le fichier M1, tout va bien.
Mais dès qu'on passe au second, le fichier M2, ça bloque ...

Il me dit :
"Variable objet ou variable de bloc With non définie"
Alors qu'il me semble l'avoir définie ...

Y'aurait pas un truc à faire pour pouvoir lancer deux instance Word à la suite l'une de l'autre ?
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 326
Membres
102 862
dernier inscrit
Emma35400