Les utilisateurs d’anciennes versions de WordPerfect peuvent être familiarisés avec une commande qui vous permet d’enregistrer une copie de votre document actuel sur le lecteur A: sans modifier l’état du document ni changer l’emplacement où il est normalement enregistré. Ainsi, si vous ouvrez C: \ My Docs \ MyFile.doc, et lancez cette commande, une copie du fichier est faite dans A :, et la prochaine fois que vous utilisez la commande Enregistrer, le fichier est toujours enregistré à sa place normale sur C :.

Word n’inclut pas une telle fonctionnalité et certaines personnes pensent que cela devrait.

Il semble qu’un endroit naturel pour une telle commande soit le sous-menu Envoyer vers disponible dans le menu Fichier. Normalement, ce sous-menu ne comprend que quelques éléments, car il est utilisé pour les commandes Word natives qui permettent la télécopie directe ou l’utilisation d’une connexion de messagerie. Heureusement, il ressemble à tout autre menu ou sous-menu dans Word et peut être personnalisé. La personnalisation des menus a été largement traitée dans d’autres numéros de WordTips.

Comme l’ajout au sous-menu est assez facile, le problème vient d’une commande pour faire la copie réelle ou enregistrer sur le lecteur A :. C’est là qu’une macro personnalisée vient à la rescousse, car il n’y a pas de commande Word native pour obtenir l’effet souhaité.

Une approche consiste simplement à enregistrer le document actuel sur le lecteur A :. Le problème avec ceci est qu’à partir de ce moment, Word pense que le document appartient au lecteur A :. La solution consiste à stocker l’emplacement actuel du fichier, à l’enregistrer dans A :, puis à l’enregistrer à nouveau, mais cette fois à l’emplacement d’origine. La macro suivante le fait en quelques étapes simples:

Sub FileCopyToA()

Dim OrName As String     OrName = ActiveDocument.FullName     ActiveDocument.SaveAs "A:\" + ActiveDocument.Name     ActiveDocument.SaveAs OrName End Sub

Cependant, une approche aussi simple présente des inconvénients. Premièrement (et potentiellement le plus important), si vous travaillez sur un fichier volumineux, il peut ne pas tenir sur le lecteur A :. Dans ce cas, la macro mourra d’une mort ignoble et vous devrez prendre les mesures pour récupérer manuellement en réenregistrant votre fichier à son emplacement d’origine. Un autre fait de la vie avec cette macro est qu’elle écrasera tout document de même nom existant sur le lecteur A :. Enfin, si vous ne vouliez pas que le document soit enregistré, mais que vous vouliez seulement un instantané sur A :, cette macro n’est pas pour vous.

Une version un peu plus flexible de la macro FileCopyToA est DoubleCopy, qui invite l’utilisateur à entrer un lecteur avant d’effectuer la copie.

Malheureusement, il présente également les mêmes inconvénients généraux.

Sub DoubleCopy()

Dim Message As String, Title As String     Dim Default As String, Drive As String     Dim ffname as String, fname as String

On Error GoTo Quit     Message = "Enter drive letter for document (A, C, D)"

Title = "Send Document to File"

Default = "A"



' Display message, title, and default value     Drive = InputBox(Message, Title, Default)

If Drive > "" Then         ffname = ActiveDocument.FullName         fname = Drive & ":\" & ActiveDocument.Name         ActiveDocument.SaveAs fname         ActiveDocument.SaveAs ffname     End If     Quit:

End Sub

Un des autres inconvénients des approches présentées jusqu’à présent est qu’elles peuvent être lentes – très lentes. Word est intrinsèquement lent à enregistrer un document sur un lecteur de disquette. Sauf si votre document est très petit, il est plus rapide de l’enregistrer sur un disque dur, puis d’utiliser une commande de copie pour copier un fichier sur la disquette. La macro suivante, SentToDriveA, adopte cette approche.

Sub SentToDriveA()

