Assigner des cellules à des signets - problème de répétition

Bonjour,

Je suis nouvelle sur le forum et je débute tout juste en VBA. Je n'ai pas trouvé la solution à mon problème dans les postes, aussi je viens solliciter vos lumières pour corriger mon erreur!

L'idée est simple :

  • J'essaie de remplir automatiquement des signets sur un document Word en prenant en référence des informations présentent dans une feuille Excel.
  • Je veux qu'une fois ces informations transmises, le programme génère un pdf sans modifier le modèle word.

Jusqu'ici, j'ai pu coder la génération du pdf, mais lorsque j'entre ma liste de Bookmarks, il semble que chaque nouvel ajout invalide le précédant !

Sur les conseils d'un des contributeurs, j'ai tenté de conclure mes lignes par "& Chr(10)". Si une ligne est bien ajoutée, les Bookmarks persistent à s'annuler mutuellement.

Ainsi, pour les commandes :

worddoc.Bookmarks("Signet1").Range.Text = Sheets("MENUS").Range("A1").Value & Chr(10)
worddoc.Bookmarks("Signet2").Range.Text = Sheets("MENUS").Range("B2").Value & Chr(10)

seul le signet 2 sera rempli, et le signet 1 disparait ; et ainsi de suite à mesure que ma liste de Bookmarks s'allonge.

Pouvez-vous m'aider à comprendre mon erreur ?

* Voici au complet le code que j'ai rédigé jusqu'ici.

Sub export_de_données_dans_Menu()
Dim wordapp As Word.Application
Dim worddoc As Word.Document

Set wordapp = CreateObject("word.Application")
Set worddoc = wordapp.Documents.Open("Chemin d'accès")

worddoc.Bookmarks("Signet1").Range.Text = Sheets("MENUS").Range("A1").Value & Chr(10)
worddoc.Bookmarks("Signet2").Range.Text = Sheets("MENUS").Range("B2").Value & Chr(10)

worddoc.ExportAsFixedFormat OutputFileName:= _
        "_" & ".pdf", ExportFormat:= _
        17, OpenAfterExport:=True, OptimizeFor:= _
        0, Range:=0, From:=1, To:=1, _
        Item:=0, IncludeDocProps:=True, KeepIRM:=True, _
        CreateBookmarks:=0, DocStructureTags:=True, _
        BitmapMissingFonts:=True, UseISO19005_1:=False

worddoc.Close savechanges:=False
wordapp.Quit

End Sub

Bonjour,

Je n'ai jamais travaillé avec les objets words en VBA, donc je m'excuse si ma proposition n'est pas correcte.

Cependant j'ai lu en ligne () que lorsque vous redéfinissez le texte de la range associée à un bookmark, cela le supprime. Essayez donc d'implémenter dans votre macro le code présent sur ce site permettant de redéfinir le bookmark après changement de son texte. Une proposition :

Sub export_de_données_dans_Menu()

    Dim wordapp As Word.Application

    Dim worddoc As Word.Document

    Set wordapp = CreateObject("word.Application")

    Set worddoc = wordapp.Documents.Open("Chemin d'accès")

    Dim i As Long

    For i = 1 To 2

        editBookmark(i)

    Next i

    worddoc.ExportAsFixedFormat OutputFileName:= _

    "_" & ".pdf", ExportFormat:= _

    17, OpenAfterExport:=True, OptimizeFor:= _

    0, Range:=0, From:=1, To:=1, _

    Item:=0, IncludeDocProps:=True, KeepIRM:=True, _

    CreateBookmarks:=0, DocStructureTags:=True, _

    BitmapMissingFonts:=True, UseISO19005_1:=False

    worddoc.Close savechanges:=False

    wordapp.Quit

End Sub

