Modification de macros Visual Basic enregistrées

L’enregistreur de macros est un excellent outil pour découvrir les méthodes et propriétés Visual Basic que vous souhaitez utiliser. Si vous ne savez pas quelles propriétés ou méthodes utiliser, activez l’enregistreur de macro et effectuez manuellement l’action. L'enregistreur de macros traduit directement vos actions en code Visual Basic. Cette méthode a toutefois ses limites. En effet, il n'est pas possible d'enregistrer les opérations suivantes :

  • les branches conditionnelles ;

  • les affectations de variables ;

  • les structures en boucle ;

  • les formulaires personnalisés ;

  • le traitement des erreurs ;

  • les sélections de texte effectuées à l'aide de la souris (vous devez utiliser les combinaisons de touches).

Pour améliorer les macros ainsi créées, vous pouvez réviser et modifier le code enregistré dans votre module.

Suppression de la propriété Selection

Les macros créées à l’aide de l’enregistreur de macros sont basées sur la sélection active. Au début de la plupart des instructions macro enregistrées, vous voyez Selection. Les macros enregistrées utilisent la propriété Selection pour renvoyer l’objet Selection . Par exemple, l’exemple ci-dessous montre comment déplacer la sélection vers le signet Temp et insérer du texte après ce signet.

Sub Macro1() 
    Selection.Goto What:=wdGotoBookmark, Name:="Temp" 
    Selection.MoveRight Unit:=wdCharacter, Count:=1 
    Selection.TypeText Text:="New text" 
End Sub

Cette macro accomplit la tâche, mais présente deux inconvénients. Premièrement, si le document ne contient pas de signet nommé Temp, une erreur se produit. Deuxièmement, la macro déplace la sélection, ce qui n'est peut-être pas opportun. Ces deux problèmes peuvent être résolus en révisant la macro de telle sorte qu'elle n'utilise pas l'objet Selection. La macro révisée se présente de la façon suivante :

Sub MyMacro() 
    If ActiveDocument.Bookmarks.Exists("Temp") = True Then 
        endloc = ActiveDocument.Bookmarks("Temp").End 
        ActiveDocument.Range(Start:=endloc, _ 
        End:=endloc).InsertAfter "New text" 
    End If 
End Sub

La méthode Exists est utilisée pour case activée l’existence du signet nommé Temp. Si le signet est trouvé, la position du caractère de fin du signet est retournée à l’aide de la propriété End. Enfin, la méthode Range de l’objet Document est utilisée pour renvoyer un objet Range qui fait référence à la position de fin du signet, afin que le texte puisse être inséré à l’aide de la méthode InsertAfter de l’objet Range . Pour plus d’informations sur la définition d’objets Range, voir Utilisation des objets Range.

Utilisation de la structure With…End With

Les instructions faisant référence au même objet peuvent être simplifiées à l'aide de la structure With…End With. Par exemple, la macro ci-dessous a été enregistrée lors de l'ajout d'un titre en haut du document.

Sub Macro1() 
    Selection.HomeKey Unit:=wdStory 
    Selection.TypeText Text:="Title" 
    Selection.ParagraphAlignment.Alignment = wdAlignParagraphCenter 
End Sub

La propriété Selection est utilisée avec chaque instruction pour renvoyer un objet Selection. La macro peut être simplifiée de telle sorte que la propriété Selection ne soit utilisée qu'une fois.

Sub MyMacro() 
    With Selection 
        .HomeKey Unit:=wdStory 
        .TypeText Text:="Title" 
        .ParagraphAlignment.Alignment = wdAlignParagraphCenter 
    End With 
End Sub

La même tâche peut également être effectuée sans utiliser l'objet Selection. La macro ci-dessous accomplit la même tâche sur un objet Range situé au début du document actif.

Sub MyMacro() 
    With ActiveDocument.Range(Start:=0, End:=0) 
        .InsertAfter "Title" 
        .ParagraphFormat.Alignment = wdAlignParagraphCenter 
    End With 
End Sub

Suppression des propriétés inutiles

Si vous enregistrez une macro qui inclut la sélection d'une option dans une boîte de dialogue, l'enregistreur de macros enregistre le paramétrage de toutes les options de la boîte de dialogue, même si vous ne modifiez qu'une ou deux options. Si vous n’avez pas besoin de modifier toutes les options, vous pouvez supprimer les propriétés inutiles de la macro enregistrée. La macro enregistrée ci-dessous contient un certain nombre d'options de la boîte de dialogue Paragraphes (menu Format).

Sub Macro1() 
    With Selection.ParagraphFormat 
        .LeftIndent = InchesToPoints(0) 
        .RightIndent = InchesToPoints(0) 
        .SpaceBefore = 6 
        .SpaceAfter = 6 
        .LineSpacingRule = 0 
        .Alignment = wdAlignParagraphLeft 
        .WidowControl = True 
        .KeepWithNext = False 
        .KeepTogether = False 
        .PageBreakBefore = False 
        .NoLineNumber = False 
        .Hyphenation = True 
        .FirstLineIndent = InchesToPoints(0) 
        .OutlineLevel = 10 
    End With 
End Sub

Si vous ne voulez modifier que l'espacement avant et après le paragraphe, vous pouvez alors modifier la macro de la façon suivante :

Sub MyMacro() 
    With Selection.ParagraphFormat 
        .SpaceBefore = 6 
        .SpaceAfter = 6 
    End With 
End Sub

La macro simplifiée s'exécute plus vite, car elle définit moins de propriétés. Seul l'espacement avant et après les paragraphes sélectionnés est modifié, tous les autres paramètres restant inchangés.

Suppression des arguments inutiles

Lorsque l’enregistreur de macros enregistre une méthode, les valeurs de tous les arguments sont prises en compte. La macro ci-dessous a été enregistrée lors de l’ouverture du document nommé Test.doc. La macro obtenue inclut tous les arguments de la méthode Open .

Sub Macro1() 
    Documents.Open FileName:="C:\My Documents\Test.doc", _ 
        ConfirmConversions:= False, ReadOnly:=False, _ 
        AddToRecentFiles:=False, PasswordDocument:="", _ 
        PasswordTemplate:="", Revert:=False, _ 
        WritePasswordDocument:="", _ 
        WritePasswordTemplate:="", Format:=wdOpenFormatAuto 
End Sub

Les arguments inutiles peuvent être supprimés de la macro enregistrée. Par exemple, vous pouvez supprimer tous les arguments définis sur une chaîne vide (par exemple, WritePasswordDocument:=""), comme indiqué.

Sub MyMacro() 
    Documents.Open FileName:="C:\My Documents\Test.doc", _ 
        ConfirmConversions:= False, _ 
        ReadOnly:=False, AddToRecentFiles:=False, _ 
        Revert:=False, Format:=wdOpenFormatAuto 
End Sub

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.