修改录制的 Visual Basic 宏

   

宏录制器是查找所需的 Visual Basic 方法和属性的非常方便的工具。如果不知道使用何种属性或方法,可打开宏录制器,手动执行操作。宏录制器会将操作译为 Visual Basic 代码。但录制宏具有一些限制条件。您不能录制下列内容:

若要增强宏的功能,可能需要修改录制到模块中的代码。

删除 Selection 属性

使用宏录制器创建的宏取决于所选内容。在大多数录制的宏指令的开头,可以看到“Selection”。录制的宏使用 Selection 属性返回 Selection 对象。例如,下列示例将所选内容移动至 Temp 书签,并在书签之后插入文字。

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

这个宏虽然可以完成任务,但是有一些缺点。首先,如果文档中没有一个名为 Temp 的书签,该宏将导致出错。其次,该宏可能不正确地移动所选内容。修改这个宏,使其不再使用 Selection 对象,就可解决上述两个问题。以下就是经修改后的宏:

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

Exists 方法用于检查是否存在名为 Temp 的书签。如果找到该书签,则用 End 属性返回该书签结束字符的位置。最后使用 Range 方法返回一个引用书签结束位置的 Range 对象,以使用 InsertAfter 方法插入文字。有关定义 Range 对象的详细信息,请参阅处理 Range 对象

使用 With…End With

可使用 With…End With 结构简化引用相同对象的宏指令。例如,在文档顶部添加标题时,将录制下面的宏。

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

每个指令都使用 Selection 属性返回一个 Selection 对象。可以简化这个宏,这样只需使用一次 Selection 属性。

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

不使用 Selection 对象也可以完成相同的任务。下面的宏在活动文档的开头使用 Range 对象来完成相同的任务。

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

删除不必要的属性

如果录制了一个关于在对话框中选择选项的宏,即使只更改一个或两个选项,宏录制器也会记录该对话框中的所有选项的设置。如果不希望更改所有的选项,可从录制的宏中删除不必要的属性。下面录制的宏包含“段落”对话框的一些选项(单击“格式”菜单可显示该对话框)。

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

但是,如果只需更改段前和段后间距,可将宏更改为:

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

因为只设置了较少的属性,所以简化后的宏运行得更快。运行结果只更改选定段落的段前和段后的间距,所有其他设置都没有改变。

删除不必要的参数

当宏录制器记录一个方法时,会包含所有参数的值。打开名为 Test.doc 的文档时,录制了下面的宏。所得到的宏包含 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

可以从录制的宏中删除不需要的参数。例如,可以删除所有设置为空字符串的参数(如 WritePasswordDocument:=""),如下所示。

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