宏录制器是发现要使用的 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 属性返回书签的结束字符位置。 最后,Document 对象的 Range 方法用于返回引用书签结束位置的 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
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。