Word, Champ SAVEDATE dans en-tête, pb MAJ VBA
Bobby917
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
m@rina Messages postés 23891 Date d'inscription Statut Contributeur Dernière intervention -
m@rina Messages postés 23891 Date d'inscription Statut Contributeur Dernière intervention -
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 :
Pour la mise à jour, dans un module de classe modWordEvents :
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
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:
- Word, Champ SAVEDATE dans en-tête, pb MAJ VBA
- Word 2013 - Télécharger - Traitement de texte
- Tableau word - Guide
- Supprimer une page dans word - Guide
- Espace insécable word - Guide
- Word et excel gratuit - Guide
2 réponses
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 :
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.
m@rina
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
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
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
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 :
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