Sub editBookmark(index As Long)

    Dim NewText As String

    NewText = Sheets("MENUS").Range("A" & i).Value2

    Dim bkm As Bookmark

    Set bkm = worddoc.Bookmarks("Signet" & i)

    Dim bkmRng As Range

    Set bkmRng = bkm.Range

    With bkmRng

        .Text = NewText

        .End = bkmRng.Start + Len(NewText)

    End With

    worddoc.Bookmarks.Add(Name:=bkmName, Range:=bkmRng)

End Sub

Bonjour,

Si tu mets "CreateBookmarks" à 0, les signets ne sont pas exportés. Mets la valeur à 2 :

"Crée un signet dans le document exporté pour chaque signet Word, ce qui
concerne tous les signets sauf ceux qui se trouvent dans les en-têtes et
les pieds de page."

Daniel

Merci pour vos réponses.

DanielC, je vois que votre réponse me permet d'exporter les signets.

Je ne me suis pas exprimé clairement dans mon premier poste, au temps pour moi.

Je ne déplore pas la disparition des signets dans mon export pdf, mais bien la disparition de leur contenu.

Mettons que A1 contient "chien" et B2 "chat", avec le code

worddoc.Bookmarks("Signet1").Range.Text = Sheets("MENUS").Range("A1").Value & Chr(10)
worddoc.Bookmarks("Signet2").Range.Text = Sheets("MENUS").Range("B2").Value & Chr(10)

seul "chat" apparaît dans l'export.

J'espère avoir été plus clair sur la nature de mon problème.

Merci saboh12617,

J'ai essayé votre solution. Malheureusement, mes compétences balbutiantes en VBA ne me permettent pas vraiment de comprendre le code.

La commande échoue lorsque je tente de l'adapter à mon projet.

Si le code fonctionne sur vos fichiers tests, je peux vous l'adapter sur le projet réel, il faudrait connaitre le nom réel de vos signets et vos feuilles, qui sont je pense la raison de l'interruption du code sur le projet réel.

Dans l'idéal si vous pouviez fournir un fichier à étudier, je pourrai vous commenter le code.

Merci de cette proposition.

Je vous joint ici des fichiers reprenant essentiellement les mêmes caractéristiques.

21menu.xlsm (21.38 Ko)
12menu-a-signets.docm (15.80 Ko)

Pardon saboh12617 pour l'envoi précédent, dans la précipitation je n'avais pas bien adapté les éléments. Voici :

15menu.xlsm (22.20 Ko)

Re,
Désolé je ne comprends pas, votre code devrait fonctionner...

J'ai beau bidouiller rienn'y fait. Je vous propose cependant une alternative :

Vous pouvez revoir votre doc word pour n'avoir qu'un seul bookmark, et renseigner dans celui-ci tout le contenu d'un menu.

Dans l'état, la macro proposée supprime les bookmarks non utlisés, et en lui indiquant en "index" le numéro de menu à changer, de l'écrire dans le champs de l'entrée du menu en question dans word. Si vous ajoutez d'autres jours/champs, continuez de suivre le pattern vertical que vous avez dans le Excel, et la récupération de données ne devrait pas poser problème. Si vous ajoutez des jours, voyez dans la boucle For avec numeroJour, définissez le dernier numéro en fonction. Par exemple 4 pour Jeudi ou 7 pour Dimanche.

Sub editBookmark(index As Long, doc As Word.Document)
    ' lecture des valeurs dans Excel
    Dim menu(0 To 3) As String    ' entrée, plat, acccomp, dessert
    Dim i As Long
    For i = 0 To 3
      menu(i) = ThisWorkbook.Worksheets("MENUS").Range("B" & 7 * index + i).Value2 & vbCrLf
    Next i

    Dim docMarks(0 To 3) As Bookmark
    Set docMarks(0) = doc.Bookmarks("Entrée" & index)
    Set docMarks(1) = doc.Bookmarks("Plat" & index)
    Set docMarks(2) = doc.Bookmarks("Accompagnement" & index)
    Set docMarks(3) = doc.Bookmarks("Dessert" & index)

    ' boucle pour récupérer entree+plat+acc+dessert
    Dim newTXT As String
    For i = 0 To 3
      newTXT = newTXT & menu(i)
    Next i

    ' suppression des autres champs
    For i = 1 To 3
      docMarks(i).Range.Text = vbNullString
    Next i

    Dim bkmRng As Word.Range
    Set bkmRng = docMarks(0).Range
    Dim bkmName As String
    bkmName = docMarks(0).Name
    bkmRng.Text = newTXT

    ' ecriture de l'ensemble du menu
    doc.Bookmarks.Add Name:=bkmName, Range:=bkmRng