If ActiveDocument.Saved = False Then ActiveDocument.Save     System.Cursor = wdCursorWait     OrigLongFileName = ActiveDocument.Name     OldPath = ActiveDocument.Path & Application.PathSeparator     If ActiveDocument.Path = "" Then         MsgBox "Please save this document before sending to drive A:", _            vbOKOnly, "This Document Not Saved"

Else         Documents(ActiveWindow.Caption).Close         FileCopy OldPath & OrigLongFileName, "a:\" & OrigLongFileName         Documents.Open FileName:=OldPath & OrigLongFileName         Application.GoBack     End If     System.Cursor = wdCursorNormal End Sub

La macro vérifie d’abord que le document actuel a été enregistré quelque part sur votre disque dur. (En d’autres termes, ce n’est pas un tout nouveau document.) Ensuite, il ferme le document, le copie dans A: et rouvre le document. La raison de la fermeture est que Word n’autorisera pas la copie d’un document ouvert. Étant donné que le document est fermé, il est important que cette macro soit enregistrée dans le modèle Normal.Dot ou dans un autre modèle global.

Enfin, si vous vouliez créer une macro qui prend un « instantané » du document actuel, sans l’enregistrer réellement sur votre disque dur avant de faire la copie sur A :, vous devrez dupliquer votre document puis enregistrer le duplicata sur A :. Cependant, copier un document entier nécessite un peu plus d’efforts que de simplement saisir le contenu du texte et de le transmettre à un nouveau document. Les documents Word sont divisés en morceaux qui représentent le corps principal, les en-têtes et pieds de page, les notes de bas de page, etc. Ceux-ci sont référencés dans VBA en utilisant StoryRanges, chaque StoryRange ayant un StoryType. La macro suivante copie chacune des StoryRanges dans un nouveau document, puis vous invite à enregistrer le nouveau document sur A:

Public Sub CopyToA()

Dim docActive As Document     Dim docNew As Document     Dim rngActiveDocPart As Range     Dim rngNewDocPart As Range     Dim strDocName As String     Dim strTemplateName As String

' reference the current document     Set docActive = ActiveDocument

' get the name of doc and also path/name     ' of the template it's based-on     strDocName = docActive.Name     strTemplateName = docActive.AttachedTemplate.FullName

' create a copy document based on same template     Set docNew = Documents.Add(strTemplateName)



' loop to copy each part of the active doc to the new doc     For Each rngActiveDocPart In docActive.StoryRanges         ' reference same part         Set rngNewDocPart = docNew.StoryRanges _            (rngActiveDocPart.StoryType)

rngActiveDocPart.Copy         rngNewDocPart.Paste     Next rngActiveDocPart

' make the new document active     docNew.Activate

' offer to save it on floppy drive A:\     With Dialogs(wdDialogFileSaveAs)

.Name = "A:\" & strDocName         .Show     End With End Sub

Cette approche finale pourrait évidemment être modifiée de sorte que le document de copie nouvellement créé soit fermé après l’enregistrement. De cette façon, votre document d’origine serait laissé ouvert et non enregistré sur le disque une fois la macro terminée.

Si toutes les techniques décrites dans cette astuce vous semblent intéressantes, mais que vous n’avez pas de lecteur de disquette sur votre système, ne désespérez pas. Vous pouvez également utiliser les mêmes macros pour enregistrer des copies sur votre lecteur flash. Tant que vous connaissez la lettre de lecteur pour le lecteur flash, remplacez simplement cette lettre de lecteur par l’indicateur de lecteur A: dans les macros.

(Fonctionne comme un charme.)

_Note: _

Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites WordTips), j’ai préparé une page spéciale qui comprend des informations utiles.

lien: / wordribbon-WordTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur].

WordTips est votre source pour une formation Microsoft Word rentable.

(Microsoft Word est le logiciel de traitement de texte le plus populaire au monde.) Cette astuce (1715) s’applique à Microsoft Word 97, 2000, 2002 et 2003.