Injection d'une cellule dans un signet dans word

Bonjour et merci par avance pour votre aide.

Le but est d’écrire dans un signet word le résultat d'une cellule au moment de la création du word.

J'ai écris cette fonction :

WDoc = "Attestation de fin de formation.docx"
Set wordapp = CreateObject("word.Application")
Set WordDoc = wordapp.Documents.Open(CheminWO & WDoc)
wordapp.Visible = False

wordapp.ActiveDocument.SaveAs Filename:=VDossier & "\" & WDoc, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False

MsgBox Ligne
WordDoc.Bookmarks("civilite").Range.Text = Range("A3")
WordDoc.Bookmarks("nom").Range.Text = Cells(Ligne, 2).Value
WordDoc.Bookmarks("prenom").Range.Text = Range(Ligne, 3).Value

wordapp.ActiveDocument.Close
Set wordapp = Nothing

Tout fonctionne sauf l'injection dans les signets :

WordDoc.Bookmarks("civilite").Range.Text = Range("A3") => Fonctionne
WordDoc.Bookmarks("nom").Range.Text = Cells(Ligne, 2).Value => Ne fonctionne pas
WordDoc.Bookmarks("prenom").Range.Text = Range(Ligne, 3).Value => Ne fonctionne pas

Edit modo : code à mettre entre balises avec le bouton </> merci d'y faire attention la prochaine fois

je pense que le problème est simple mais j'ai besoin d'un regard extérieure.

merci

Bonjour,

Quand tu dis "Ne fonctionne pas", une erreur se produit ou il n'y a rien d'écrit à l'endroit attendu ?

Le code ci-dessous n'est visiblement qu'un extrait et dans cet extrait, Ligne n'est valorisé. Le MsgBox affiche bien le bon numéro de ligne ?

As-tu essayé de remplacer Cells(Ligne, 2) par Range("B3") car si la civilité, le nom et le prénom sont sur la même ligne, d'après la civilité qui fonctionne, il s'agit de la ligne 3. Tu n'as qu'une seule ligne de stagiaire dans le fichier Excel ?

Sinon, il faudrait que tu envois à minima le code complet de la procédure et bcp mieux le fichier avec quelques données anonymisées.

Cdlt,

Cylfo

Bonjour Cylfo,

Oui j'ai une erreur d'excution.

Ligne est bien la bonne ligne dans msbgox

As-tu essayé de remplacer Cells(Ligne, 2) par Range("B3") => oui et cela fonctionne le problème est que chaque fois que j'ajoute la ligne mon tableur excel , je dois changer de ligne.

12test.xlsm (43.95 Ko)

Edit modo : fichier en doublon supprimé

Ok :

  • Donc "Civilite" fonctionne avec Range("A3") mais logiquement (même si je ne vois pas pourquoi) ne devrait plus fonctionner plus avec Cells(Ligne, 1).Value => à vérifier ...
  • Préfixes "Cells(Ligne, 2).value" par le nom de la feuille Excel (celui qui apparait dans l'éditeur VB à côté du nom de la feuille. Par exemple Feuil1.Cells(Ligne, 2).value => résultat ?

Si toujours KO, envois le code complet de la procédure que je puisse reproduire et tester.

J'ai vu après coup les fichiers, c'est bon.

j'ai mis mon fichier complet plus haut et un fichier word d'exemple avec les signets

Bonjour,

Si celà fonctionne avec Range et pas cells alors peut-être ainsi :

WordDoc.Bookmarks("civilite").Range.Text = Range("A3")
WordDoc.Bookmarks("nom").Range.Text = Range("B" &Ligne).Value
WordDoc.Bookmarks("prenom").Range.Text = Range("C" &Ligne).Value

Merci Xmen , tout marche

@Xmenpl, Impec !

@Aurel_123456789,

Avec les fichiers exemples et avec quelques modifications, cela fonctionne aussi avec Cells(Ligne, <colonne>), par contre là où je suis étonné : que ce soit dans la copie du code ou dans le code fourni, tu enregistres le fichier avant de valoriser les signets mais pas après leur valorisation ...

C'est probablement lié à la confection du doc d'exemple mais avec le fichier "Attestation de fin de formation.docx", j'ai dû modifier les signets car la valorisation du signet "civilite" se faisait puis celle de "nom" mais celle de "prenom" écrasait la civilité (vu en déroulant le code pas à pas et en laissant l'appli word visible).

@Cylfo

Tu as raison la civilité disparait, je vais revoir le code

Si cela peut t'aider, tu troueras en pièces jointes l'Excel (voir module1 / procédure traitements) modifié et le word modifié (il semblerait même si je ne sais pas pourquoi que le / entre madame et monsieur perturbe la valorisation des signets).

13test2.xlsm (40.87 Ko)

Je te remercie je vais regarder cela demain

Bonjour @Cylfo

je n'ai pas trop compris ce que tu avais changé

Bonjour,

Dans le document Word, j'ai supprimé les 3 signets et je les ai recréé avec les mêmes noms mais un avec un contenu d'un seul mot correspondant au nom du signet.