End Sub

Sub ExportDansWord()
  Dim wordapp As Word.Application
  Dim worddoc As Word.Document

  Set wordapp = CreateObject("word.Application")
  Set worddoc = wordapp.Documents.Open("adresse_fichier")

  Dim numeroJour As Long
  For numeroJour = 1 To 5
    editBookmark numeroJour, worddoc
  Next numeroJour

  worddoc.ExportAsFixedFormat OutputFileName:= _
          "_" & ".pdf", ExportFormat:= _
          17, OpenAfterExport:=True, OptimizeFor:= _
          0, Range:=0, From:=1, To:=1, _
          Item:=0, IncludeDocProps:=True, KeepIRM:=True, _
          CreateBookmarks:=0, DocStructureTags:=True, _
          BitmapMissingFonts:=True, UseISO19005_1:=False

  worddoc.Close savechanges:=False
  wordapp.Quit
End Sub
19menu.xlsm (22.57 Ko)

J'ai eu le temps d'essayer votre proposition. Ce n'est pas exactement ce que je cherchais à fabriquer je dois avouer.

Cela dit, je vous remercie bien pour votre aide!

J'aimerais tout de même bien comprendre mon erreur sur l'utilisation de mes bookmarks...

Je fais un shout out pour Cylfo

J'ai vu que vous aviez contribué à une résolution sur un sujet similaire, auriez-vous une idée pour résoudre mon erreur ?

Il me semble que j'ai trouvé une solution (à grande force de bidouillages en tous sens) et sans pouvoir affirmer avoir complétement compris mon erreur initiale, j'obtiens tout de même le résultat que je souhaitais en utilisant ce code :

With worddoc

.Bookmarks("A").Range.Text = Range("B7").Value & Chr(10)
.Bookmarks("B").Range.InsertAfter Range("B8").Value & Chr(10)
.Bookmarks("C").Range.InsertAfter Range("B9").Value & Chr(10)
.Bookmarks("D").Range.InsertAfter Range("B10").Value & Chr(10)

End With

J'ai une hypothèse quand à l'erreur : Il semble que

.Bookmarks("A").Range.Text

se réactive lorsqu'il rencontre à nouveau un texte sans signet dans Word. Dans le cas d'un enchainement de signets, la commande

.Range.InsertAfter range ("") 

semble solutionner la répétition.

Merci pour votre aide

Bonjour,

Parfait, si votre sujet problème est résolu, n'hésitez pas a marquer le fil en tant que tel.

Je remarque qu'au final la solution que vous retenez est identique, dans le principe, à celle que je proposais car vous supprimez ainsi les bookmarks après le premier. L'unique différence est qu'au lieu d'insérer 1 bloc de 4 lignes vous les entrez une à une.

Bonne journée

Je n'avais pas bien compris votre solution je pense, pardonnez mon ignorance.

Aussi, je ne sais pas comment marquer le sujet résolu...

Ce qui compte c'est que vous ayez résolu votre problème. Ma solution était probablement trop spécifique aux exemples fournis, et ne s'adaptait peut etre pas à votre fichier réel.

Pour marquer le fil comme résolu, regardez en haut de chaque message il y à l'icone "check"

image

Au niveau du message considéré comme solution, cliquez sur ce bouton.En l'occurrence votre message de ce matin.

Merci pour tout.

Bonne journée à vous

Rechercher des sujets similaires à "assigner signets probleme repetition"