第 1 页 共 9 页
第二课:录制宏、编辑宏与优化宏
上一课中,我们初步认识了VBA是什么,怎么进入VBE编辑器,以及VBE的环境设置等。本课中,我们来录制宏、编辑宏与优化宏。
录制宏有两种方式,一是双击状态栏中的\"录制\"命令,或者鼠标单击工具\\宏\\录制新宏命令,WORD将记录下您的操作并转换为VB语言.
在XP以下版本中,录制宏操作不支持鼠标操作,您可以使用键盘操作,请结合键盘加速键、键盘快捷键等进行操作,此处不再解释加速键和快捷键的含义。另外,在XP版本中,对部分右键菜单不支持的情况下,可以使用SHIFT+F10进行调用右键快捷菜单等。
OK,我们选择上述方法之一,来录个一个宏,我们的操作是这样的,对全文档中的字体设置为:华文细黑,粗体,12号,行距1.5,段前12磅,段后12磅,录制结束,千万别忘了停止录制宏哟,点“停止”而非关闭“停止录制宏”工具栏,否则,要绕些小圈子了。
如图:
在上图的录制宏对话框中, 我们可以自定义宏名, 将宏提定到工具栏或者键盘上, 保存宏的位置(作用范围), 如果是“所有文档(Normal.dot)”, 则它是全局的宏, 可以为所有文档所调用, 是公共的宏; 如果是本文档, 则是私有的, 仅作用于当前文档。 同理, 如果我们指定在工具栏或者键盘中, 如果是“所有文档(Normal.dot)”, 则该工具栏作用于所有WORD 文档, 反之则仅作用于当前文档, 其它文档中将不会出现此宏、 工具栏或者键盘快捷键。
好, 我们进入 VBE, 你可以使用 ALT+F8, 在宏位置中为当前文档, 找到该宏名, 点右侧的“编辑” 命令, 或者直接 ALT+F11 , 找到该文档的工程资源管理器, 双击“NewMacros\"模块, 则在右侧的代码窗口中, 会看到以下代码, 守柔把它注释一下(如果在 VBE 代码窗口中, 我们将光标位于代码中或者选定某个关键字, 按下 F1 , 会出现详细的 VBA 帮助),以使大家更快地明白它的意思:
Sub OurExample()
'这部分说明来自录制宏对话框 ' OurExample Macro
' 宏在 2005-7-20 由 I Love You_Word! 录制 ' \"&chr(10)&\"WORD-VBA专题讲座之二 ' Selection.WholeStory'全选文档,CTRL+A With Selection.Font '对选定文字
.NameFarEast = \"华文细黑\" '东亚字体
.NameAscii = \"Tahoma\" '设置拉丁文(字符代码从 0(零) 到 127 的字符)所用的字体 .NameOther = \"Tahoma\" '设置字符代码从 128 到 255 的字符的字体
守柔 WORD VBA 入门 教程
第 2 页 共 9 页
.Name = \"华文细黑\" '字体名称 .Size = 12 '字号 .Bold = True '粗体 .Italic = False '非斜体
.Underline = wdUnderlineNone '无下划线
.UnderlineColor = wdColorAutomatic '下划线颜色自动 .StrikeThrough = False „无删除线格式
.DoubleStrikeThrough = False '无双删除线格式 .Outline = False '无镂空格式 .Emboss = False '无阳文格式 .Shadow = False '无阴影格式 .Hidden = False '不隐藏文字
.SmallCaps = False '不小型大写字母 .AllCaps = False '不全部字母大写
.Color = wdColorAutomatic '自动字体颜色 .Engrave = False '不阴文 .Superscript = False '不上标 .Subscript = False '不下标 .Spacing = 0 '字符间距 .Scaling = 100 '不缩放 .Position = 0 '正常位置 .Kerning = 1 '最小字号
.Animation = wdAnimationNone'无动态效果
.DisableCharacterSpaceGrid = False '不忽略选定文本每行中的字符数 .EmphasisMark = wdEmphasisMarkNone '不设置着重号 End With
With Selection.ParagraphFormat'对于选定内容的段落格式 .LeftIndent = CentimetersToPoints(0)'左缩进为 0,即无 .RightIndent = CentimetersToPoints(0)'右缩进为 0,即无 .SpaceBefore = 12'段前 12 磅
.SpaceBeforeAuto = False'不自动设置指定段落的段前间距 .SpaceAfter = 12'段后为 12 磅
.SpaceAfterAuto = False'不自动设置指定段落的段后间距 .LineSpacingRule = wdLineSpace1pt5'行距为 1.5 倍
.Alignment = wdAlignParagraphJustify'段落对齐方式,常规,两端对齐
.WidowControl = False'重新分页时段中的首行或末行有可能单独位于上页的页尾或下页的页首。 .KeepWithNext = False'文档重新分页时, 指定段落与下一段可能位于下一页
.KeepTogether = False'Word 对文档重新分页时同一段中的各行可能不位于同一页上。 .PageBreakBefore = False'指定段落前不插入分页符 .NoLineNumber = False'不设置行号 .Hyphenation = True'段落进行自动断字
.FirstLineIndent = CentimetersToPoints(0)’首行缩进为 0,即无首行缩进 .OutlineLevel = wdOutlineLevelBodyText'大纲级别为正文文本 .CharacterUnitLeftIndent = 0'段落的左缩进为 0 字符 .CharacterUnitRightIndent = 0'段落的右缩进为 0 字符
.CharacterUnitFirstLineIndent = 0'段落的首行缩进为 0 字符
.LineUnitBefore = 0 ’设置指定段落的段前间距(以网格线为单位) ,0
守柔 WORD VBA 入门 教程
第 3 页 共 9 页
.LineUnitAfter = 0 ’设置指定段落的段后间距(以网格线为单位) ,0
.AutoAdjustRightIndent = True'指定的每行字符数,自动调整所选段落的右缩进。 .DisableLineHeightGrid = False'段落中的字符与行网格不进行对齐。 .FarEastLineBreakControl = True'应用东亚语言文字的换行规则 .WordWrap = True'西文单词中间断字换行 .HangingPunctuation = True'允许标点溢出边界
.HalfWidthPunctuationOnTopOfLine = False'行首标点符号不改为半角字符
.AddSpaceBetweenFarEastAndAlpha = True'中文文字和拉丁文字之间自动添加空格 .AddSpaceBetweenFarEastAndDigit = True'中文文字和数字之间添加空格
.BaseLineAlignment = wdBaselineAlignAuto'自动调整活动文档中的基线字体对齐方式 End With End Sub '
----------------------
哇,简单地几步操作,这么多的代码(70 多行),别急,您对比一下以下我们的操作:字体对话框和段落对话框,您就明白了:
在上面的代码中,有代码,有注释,注释是良好程序员的一个重要标志,一个程序,需要必要的注释,不但对使用者,阅读者有利,对编程人员今后的代码维修升级也 是十分必要的.注释有两种方式,一种使用撇号('),也可以使用关键字\"Rem\通常使用前者,可以直接写在代码旁或者另起一行.
守柔 WORD VBA 入门 教程
第 4 页 共 9 页
好家伙,WORD 的宏记录把所有对话框中的信息都录上去了,这样子,尽管我们可以方便地使用它,总是感觉不太\"纤美\太\"铺张\"了. 我们来试试看这个宏是否能达到我们的要求:
运行宏的方法: (常规)
1 . 把文档恢复到录制宏前的状态,按下 ALT+F8,找到活动文档中的这个\"OurExample\"宏,点击运行。
守柔 WORD VBA 入门 教程
第 5 页 共 9 页
2. 使用 ALT+F11, 直接在 VBE 代码窗口中运行, 将光标定位于活动文档的工程资源管理的代码窗口中, 注意, 光标位置处于此过程(一个宏, 我们术语称之为过程,即将光标置于当前过程中, 其过程名(宏名) 也就是本例中所指的\"OurExample\")
如图:
按下快捷键 F5 或者使用 VBE 标准工具栏中的\"运行子过程/窗体\"命令,也可以使用运行菜单下的\"运行子过程/窗体\"命令. 看到了吧,这就是我们宏的作用,它可以代替我们以后的手动操作,如果经常使用某个操作(或者某几个操作组合的话),我们可以使用宏.
守柔 WORD VBA 入门 教程
第 6 页 共 9 页
另外,从录制的宏代码来看,它分了三个部分,一是全选操作, 一个是字体部分,另一个是段落部分(两个 With ……End With 结构), 也就是说, 宏是命令的组合。
您如果觉得看得懂守柔的注释和我们录制宏时的目的,那么,我们一起来修改一下: Sub RevOurExample() Selection.WholeStory With Selection.Font .Name = \"华文细黑\" .Size = 12 .Bold = True End With With Selection .ParagraphFormat .SpaceBefore = 1 2 .SpaceAfter = 12
.LineSpacingRule = wdLineSpace1pt5 End With End Sub
试着运行一下这个宏, 大家看到这个仅仅 1 3 行代码的宏, 正是我们想要的结果。 看了上述守柔的讲述,和您试运行了\"RevOurExample\"宏后,您是不是开始对WORD的宏有感觉了?
下面,我浅谈一下(在以后的讲座中将会深入),上面的\"RevOurExample\"宏中,代码还不是最好的,为什么,因为,它仍然使用了 SELECTION对象,而非 RANGE对象,这里,我们可以使用以下代码,能高效地达到我们初始目的:\" 对全文档中的字体设置为: 华文细黑, 粗体, 12 号, 行距1 .5,段前 12 磅,段后 12 磅\来看一下,优化后的代码是怎么样的: Sub Example()
With ActiveDocument.Content
With .Font .Font.Name = \"华文细黑\"
.Font.Size = 12 .Bold = True End With
With .ParagraphFormat
.SpaceBefore = 12 .SpaceAfter = 12
.LineSpacingRule = wdLineSpace1pt5 End With End With End Sub
显然, 代码行数基本没有 变动 , 变动 的 只 是对象, 前者\"RevOurExample\" 使用 了selection 对象,并且进行了全选操作,而在这个\" Example\"中,直接对全文档(RANGE 对象)的字体和段落格式进行了设置.
在这个\" Example\"中,我们使用了三个\"With ……End With\"语句, 我们来看一下, 这个语句结构的特点:
1. With 语句可以对某个对象执行一系列的语句, 而不用重复指出对象的名称。 例如,要改变一个对象的多个属性, 可以在 With 控制结构中加上属性的赋值语句, 这时
守柔 WORD VBA 入门 教程
第 7 页 共 9 页
候只是引用对象一次而不是在每个属性赋值时都要引用它。
2.注意 当程序一旦进入 With 块, object 就不能改变。 因此不能用一个 With 语句来设置多个不同的对象。
3.可以将一个 With 块放在另一个之中, 而产生嵌套的 With 语句。 但是, 由于外层 With 块成员会在内层的 With 块中被屏蔽住, 所以必须在内层的 With 块中, 使用完整的对象引用来指出在外层的 With 块中的对象成员。
4.重点 一般来说, 建议您不要跳入或跳出 With 块。 如果在 With 块中的语句被执行, 但是 With 或 End With 语句并没有执行, 则一个包含对该对象引用的临时变量将保留在内存中, 直到您退出该过程。
代码窗口:
可以使用代码窗口来编写、 显示以及编辑 Visual Basic 代码。 打开各模块的代码窗口后, 可以查看不同窗体或模块中的代码, 并且在它们之间做复制以及粘贴的动作。
可以按照下列所述的方式, 来打开代码窗口:
在工程窗口中, 可以选择一个窗体或模块, 然后右击选择“查看代码” 按钮或者双击该窗体或模块。 在 “用户窗体” 窗口中, 可以双击控件或窗体; 也可以从“视图” 菜单中选择“代码窗口”, 或者按下 F7 键。
窗口部件
“对象” 框 如图所示的(通用)部分
显示所选对象的名称。 可以按下列表框中的右边箭头, 来显示此窗体中的对象。 “过程/事件” 框 如图所示的(声明)部分 将“窗体” 或“对象” 框所含控件中,
可以列出所有 Visual Basic 的事件。 当选择了一个事件, 则与事件名称相关的事件过程, 就会显示在代码窗口中。
守柔 WORD VBA 入门 教程
第 8 页 共 9 页
如果在对象框中显示的是“通用”, 则过程框会列出所有声明, 以及为此窗体所创建的常规过程。 如果正在编辑模块中的代码, 则过程框会列出所有模块中的常规过程。 在上述两实例中, 在过程框中所选的过程都会显示在代码窗口中。
模块中的所有过程会出现在一个单一滚动条的列表中, 它们是按名称的字母来排列的。可以从代码窗口上端的下拉式列表中选取一个过程, 此时指针会移到所选过程的第一行代码上面。
我们再来看一下代码窗口图中的通用声明部分,本示例中,我们写了三个通用声明: Option Explicit
Public MyNumber As Integer Dim MyRange As Range 第一句代码 Option Explicit
1. 是强制显式声明本模块中的所有变量, 如果使用, Option Explicit 语句必须写在模块的所有过程之前。 2. 如果模块中使用了 Option Explicit, 则必须使用 Dim、 Private、 Public、 ReDim 或 Static 语句来显
式声明所有的变量。 如果使用了未声明的变量名在编译时间会出现错误。
3. 如果没有使用 Option Explicit 语句, 除非使用 Deftype 语句指定了缺省类型, 否则所有未声明的变
量都是 Variant 类型的。
4. 注意 使用 Option Explicit 可以避免在键入已有变量时出错, 在变量的范围不是很清楚的代码中使用
该语句可以避免混乱。
5. 如果您是初学者,不提倡写此句代码或者在 VB 环境设置中不要勾选显式声明变量选项,因为大家对变
量的定义还不理解.
第二句代码 Public MyNumber As I nteger
1. 在模块级别中使用, 用于声明公用变量和分配存储空间.
2. Public 语句声明的变量在所有应用程序的所有没有使用 Option Private Module 的模块的任何过程中都
是可用的,简单地理解就是经 public声明的变量,在当前工程中是公用的. 3. MyNumbe 变量名 4. Integer 变量类型
第三句代码:Dim MyRange As Range
1. 通常会使用 Dim 语句来声明变量。 一个声明语句可以放到过程中以创建属于过程的级别的变量。 或
在声明部分可将它放到模块顶部, 以创建属于模块级别的变量。
2. 当 dim 语句如本例中所示时,它将 MyRange 变量声明为本模块中公用;当 dim 语句的变量声明位于如
sub ……End Sub 中时, 仅为该过程所有, 过程运行结束, 变量即在内存中消失。 再看一下我们的 sub ……end sub 过程 Sub Example() …… End Sub
1. sub 语句: 声明子过程的名称, 参数, 以及构成其主体的代码。 无论你如何理解,简单一句话, 只
要你想编程, 简单的, 就使用 sub ……end sub,过程名尽可能不要与 WORD 命令、 函数、 关键字一致就行了(如果与 WORD 命令一致, 就是修改 WORD 命令了)。
2. 如果没有使用 Public、 Private 或 Friend 显式指定, Sub 过程按缺省情况就是公
守柔 WORD VBA 入门 教程
第 9 页 共 9 页
用的。
3.如果是 private sub Example()……end sub , 那么, 这个\"Example\"过程,表示只有在包含其声明的模块中
的其它过程可以访问该 Sub 过程
接着,我们进入 WORD DOCUMNT 对象的三个重要事件:
注意,DOCUMENT 对象仅隶属于 THISDOCUMENT 类模块中,也就是当前工程下的\"THISDOCUMENT\"模块,它是一个类模块.而我们通常录制宏时,WORD 会自动新建一个模块,它是标准模块.
'关闭文档时将会触发此事件 Private Sub Document_Close()
End Sub
'新建文档时,将会触发此事件(通常用于模板中) Private Sub Document_New()
End Sub
'打开文档时,将发触此事件 Private Sub Document_Open()
End Sub
OK,我们可以试着在代码窗口中粘贴以下代码: Private Sub Document_Close()
MsgBox \"这是一个关闭文档事件!\" End Sub
Private Sub Document_Open()
MsgBox \"这是一个打开文档的事件\" End Sub
保存文件,关闭和打开这个文件,你看到了什么?
好了,这一讲,守柔就先说到这儿,您有什么问题和疑问,请随时与我交流! 下一讲,我们将讨论对象,属性,方法.
因篇幅问题不能全部显示,请点此查看更多更全内容