WordVBA学习交流资料全.docx
《WordVBA学习交流资料全.docx》由会员分享,可在线阅读,更多相关《WordVBA学习交流资料全.docx(114页珍藏版)》请在冰点文库上搜索。
WordVBA学习交流资料全
WordVBA学习交流资料
一、对象模型
打开WordVBA帮助,首先看到的是“Word的对象模型”(如下所示)
图表1
知识点:
知道Application对象(Word应该程序的总对象)、Doctuments对象(文档集对象)、Paragraphs对象(段落集)、Selection(选中区域)对象、Tables(表格)对象、Sections(节,即Word的第一节)对象、Headers(页眉)对象。
二、新增功能
(略)
原因:
我们的初衷大多是从“零”开始,最基础的我们都不知道,何来“新增”啊?
但是,以后学到相关的知识时,会跳到这里,学一些新增的“对象”、“方法”、“事件”、“属性”等。
三、编程概念
对象是VisualBasic的结构基础,在VisualBasic中进行的所有操作几乎都与修改对象有关。
MicrosoftWord的任何元素,如文档、表格、段落、书签、域等,都可用VisualBasic中的对象来表示。
什么是对象和集合?
对象代表一个Word元素,如文档、段落、书签或单独的字符。
集合也是一个对象,该对象包含多个其他对象,通常这些对象属于相同的类型;例如,一个集合对象中可包含文档中的所有书签对象。
通过使用属性和方法,可以修改单独的的对象,也可修改整个的对象集合。
例如:
ActiveDocument.Paragraphs
(2).Range.Characters
(1).Font.Color=wdColorRed
在Word的VBA中,大多数对象都是通过Application来访问,但有几个可以直接访问:
如activedocumnet、documents等,当然通过application对象也行,但无疑后者更简略。
什么是属性?
属性是对象的一种特性或该对象行为的一个方面。
例如,文档属性包含其名称、容、保存状态以及是否启用修订。
若要更改一个对象的特征,可以修改其属性值。
若要设置属性的值,可在对象的后面紧接一个句号、属性名称、一个等号及新的属性值。
下列示例在名为“MyDoc.doc”的文档中启用修订。
SubTrackChanges()
Documents("Sales.doc").TrackRevisions=True
EndSub3
在本例中,Documents引用由打开的文档(注意是对打开后文档的操作)构成的集合,而“MyDoc.doc”标识集合中单独的文档。
并设置该文档的TrackRevisions属性。
不能设置某些属性。
属性的“帮助”主题中会标明可以设置该属性(可读写),或只能读取该属性(只读)。
通过返回对象的一个属性值,可以获取有关该对象的信息。
下列示例返回活动文档的名称。
SubGetDocumentName()
DimstrDocNameAsString
strDocName=ActiveDocument.Name
MsgBoxstrDocName
EndSub
(这个例子输出的没有路径,只有名字.若带路径的话,把strDocName=ActiveDocument.Name改为:
strDocName=ActiveDocument.Path&ActiveDocument.Name)
在本例中,ActiveDocument引用Word活动窗口中的文档。
该文档的名称赋给了strDocName变量。
说明:
每个属性的“帮助”主题表明可以设置该属性(可读写),只能读取该属性(只读),或只能写入该属性(只写)。
此外“VisualBasic编辑器”中的“对象浏览器”在浏览窗口的底部显示所选属性的读写状态。
什么是方法?
方法是对象可以执行的动作。
例如,只要文档可以打印,Document对象就具有PrintOut方法。
方法通常带有参数,以限定执行动作的方式。
下列示例打印活动文档的前三页。
SubPrintThreePages()
ActiveDocument.PrintOutRange:
=wdPrintRangeOfPages,Pages:
="1-3"
EndSub
在大多数情况下,方法是动作,而属性是性质。
使用方法将导致发生对象的某些事件(所以,有人说:
“方法是集成了的事件”),而使用属性则会返回对象的信息,或引起对象的某个性质的改变。
返回一个对象
可通过返回集合中单独的对象的方式来返回大多数对象。
例如Documents集合包含打开的Word文档。
可使用(位于Word对象结构顶层的)Application对象的Documents属性返回Documents集合。
在访问集合之后,可以通过在括号中使用索引序号(与处理数组的方式相似)返回单独的对象。
索引序号通常是一个数值或名称。
详细容,请参阅返回集合中的对象。
下列示例使用Documents属性访问Documents集合。
索引序号用于返回Documents集合中的第一篇文档。
然后将Close方法应用于Document对象,关闭Documents集合中的第一篇文档。
SubCloseDocument()
Documents
(1).Close
EndSub
'这个可能以后大多不用,原因就是索引序号在变,当打开、关闭一个文档时,对应的序号就增加或减少了数字,所以不好把握,大多不用。
下列示例使用名称(指定为一个字符串)来识别Documents集合中的Document对象。
SubCloseSalesDoc()
Documents("Sales.doc").Close
EndSub
'这个常用,让某个指定的文档关闭。
集合对象通常具有可用于修改整个对象集合的方法和属性。
Documents对象具有Save方法,可用于保存集合中的所有文档。
下列示例通过使用Save方法保存所有打开的文档。
SubSaveAllOpenDocuments()
Documents.Save
EndSub
'所有的文档保存,相当于按住Shift再点击文件下的全部保存命令。
Document对象也可使用Save方法保存单独的文档。
下列示例保存名为Sales.doc的文档。
SubSaveSalesDoc()
Documents("Sales.doc").Save
EndSub
'对指定的文档保存。
若要返回一个处于Word对象结构底层的对象,就必须使用可返回对象的属性和方法,“深入”到该对象。
若要查看该过程的执行,请打开“VisualBasic编辑器”,在“视图”菜单上单击“对象浏览器”。
单击左侧“类”列表中的Application。
然后单击右侧“成员”列表中的ActiveDocument。
“对象浏览器”底部会显示文字,表明ActiveDocument是只读的,该属性返回Document对象。
然后单击“对象浏览器”底部的Document,则会在“类”列表中自动选定Document对象,并将在“成员”列表中显示Document对象的成员。
滚动成员列表,找到Close,单击Close方法。
“对象浏览器”窗口底部会显示文字,说明该方法的语法。
有关该方法的详细容,请按F1(作者注:
不把F1磨平,VBA很难真正掌握^-^)或单击“帮助”按钮,以跳转到Close方法的“帮助”主题。
根据这些信息可编写下列指令,以关闭活动文档。
SubCloseDocSaveChanges()
ActiveDocument.CloseSaveChanges:
=wdSaveChanges
EndSub
'关闭并保存改变。
这里显然,保存为方法,后面有参数
下列示例将活动文档窗口最大化。
SubMaximizeDocumentWindow()
ActiveDocument.ActiveWindow.WindowState=wdWindowStateMaximize
EndSub
'这个是赋最大化值属性给活动窗口
ActiveWindow属性返回一个Window对象,该对象代表活动窗口。
将WindowState属性设为最大常量(wdWindowStateMaximize)。
下列示例新建一篇文档,并显示“另存为”对话框,这样即可为文档提供一个名称。
SubCreateSaveNewDocument()
Documents.Add.Save
EndSub
'这个有意思,添加新文档并保存,一步,利害吧
'如果不是看帮助,你敢这么用吗?
方法.方法
Documents属性返回Documents集合。
Add方法新建一篇文档,并返回一个Document对象。
然后对Document对象应用Save方法。
如上所示,可以使用方法或属性来访问下层对象。
也就是说,在对象结构中,将方法或属性应用于某个对象的上一级对象,可返回该下级对象。
返回所需对象之后,就可以应用该对象的方法并控制其属性。
要查看对象结构分层的情况,请参阅MicrosoftWord对象。
获得有关对象、方法和属性的“帮助”信息
在熟悉Word对象模型之前,可以利用一些工具来深入了解对象结构。
自动成员列表。
(重要)在“VisualBasic编辑器”中,在对象后面键入句号(.)后,即显示可用的属性和方法的列表。
例如,如果键入“Application.”,就会显示Application对象的方法和属性的下拉列表。
帮助。
也可以使用“帮助”找到可应用于对象的属性和方法。
“帮助”中的每个对象主题都包含一个“参阅”跳转,以显示该对象的属性和方法列表。
在“对象浏览器”或某一模块中按F1,可跳转到相应的“帮助”主题。
MicrosoftWord对象。
该主题阐明在分级结构中Word对象的排列方式。
在结构图中单击一个对象,可显示相应的“帮助”主题。
对象浏览器。
“VisualBasic编辑器”中的“对象浏览器”显示Word对象的成员(属性和方法)。
-----------------------------------------
实例:
打开Word后,按Alt+F11,出现VBE窗口,
双击右边的Thisdocument(当然,放到底下的模块中任一个也行),输入如下容:
Subautoexec()
Application.Caption="我爱我家!
"
EndSub
这时,关闭Word,再打开Word。
你的标题就有“×××.doc—我爱我家!
”了!
图表2
当然,也可以进一步做成这样:
Subautoexec()
Dima
a=MsgBox("我家我家",vbYesNo,"这是一个试验")
Ifa<>6Then
Application.Quit
EndIf
EndSub
'功能就是打开Word时,显示此对话框,如果点了“是”就不作处理即打开Word,否则,退出Quit。
也可以写成这样:
Subautoexec()
Dima
a=InputBox("你的","防君子,不防小人!
")
Ifa<>"小小"Then
Application.Quit
EndIf
EndSub
'功能就是打开Word时,显示此对话框,如果输入的不是小小,就打不开。
MsgBox函数参考:
在对话框中显示消息,等待用户单击按钮,并返回一个Integer告诉用户单击哪一个按钮。
语法
MsgBox(prompt[,buttons][,title][,helpfile,context])
MsgBox函数的语法具有以下几个命名参数:
部分描述
Prompt必需的。
字符串表达式,作为显示在对话框中的消息。
prompt的最大长度大约为1024个字符,由所用字符的宽度决定。
如果prompt的容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或是回车与换行符的组合(Chr(13)&Chr(10))将各行分隔开来。
Buttons可选的。
数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。
如果省略,则buttons的缺省值为0。
Title可选的。
在对话框标题栏中显示的字符串表达式。
如果省略title,则将应用程序名放在标题栏中。
Helpfile可选的。
字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。
如果提供了helpfile,则也必须提供context。
Context可选的。
数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。
如果提供了context,则也必须提供helpfile。
设置值
buttons参数有下列设置值:
常数值描述
vbOKOnly0只显示OK按钮。
VbOKCancel1显示OK及Cancel按钮。
VbAbortRetryIgnore2显示Abort、Retry及Ignore按钮。
VbYesNoCancel3显示Yes、No及Cancel按钮。
VbYesNo4显示Yes及No按钮。
VbRetryCancel5显示Retry及Cancel按钮。
VbCritical16显示CriticalMessage图标。
VbQuestion32显示WarningQuery图标。
VbExclamation48显示WarningMessage图标。
VbInformation64显示InformationMessage图标。
vbDefaultButton10第一个按钮是缺省值。
vbDefaultButton2256第二个按钮是缺省值。
vbDefaultButton3512第三个按钮是缺省值。
vbDefaultButton4768第四个按钮是缺省值。
vbApplicationModal0应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作。
vbSystemModal4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。
vbMsgBoxHelpButton16384将Help按钮添加到消息框
VbMsgBoxSetForeground65536指定消息框窗口作为前景窗口
vbMsgBoxRight524288文本为右对齐
vbMsgBoxRtlReading1048576指定文本应为在希伯来和阿拉伯语系统中的从右到左显示
第一组值(0–5)描述了对话框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512)说明哪一个按钮是缺省值;而第四组值(0,4096)则决定消息框的强制返回性。
将这些数字相加以生成buttons参数值的时候,只能由每组值取用一个数字。
注意这些常数都是VisualBasicforApplications(VBA)指定的。
结果,可以在程序代码中到处使用这些常数名称,而不必使用实际数值。
返回值
常数值描述
vbOK1OK
vbCancel2Cancel
vbAbort3Abort
vbRetry4Retry
vbIgnore5Ignore
vbYes6Yes
vbNo7No
说明
如果对话框显示Cancel按钮,则按下ESC键与单击Cancel按钮的效果相同。
如果对话框中有Help按钮,则对话框中提供有上下文相关的帮助。
但是,直到其它按钮中有一个被单击之前,都不会返回任何值。
注意如果还要指定第一个命名参数以外的参数,则必须在表达式中使用MsgBox。
为了省略某些位置参数,必须加入相应的逗号分界符。
一、通过录制宏生成代码
如果无法确定要使用的VisualBasic方法或属性,可打开宏录制器并进行手动操作。
宏录制器会将操作译成VisualBasic代码。
录制操作完成后,可根据需要修改代码。
例如,如果无法确定实现段落缩进的属性或方法,可执行下列操作:
1.在“工具”菜单上,指向“宏”,然后单击“录制新宏”。
2.如果需要,可更改默认的宏名称,然后单击“确定”启动录制器。
3.在“格式”菜单上,选定“段落”。
4.更改段落左缩进的值,然后单击“确定”。
5.单击“停止录制”工具栏上的“停止录制”按钮。
6.在“工具”菜单上,指向“宏”,然后单击“宏”。
7.从步骤2中选择宏的名称,然后单击“编辑”按钮。
查看VisualBasic代码来确定对应于段落左缩进的属性(LeftIndent属性)。
将插入点置于LeftIndent之中,并按F1或单击“帮助”按钮。
在帮助主题中,可以查看示例以及支持LeftIndent属性的对象(单击“应用于”)。
(从上面可以看出,录制宏是我们认识未知对象的很好方法之一)
说明
录制的宏使用Selection属性返回Selection对象。
例如,下列指令将所选段落缩进0.5英寸。
SubIndentParagraph()
Selection.ParagraphFormat.LeftIndent=InchesToPoints(0.5)
EndSub
您也可以修改录制的宏并与Range对象一起使用。
(我们在日常的使用中经常注意到:
在使用“本机上的模板”时的向导就大量使用了Selection对象,而不是Range对象!
难道说微软有更新层次的考虑?
我想可能是Selection对象更稳定,跨版本能力更强吧!
)
二、修改录制的VisualBasic宏
宏录制器是查找所需的VisualBasic方法和属性的非常方便的工具。
如果不知道使用何种属性或方法,可打开宏录制器,手动执行操作。
宏录制器会将操作译为VisualBasic代码。
但录制宏具有一些限制条件。
您不能录制下列容:
条件分支
变量指定
循环结构
自定义用户窗体
出错处理
用鼠标选定的文字(必须使用组合键)
若要增强宏的功能,可能需要修改录制到模块中的代码。
删除Selection属性
使用宏录制器创建的宏取决于所选容。
在大多数录制的宏指令的开头,可以看到“Selection”。
录制的宏使用Selection属性返回Selection对象。
例如,下列示例将所选容移动至Temp书签,并在书签之后插入文字。
SubMacro1()
Selection.GotoWhat:
=wdGotoBookmark,Name:
="Temp"
Selection.MoveRightUnit:
=wdCharacter,Count:
=1
'相当于选中后按一个键盘的右方向键
Selection.TypeTextText:
="Newtext"
EndSub
这个宏虽然可以完成任务,但是有一些缺点。
首先,如果文档中没有一个名为Temp的书签,该宏将导致出错。
其次,该宏可能不正确地移动所选容。
修改这个宏,使其不再使用Selection对象,就可解决上述两个问题。
以下就是经修改后的宏:
SubMyMacro()
IfActiveDocument.Bookmarks.Exists("Temp")=TrueThen
endloc=ActiveDocument.Bookmarks("Temp").End
ActiveDocument.Range(Start:
=endloc,_
End:
=endloc).InsertAfter"Newtext"
'_ 就是续行的意思
EndIf
EndSub
Exists方法用于检查是否存在名为Temp的书签。
如果找到该书签,则用End属性返回该书签结束字符的位置。
最后使用Range方法返回一个引用书签结束位置的Range对象,以使用InsertAfter方法插入文字。
有关定义Range对象的详细信息,请参阅处理Range对象。
使用With…EndWith
可使用With…EndWith结构简化引用相同对象的宏指令。
例如,在文档顶部添加标题时,将录制下面的宏。
SubMacro1()
Selection.HomeKeyUnit:
=wdStory
Selection.TypeTextText:
="Title"
Selection.ParagraphAlignment.Alignment=wdAlignParagraphCenter
EndSub
每个指令都使用Selection属性返回一个Selection对象。
可以简化这个宏,这样只需使用一次Selection属性。
SubMyMacro()
WithSelection
.HomeKeyUnit:
=wdStory
.TypeTextText:
="Title"
'.ParagraphAlignment.Alignment=wdAlignParagraphCenter
'上面那句是原帮助中的,但肯定是笔误!
微软没看出?
!
.ParagraphFormat.Alignment=wdAlignParagraphCenter
EndWith
EndSub
不使用Selection对象也可以完成相同的任务。
下面的宏在活动文档的开头使用Range对象来完成相同的任务。
SubMyMacro()
WithActiveDocument.Range(Start:
=0,End:
=0)
.InsertAfter"Title"
'.ParagraphAlignment.Alignment=wdAlignParagraphCenter
'上面那句是原帮助中的,但肯定是笔误!
微软没看出?
!
.ParagraphFormat.Alignment=wdAlignParagraphCenter
EndWith
EndSub
删除不必要的属性
如果录制了一个关于在对话框中选择选项的宏,即使只更改一个或两个选项,宏录制器也会记录该对话框中的所有选项的设置。
如果不希望更改所有的选项,可从录制的宏中删除不必要的属性。
下面录制的宏包含“段落”对话框的一些选项(单击“格式”菜单可显示该对话框的所有信息)。
SubMacro1()
WithSelection.ParagraphFormat
.LeftIndent=InchesToPoints(0)'左缩进0英寸
.RightIndent=InchesToPoints(0)'右缩进0英寸
.SpaceBefore=6'段前距6磅
.SpaceAfter=6'段后距6磅,下面不写了!
.LineSpacingRule=0
.Alignment=wdAlignParagraphLeft