Empêcher la suppression de signet dans Word

Bonjour,

Je travaille actuellement sur la liaison entre un document Excel et un document Word et je pense toucher au but.

Des informations sont renseignées dans le fichier Excel puis nous pouvons générer une page de garde à partir de celui-ci.

Pour cela je renseigne des signets présents dans mon document Word à l'aide du code VBA suivant :

Sub MacroWordCCTP()
Dim Doc As String
Dim ObjWord As Object

On Error Resume Next

Doc = "C:\Users\b.lechat\Desktop\test\PAGES DE GARDE TYPE - CCTP.docx" 'Chemin vers le fichier Word de référence suivi de son nom
Set ObjWord = CreateObject("Word.Application")
ObjWord.Visible = True
Set DocWord = ObjWord.Documents.Open(Doc)

Operation = Sheets("Informations sur l'opération").Range("B2").Value & vbCrLf & Sheets("Informations sur l'opération").Range("B3").Value

    With DocWord
        .Bookmarks("OPERATION").Range.Text = Operation

        For i = 1 To 6
            .Bookmarks("ENTR" & i & "_ROLE").Range.Text = Sheets("Coordonnées MOA+Entreprises").Cells(i + 1, 2).Value
            .Bookmarks("ENTR" & i & "_NOM").Range.Text = Sheets("Coordonnées MOA+Entreprises").Cells(i + 1, 3).Value
            .Bookmarks("ENTR" & i & "_ADRESSE").Range.Text = Sheets("Coordonnées MOA+Entreprises").Cells(i + 1, 5) & vbCrLf & Sheets("Coordonnées MOA+Entreprises").Cells(i + 1, 7) & " - " & Sheets("Coordonnées MOA+Entreprises").Cells(i + 1, 8).Value
            .Bookmarks("LOT" & i).Range.Text = "LOT N° " & Sheets("Coordonnées MOA+Entreprises").Cells(i + 11, 1) & vbCrLf & Sheets("Coordonnées MOA+Entreprises").Cells(i + 11, 2)
        Next i

    End With

End Sub

Ce code fonctionne parfaitement mais voilà les signets sont supprimés une fois le code exécuté.

N'existe-il pas une solution pour éviter ce problème. J'en aurai besoin puisque mon fichier Word est composé de "renvoie" reprenant les données de la première page pour remplir les pages suivantes.

Je vous mets les deux fichiers que j'utilise et vous remercie par avance pour votre aide précieuse.

Bonjour Bat_97140,

Tes 4 pages de garde du CCPT ne sont-elles pas strictement identiques ?

Bonsoir,

Malheureusement non. Le troisième cadre "LOT N°XX NOM DU LOT" varie pour chaque feuille.

Je te remets le fichier Excel ayant fait quelque ajustement dans mon code.

Bonjour

si mes souvenir son bon ton word doit avoir extension .dot

et tu enregistre NouveauNom.docx

A+

Maurice

Voici le résultat obtenu avec un document en .dotx (même résultat pour un document en .docx).

Ce résultat est obtenu une fois le script VBA lancé et le fichier word actualisé :

annotation 2019 07 30 173735 png

Le texte "Erreur ! Source du renvoi introuvable." est dû au fait que je n'ai plus de signets une fois le script exécuté.

OK Bat_97140, j'avais mal vu...

Si seul le 3ème cadre varie, je te fais la suggestion suivante:

  • Dans ton document modèle, tu ne gardes qu'une page de garde
  • Tu supprimes les renvois
  • Dans le doc résultant, fais autant de copies de la page de garde que nécessaire en modifiant uniquement le texte du 3ème cadre.

Merci GVIALLES.

J'ai effectivement pensé à cette solution mais dans le cas où j'aurai une vingtaine de pages cela me prendrait énormément de temps.

C'est pourquoi j'ai ajouté une ligne de code qui vient renseigner sur chaque page le numéro de lot et le nom.

Je ne sais donc pas comment m'y prendre pour ne pas avoir la ressaisi pour chaque nouveau projet.

Par "fais autant de copies de la page de garde que nécessaire en modifiant uniquement le texte du 3ème cadre", je voulais dire dans le code VBA et, bien sûr, pas à la mano...

Ah excuse moi je n'avais pas compris.

Peut-tu me dire comment faire cela ?

Bonjour Bat_97140,

Comme l'explication du 'comment faire' peut être un peu longue, j'ai fais évolué ton projet avec la proposition suivante:

  • Dans l'EXCEL, le clic sur le bouton "Générer les pages de garde" ouvre une formulaire contenant la liste des lots (repris de la feuille "Coordonnées MOA+Entreprises" : j'ai créé une plage nommée "LOTS").
  • Tu coches les lots pour lesquels tu désires une page de garde et clique sur le bouton du formulaire.
  • Un nouveau document est créé contenant les pages de garde des lots sélectionnés.

- J'ai transformé le document modèle en .dotx

Tu trouveras ces éléments en P.J.

