Word, Champ SAVEDATE dans en-tête, pb MAJ VBA

Fermé
Bobby917 Messages postés 2 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 2 mars 2009 - 2 mars 2009 à 11:26
m@rina Messages postés 21701 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 11 mars 2025 - 3 mars 2009 à 10:57
Bonjour,

Je réalise un modèle de document. Je travaille avec word 2007 mais enregistre le document en mode de compatibilité avec office 2003.

En en-tête, dans un tableau, j'ai inséré les champs Createdate, Savedate, et Filename.

Effectivement ils se mettent bien à jour lorsque l'on les sélectionne+F9. A la création d'un document avec le modèle, les champs s'initialisent correctement (date de création, savedate à 00/00/..., filename : Document 1).

Au premier enregistrement (changement de nom, saisie de texte), savedate et filename ne se mettent pas à jour. En fait ils ne se mettent jamais à jour seuls... (dans les options, "mettre à jour les champs avant impression" est cochée). Aussi bien dans le modèle de document que dans les documents créés à partir de ce modèle.

Par VBA j'ai créé une procédure événementielle pour mettre à jour avant enregistrement les champs de l'entête uniquement. Puisque je me situe avant l'enregistrement, je devrais au moins obtenir la date de l'enregistrement précédant : ce que j'obtiens, mais tous les autres champs du document sont impactés. Or mon document est un formulaire, et toutes les zones de liste sont réinitialisées à la première valeur de la liste, ce qui est problématique.

Précisions : comme il s'agit d'un formulaire il faut activer la protection. J'ôte et je remets la protection par macro avant de demander la MAJ. Le document n'a qu'une seule section. Le problème se pose que la protection soit ou non activée. Je n'ai pas d'entête de première page différent du reste de la section.

mes extraits de code :
Pour la gestion événementielle :
   Dim myWord As New modWordEvents
   Private Sub Document_Open()
      Initialize_appEvents
   End Sub

   Public Sub Initialize_appEvents()
     Set myWord.objWord = Word.Application
   End Sub

Pour la mise à jour, dans un module de classe modWordEvents :
   Public WithEvents objWord As Application

   Private Sub objWord_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
      If ActiveDocument.ProtectionType <> wdNoProtection Then
          ActiveDocument.Unprotect
          ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Update
          ActiveDocument.Protect wdAllowOnlyFormFields
      Else
          ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Update
      End If
   End Sub

Comment actualiser ces champs SAVEDATE et FILENAME automatiquement (sans select+F9 par l'utilisateur),sans réinitialiser tout le document ?
Vous remerciant de votre aide.

Bobby917
A voir également:

2 réponses

m@rina Messages postés 21701 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 11 mars 2025 11 407
2 mars 2009 à 14:25
Bonjour,

Je vois deux solutions à ton problème :

Tu écris une macro simple qui met tes champs à jour, et tu fais exécuter cette macro au démarrage ou à la sortie d'un des champs du formulaire :

Sub enreg()
For x = 1 To 2
    ActiveDocument.Fields(x).Update
Next x
End Sub


Par contre cette macro aura toujours un temps de retard comme tu le fais remarquer toi-même.

Une autre solution sans doute plus judicieuse serait de surcharger les macros FileSaveAs et FileSave. Ainsi lorsque l'utilisateur enregistrera son document, les champs se mettront à jour en toute transparence. Et dans la macro on ajoute l'enregistrement après la mise à jour des champs pour ne pas avoir une version v-1.

Sub FileSaveAs()
Dialogs(wdDialogFileSaveAs).Show
 FileSave 'appelle la macro d'enregistrement pour mise à jour des champs
End Sub


Sub FileSave()
'sauvegarde puis mets à jour les champs
ActiveDocument.Save
For x = 1 To 2
ActiveDocument.Fields(x).Update
Next
End Sub


m@rina
0
Bobby917 Messages postés 2 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 18:15
Merci M@rina de vous pencher sur mon problème.

J'ai appliqué votre seconde solution. Les champs du corps du texte sont bien mis à jours, le choix dans les listes déroulantes est bien conservé. Mais nada pour mes champs en en-tête.
J'ai donc modifié le code comme suit :

Sub FileSave()
Dim x As Single
'sauvegarde puis mets à jour les champs
ActiveDocument.Save
For x = 1 To 3
    ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields(x).Update
Next
End Sub


Je pourrais écrire for x=2 to 3 puisque le champ 1 est Creadate qui ne change pas. M'enfin ça paraîtrait bizarre à un relecteur.
Mes champs sont bien mis à jours, CHOUETTE !

MAIS
tous les autres champs du corps de texte sont réinitialisés... les choix des listes déroulantes sont perdus.
Pourtant l'enregistrement est fait avant, ils devraient être conservés ? J'en perds mon (peu de) latin...

Je supprime mon code et remets le votre, et là, à nouveau et contrairement à la première fois, tous les champs du corps de texte sont réinitialisés, les choix des listes déroulantes sont perdus. Que je travaille à partir du modèle de document, ou d'un document.

Pour info : avant d'appliquer votre code j'ai bien inactivé tout ce que j'avais écris par procédure événementielle BeforeSave.

Si vous avez une piste...

D'autre part, vous utilisez - et il fonctionne - l'événement SaveAs, pourtant il n'est pas répertorié dans la liste des événements disponibles. Comment se fait-ce ?

Merci,
Bobby
0
m@rina Messages postés 21701 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 11 mars 2025 11 407
3 mars 2009 à 10:57
Bonjour,

Est-ce que le fichier est bien un modèle (dot) ?
Il me faudrait voir votre document car il n'est absolument pas normal que les champs de formulaire se réinitialisent. Si vous pouviez me mettre un exemple ici :
https://www.cjoint.com/

Pour SaveAs, ce n'est pas un événement, c'est une macro qui remplace la fonction native de Word Enregistrer sous. Les fonctions peuvent être réécrites de cette manière en surchargeant. Il suffit de connaître le nom en anglais.

m@rina

0