Pour la macro Excel "Traitements" pour la partie "Select WDocu" / "Case 1"

Contenu transmis dans ton fichier :

        Select Case WDocu
            Case 1
                WDoc = "Attestation de fin de formation.docx"
                Set wordapp = CreateObject("word.Application")
                Set WordDoc = wordapp.Documents.Open(CheminWO & WDoc)
                wordapp.Visible = False

                wordapp.ActiveDocument.SaveAs Filename:=VDossier & "\" & WDoc, FileFormat:= _
                        wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
                        True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
                        False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
                        SaveAsAOCELetter:=False

                MsgBox Lc
                WordDoc.Bookmarks("civilite").Range.Text = VCivilite.Value
                'WordDoc.Bookmarks("nom").Range.Text = Cells(Ligne, 2).Value
                'WordDoc.Bookmarks("prenom").Range.Text = Range(Ligne, 3).Value

                wordapp.ActiveDocument.Close
                Set wordapp = Nothing

            Case 2

Contenu commenté que j'ai transmis à l'exception des lignes commençant par "'=> Non fait :" qui sont des suggestions que j'ai rajouté en te répondant

        Select Case WDocu
            Case 1
               WDoc = "Attestation de fin de formation.docx"
'=> Non fait : 5 documents sont créés les uns à la suite des autres => L'instruction suivante devrait être en dehors de la boucle "FOR WDocu = 1 To 5" et plus présente dans chaque "Case X", de même la libération de l'objet wordApp, précédée de l'instruction "wordapp.Quit", devrait se faire après le NEXT de la même boucle.
               Set wordapp = CreateObject("word.Application")

               wordapp.Visible = False
'=> Non fait : comme le doc ouvert est utilisé comme un modèle, je suggère de l'ouvrir en lecture seule                
'               Set worddoc = wordapp.Documents.Open(FileName:=CheminWO & WDoc, ReadOnly:=True)
                Set worddoc = wordapp.Documents.Open(CheminWO & WDoc)

'=> Utilisation de l'objet worddoc pour la manipulation du document créé y compris pour l'enregistrer sous suite à l'ouverture du doc utilisé comme modèle
               With worddoc
                  .SaveAs Filename:=VDossier & "\" & WDoc, FileFormat:= _
                           wdFormatDocumentDefault, LockComments:=False, Password:="", AddToRecentFiles:= _
                           True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
                           False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
                           SaveAsAOCELetter:=False
'=> Alimentation des signets en utilisant Cells. Cela fonctionne suite à la recréation des signets dans le doc Word
                  .Bookmarks("civilite").Range.Text = Cells(Ligne, 1).Value
                  .Bookmarks("nom").Range.Text = Cells(Ligne, 2).Value
                  .Bookmarks("prenom").Range.Text = Cells(Ligne, 3).Value
'=> Ajout de la sauvegarde du document.
                  .Save

                  .Close
               End With
               Set worddoc = Nothing
               Set wordapp = Nothing

            Case 2

Cdlt,

Cylfo

J'ai mis cette ordre et j'ai changé Monsieur/madame par Civilité et cela fonctionne

WordDoc.Bookmarks("civilite").Range.Text = Range("A" & Ligne).Value

WordDoc.Bookmarks("prenom").Range.Text = Range("C" & Ligne).Value

WordDoc.Bookmarks("nom").Range.Text = Range("B" & Ligne).Value

.Bookmarks("civilite") => le point devant bookmarks sert à quoi ?

tu as mis:

Set worddoc = Nothing => pour fermer le document word ?

ok je viens de voir ta réponse je regarde cela en détaille, je te remercie

J'ai repris tes changements et tous modifier mes cases sa roule

@Cylfo

j'ai un autre problème du à la non fermeture correctement des fichier word dans le gestionnaire de tache qui se cumule et bloque mon script VBA au bout d'un moments

image

Ce n'est pas la fermeture des documents mais l'absence de fermeture de l'application Word qui pose problème. Voir mon 1er commentaire "=> Non fait". En résumé, le code devrait être structuré comme cela :

            Set wordapp = CreateObject("word.Application")
            wordapp.Visible = False
            Select Case WDocu
            Case 1
               WDoc = "Attestation de fin de formation.docx"
               Set worddoc = wordapp.Documents.Open(FileName:=CheminWO & WDoc, ReadOnly:=True)

               With worddoc
                  .SaveAs Filename:=VDossier & "\" & WDoc, FileFormat:= _
                           wdFormatDocumentDefault, LockComments:=False, Password:="", AddToRecentFiles:= _
                           True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
                           False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
                           SaveAsAOCELetter:=False
                  .Bookmarks("civilite").Range.Text = Cells(Ligne, 1).Value
                  .Bookmarks("nom").Range.Text = Cells(Ligne, 2).Value
                  .Bookmarks("prenom").Range.Text = Cells(Ligne, 3).Value
                  .Save
                  .Close
               End With
               Set worddoc = Nothing

            Case 2

            Case  3

            Case  4

            Case  5

            End Select
            wordApp.Quit
            set wordApp = nothing
Rechercher des sujets similaires à "injection signet word"