Dans cette version, le classeur EXCEL et le .dotx WORD doivent se trouver dans le même dossier pour que ça fonctionne.

Je te laisse examiner tout ça et reste à disposition si tu as besoin d'explication.

Bonjour,

J'ai fait plusieurs essais.

Sur le premier PC (mon perso), j'obtiens ceci :

01 02 03

J'ai essayé sur un autre PC d'un de mes collègue. J'obtiens une autre erreur :

04 05

Je vais faire quelque recherches de mon coté.

Sais-tu d'où cela peut venir ?

Peux-tu aussi détailler un peu plus les explications de ton code ? Je suis en train d'apprendre le VBA et j’aimerais comprendre un peu plus la logique de ton code.

Dans l'attente de tes précisions.

Bonne journée.

Je pense qu'il doit te manquer des références d'objets :

  • Tu te rends dans l'éditeur de macro,
  • Dans le menu, tu cliques sur "Outils/Références"
  • Tu vérifies que tu n'as pas de "MANQUANT" devant les références cochées :
referencement

Si c'est le cas, envoies la copie de la boite de dialogue "Références"

Alors sur mon PC Perso, j'ai bien une ligne marqué "MANQUANT" :

67441437 417535372194481 4096291841282932736 n

Le PC à mon travail, lui, n'a pas ce soucis :

67642481 2381205425255861 8716653650698567680 n

Bonjour Bat_97140,

Quelques explications issues de l'expérience (tu peux sauter le paragraphe, si tu désires juste avoir la solution ).

Dans les développements faits sur ton projet, pour me référer aux objets WORD, j'ai utilisé la méthode de "Liaison anticipée (Early binding) " contrairement à ton propre code dans lequel tu utilises la méthode de "Liaison tardive (Late binding)".

Je recommande l'utilisation de la "Liaison anticipée" au moins lors de la phase de mise au point des projets VBA : les avantages étant :

  • de pouvoir bénéficier des fonctions "Intellisense" de l'éditeur VBE lors de l'écriture du code.
  • d'accéder aux constantes de l'objet référencé
  • d'obtenir les erreurs sur les appels aux méthodes/évènements/propriétés de l'objet lors de la compilation.

On gagne ainsi beaucoup de temps dans la mise au point, surtout lorsque l'on programme avec un objet que nous maîtrisons mal.

L'inconvénient majeur de cette méthode étant que l'on se réfère ainsi à une version spécifique de l'objet : celle installée sur le poste avec lequel on développe. MS garantit (le plus souvent) une compatibilité ascendante de ses objets. Ainsi, un développement réalisé avec, par exemple la version WORD 2013 (objet version 15.0 de l'objet) devrait sans problème s'exécuter sur un poste equipé avec une version ultérieure de MS Office (2015, 2016, 2018...).

Par contre, MS ne garantit pas la compatibilité avec les versions antérieures de ses objets.

Pour éviter ce problème, et lorsque le projet est amené à être transférer sur d'autres postes dont on ne connait pas, à priori, la version MS Office, une fois le projet au point, on modifie le code VBA pour passer le référencement de l'objet à la méthode "Liaison tardive".

C'est le problème auquel tu fais face puisque j'ai développé avec WORD 2013 et que ton poste perso est installé en version 2010 (objet version 14).

Pour le régler :

Dans la boîte de dialogue "Référencements" :

  • tu décoches la référence "MANQUANT"
  • Dans la liste déroulante, tu recherches "Microsoft WORD 14.0 Object Library" que tu coches.
Tu recompiles

Tiens moi informé si besoin.

Merci pour tes explications. Ce sont des choses auxquelles je n'avais pas du tout pensé.

Je sens qu'on progresse

J'ai suivi tes indications et maintenant j'obtiens ceci :

01 02 03

Concernant le problème que j'avais à mon travail, j'ai l'impression que ça viens d'un autre endroit. La ligne en jaune n'est pas la même.

04

Je poursuis mes recherches. Tient moi au courant si tu as des pistes

Sur ton poste perso, remplaces la ligne qui sort une erreur à la compilation "SET oLW = Me.lwLotS" par :

    Set oLW = Me.Controls("lwLots")

Sur ton poste au travail, tu n'as pas indiqué le message d'erreur .

Pour mon PC perso, la modification n'a pas l'air d'avoir fonctionné :

01 02

J'ai testé sur un troisième ordinateur (lui aussi sous Excel 2010) et j'obtiens le même code d'erreur qu'à mon entreprise.

Je propose donc de se concentrer uniquement sur ce problème.

Je te remets les captures :

01 02

Bonnes recherches

Bonjour Bat_97140,

Le modèle .dotx est-il bien stocké dans le même dossier que le .xslm ?

Bonjour GVIALLES

Oui tout est dans un dossier dans "Mes documents".

Bat_97140,

Dans WORD, vérifie que rien n'est coché dans les options/Centre de gestion de la confidentialité/Mode protégé :

modeprotege
Rechercher des sujets similaires à "empecher suppression signet word"