Word VBA 学习交流资料
目录
一、对象模型
打开Word VBA帮助,首先看到的是“Word的对象模型”(如下所示)
图表 1
知识点:知道Application对象(Word应该程序的总对象)、Doctuments对象(文档集对象)、Paragraphs对象(段落集)、Selection(选中区域)对象、Tables(表格)对象、Sections(节,即Word的第一节)对象、Headers(页眉)对象。
Word 文档
.
二、新增功能
(略)
原因:我们的初衷大多是从“零”开始,最基础的我们都不知道,何来“新增”啊?
但是,以后学到相关的知识时,会跳到这里,学一些新增的“对象”、“方法”、“事件”、“属性”等。
三、编程概念
对象是 Visual Basic 的结构基础,在 Visual Basic 中进行的所有操作几乎都与修改对象有关。Microsoft Word 的任何元素,如文档、表格、段落、书签、域等,都可用 Visual Basic 中的对象来表示。
什么是对象和集合?
对象代表一个 Word 元素,如文档、段落、书签或单独的字符。集合也是一个对象,该对象包含多个其他对象,通常这些对象属于相同的类型;例如,一个集合对象中可包含文档中的所有书签对象。通过使用属性和方法,可以修改单独的的对象,也可修改整个的对象集合。
例如:
ActiveDocument.Paragraphs(2).Range.Characters(1).Font.Color = wdColorRed
在Word 的VBA中,大多数对象都是通过Application来访问,但有几个可以直接访问:如activedocumnet、documents等,当然通过application对象也行,但无疑后者更简略。
什么是属性?
属性是对象的一种特性或该对象行为的一个方面。例如,文档属性包含其名称、内容、保存状态以及是否启用修订。若要更改一个对象的特征,可以修改其
Word 文档
.
属性值。
若要设置属性的值,可在对象的后面紧接一个句号、属性名称、一个等号及新的属性值。下列示例在名为“MyDoc.doc”的文档中启用修订。
Sub TrackChanges()
Documents(\"Sales.doc\").TrackRevisions = True End Sub3
在本例中,Documents 引用由打开的文档(注意是对打开后文档的操作)构成的集合,而“MyDoc.doc”标识集合中单独的文档。并设置该文档的 TrackRevisions 属性。
不能设置某些属性。属性的“帮助”主题中会标明可以设置该属性(可读写),或只能读取该属性(只读)。
通过返回对象的一个属性值,可以获取有关该对象的信息。下列示例返回活动文档的名称。
Sub GetDocumentName() Dim strDocName As String
strDocName = ActiveDocument.Name MsgBox strDocName End Sub
(这个例子输出的没有路径,只有名字.若带路径的话,把strDocName = ActiveDocument.Name
改为:strDocName = ActiveDocument.Path &
ActiveDocument.Name)
在本例中,ActiveDocument 引用 Word 活动窗口中的文档。该文档的名称赋给了 strDocName 变量。
说明:每个属性的“帮助”主题表明可以设置该属性(可读写),只能读取该
Word 文档
.
属性(只读),或只能写入该属性(只写)。此外“Visual Basic 编辑器”中的“对象浏览器”在浏览窗口的底部显示所选属性的读写状态。
什么是方法?
方法是对象可以执行的动作。例如,只要文档可以打印,Document 对象就具有 PrintOut 方法。方法通常带有参数,以限定执行动作的方式。下列示例打印活动文档的前三页。
Sub PrintThreePages()
ActiveDocument.PrintOut Range:=wdPrintRangeOfPages, Pages:=\"1-3\" End Sub
在大多数情况下,方法是动作,而属性是性质。使用方法将导致发生对象的某些事件(所以,有人说:“方法是集成了的事件”),而使用属性则会返回对象的信息,或引起对象的某个性质的改变。
返回一个对象
可通过返回集合中单独的对象的方式来返回大多数对象。例如 Documents 集合包含打开的 Word 文档。可使用(位于 Word 对象结构顶层的)Application 对象的 Documents 属性返回 Documents 集合。
在访问集合之后,可以通过在括号中使用索引序号(与处理数组的方式相似)返回单独的对象。索引序号通常是一个数值或名称。详细内容,请参阅返回集合中的对象。
下列示例使用 Documents 属性访问 Documents 集合。索引序号用于返回 Documents 集合中的第一篇文档。然后将 Close 方法应用于 Document 对象,关闭 Documents 集合中的第一篇文档。
Sub CloseDocument() Documents(1).Close End Sub
Word 文档
.
'这个可能以后大多不用,原因就是索引序号在变,当打开、关闭一个文档时,对应的序号就增加或减少了数字,所以不好把握,大多不用。
下列示例使用名称(指定为一个字符串)来识别 Documents 集合中的 Document 对象。
Sub CloseSalesDoc()
Documents(\"Sales.doc\").Close End Sub
'这个常用,让某个指定的文档关闭。
集合对象通常具有可用于修改整个对象集合的方法和属性。Documents 对象具有 Save 方法,可用于保存集合中的所有文档。下列示例通过使用 Save 方法保存所有打开的文档。
Sub SaveAllOpenDocuments() Documents.Save End Sub
'所有的文档保存,相当于按住Shift再点击文件下的全部保存命令。
Document 对象也可使用 Save 方法保存单独的文档。下列示例保存名为 Sales.doc 的文档。
Sub SaveSalesDoc()
Documents(\"Sales.doc\").Save End Sub
'对指定的文档保存。
Word 文档
.
若要返回一个处于 Word 对象结构底层的对象,就必须使用可返回对象的属性和方法,“深入”到该对象。
若要查看该过程的执行,请打开“Visual Basic 编辑器”,在“视图”菜单上单击“对象浏览器”。单击左侧“类”列表中的 Application。然后单击右侧“成员”列表中的 ActiveDocument。“对象浏览器”底部会显示文字,表明 ActiveDocument 是只读的,该属性返回 Document 对象。然后单击“对象浏览器”底部的 Document,则会在“类”列表中自动选定 Document 对象,并将在“成员”列表中显示 Document 对象的成员。滚动成员列表,找到 Close,单击 Close 方法。“对象浏览器”窗口底部会显示文字,说明该方法的语法。有关该方法的详细内容,请按 F1 (作者注:不把F1磨平,VBA很难真正掌握^-^)或单击“帮助”按钮,以跳转到 Close 方法的“帮助”主题。
根据这些信息可编写下列指令,以关闭活动文档。
Sub CloseDocSaveChanges()
ActiveDocument.Close SaveChanges:=wdSaveChanges End Sub
'关闭并保存改变。这里显然,保存为方法,后面有参数
下列示例将活动文档窗口最大化。 Sub MaximizeDocumentWindow()
ActiveDocument.ActiveWindow.WindowState wdWindowStateMaximize
End Sub
'这个是赋最大化值属性给活动窗口
=
Word 文档
.
ActiveWindow 属性返回一个 Window 对象,该对象代表活动窗口。将 WindowState 属性设为最大常量(wdWindowStateMaximize)。
下列示例新建一篇文档,并显示“另存为”对话框,这样即可为文档提供一个名称。
Sub CreateSaveNewDocument() Documents.Add.Save End Sub
'这个有意思,添加新文档并保存,一步,利害吧 '如果不是看帮助,你敢这么用吗?方法.方法
Documents 属性返回 Documents 集合。Add 方法新建一篇文档,并返回一个 Document 对象。然后对 Document 对象应用 Save 方法。
如上所示,可以使用方法或属性来访问下层对象。也就是说,在对象结构中,将方法或属性应用于某个对象的上一级对象,可返回该下级对象。返回所需对象之后,就可以应用该对象的方法并控制其属性。要查看对象结构分层的情况,请参阅 Microsoft Word 对象。
获得有关对象、方法和属性的“帮助”信息
在熟悉 Word 对象模型之前,可以利用一些工具来深入了解对象结构。 自动成员列表。(重要)在“Visual Basic 编辑器”中,在对象后面键入句号 (.) 后,即显示可用的属性和方法的列表。例如,如果键入“Application.”,就会显示 Application 对象的方法和属性的下拉列表。
帮助。也可以使用“帮助”找到可应用于对象的属性和方法。“帮助”中的每个对象主题都包含一个“参阅”跳转,以显示该对象的属性和方法列表。在“对象浏览器”或某一模块中按 F1,可跳转到相应的“帮助”主题。
Word 文档
.
Microsoft Word 对象。该主题阐明在分级结构中 Word 对象的排列方式。在结构图中单击一个对象,可显示相应的“帮助”主题。
对象浏览器。“Visual Basic 编辑器”中的“对象浏览器”显示 Word 对象的成员(属性和方法)。
----------------------------------------- 实例:打开Word后,按Alt+F11,出现VBE窗口,
双击右边的Thisdocument(当然,放到底下的模块中任一个也行),输入如下内容:
Sub autoexec()
Application.Caption = \"我爱我家!\" End Sub
这时,关闭Word,再打开Word。 你的标题就有“×××.doc—我爱我家!”了!
图表 2
当然,也可以进一步做成这样: Sub autoexec() Dim a
Word 文档
.
a = MsgBox(\"我家我家\这是一个试验\") If a <> 6 Then Application.Quit End If End Sub
'功能就是打开Word时,显示此对话框,如果点了“是”就不作处理即打开Word,否则,退出Quit。
也可以写成这样: Sub autoexec() Dim a
a = InputBox(\"你的姓名\防君子,不防小人!\") If a <> \"小小\" Then Application.Quit End If End Sub
'功能就是打开Word时,显示此对话框,如果输入的不是小小,就打不开。 MsgBox 函数参考:
在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。
语法
MsgBox(prompt[, buttons] [, title] [, helpfile, context]) MsgBox 函数的语法具有以下几个命名参数: 部分 描述
Prompt 必需的。字符串表达式,作为显示在对话框中的消息。prompt 的
Word 文档
.
最大长度大约为 1024 个字符,由所用字符的宽度决定。如果 prompt 的内容超过一行,则可以在每一行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或是回车与换行符的组合 (Chr(13) & Chr(10)) 将各行分隔开来。
Buttons 可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。
Title 可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。
Helpfile 可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile,则也必须提供 context。
Context 可选的。数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了 context,则也必须提供 helpfile。
设置值
buttons 参数有下列设置值: 常数 vbOKOnly
值 0
描述
只显示 OK 按钮。 显示 OK 及 Cancel 按钮。
2 显示 Abort、Retry 及 Ignore 按钮。 3 显示 Yes、No 及 Cancel 按钮。 显示 Yes 及 No 按钮。 5 显示 Retry 及 Cancel 按钮。 显示 Critical Message 图标。 显示 Warning Query 图标。 48
显示 Warning Message 图标。
VbOKCancel 1 VbAbortRetryIgnore VbYesNoCancel VbYesNo
4
VbRetryCancel VbCritical
16
VbQuestion 32 VbExclamation VbInformation 64
显示 Information Message 图标。
Word 文档
.
vbDefaultButton vbDefaultButton vbDefaultButton vbDefaultButton
1 0 第一个按钮是缺省值。
2 256 第二个按钮是缺省值。 3 512 第三个按钮是缺省值。 4 768 第四个按钮是缺省值。
vbApplicationModal 0 应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作。
vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。
vbMsgBoxHelpButton 16384 将Help按钮添加到消息框 VbMsgBoxSetForeground 65536 指定消息框窗口作为前景窗口 vbMsgBoxRight 524288 文本为右对齐
vbMsgBoxRtlReading 1048576 指定文本应为在希伯来和阿拉伯语系统中的从右到左显示
第一组值 (0–5) 描述了对话框中显示的按钮的类型与数目;第二组值 (16, 32, 48, 64) 描述了图标的样式;第三组值 (0, 256, 512) 说明哪一个按钮是缺省值;而第四组值 (0, 4096) 则决定消息框的强制返回性。将这些数字相加以生成 buttons 参数值的时候,只能由每组值取用一个数字。
注意 这些常数都是 Visual Basic for Applications (VBA) 指定的。结果,可以在程序代码中到处使用这些常数名称,而不必使用实际数值。
返回值 常数 值 描述 vbOK
1
OK Cancel Abort Retry
vbCancel 2 vbAbort vbRetry
3 4
Word 文档
.
vbIgnore 5 vbYes vbNo 说明
6 7
Ignore Yes No
如果对话框显示 Cancel 按钮,则按下 ESC 键与单击 Cancel 按钮的效果相同。如果对话框中有 Help 按钮,则对话框中提供有上下文相关的帮助。但是,直到其它按钮中有一个被单击之前,都不会返回任何值。
注意 如果还要指定第一个命名参数以外的参数,则必须在表达式中使用 MsgBox。为了省略某些位置参数,必须加入相应的逗号分界符。
一、通过录制宏生成代码
如果无法确定要使用的 Visual Basic 方法或属性,可打开宏录制器并进行手动操作。宏录制器会将操作译成 Visual Basic 代码。录制操作完成后,可根据需要修改代码。例如,如果无法确定实现段落缩进的属性或方法,可执行下列操作:
1. 在“工具”菜单上,指向“宏”,然后单击“录制新宏”。 2. 如果需要,可更改默认的宏名称,然后单击“确定”启动录制器。 3. 在“格式”菜单上,选定“段落”。 4. 更改段落左缩进的值,然后单击“确定”。 5. 单击“停止录制”工具栏上的“停止录制”按钮。 6. 在“工具”菜单上,指向“宏”,然后单击“宏”。 7. 从步骤 2 中选择宏的名称,然后单击“编辑”按钮。
查看 Visual Basic 代码来确定对应于段落左缩进的属性(LeftIndent 属性)。将插入点置于 LeftIndent 之中,并按 F1 或单击“帮助”按钮。在帮助主题中,可以查看示例以及支持 LeftIndent 属性的对象(单击“应用于”)。
(从上面可以看出,录制宏是我们认识未知对象的很好方法之一) 说明
Word 文档
.
录制的宏使用 Selection 属性返回 Selection 对象。例如,下列指令将所选段落缩进 0.5 英寸。
Sub IndentParagraph()
Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5) End Sub
您也可以修改录制的宏并与 Range 对象一起使用。
(我们在日常的使用中经常注意到:在使用“本机上的模板”时的向导就大量使用了Selection对象,而不是Range对象!难道说微软有更新层次的考虑?我想可能是Selection对象更稳定,跨版本能力更强吧!)
二、修改录制的 Visual Basic 宏
宏录制器是查找所需的 Visual Basic 方法和属性的非常方便的工具。如果不知道使用何种属性或方法,可打开宏录制器,手动执行操作。宏录制器会将操作译为 Visual Basic 代码。但录制宏具有一些限制条件。您不能录制下列内容:
条件分支 变量指定 循环结构 自定义用户窗体 出错处理
用鼠标选定的文字(必须使用组合键)
若要增强宏的功能,可能需要修改录制到模块中的代码。 删除 Selection 属性
使用宏录制器创建的宏取决于所选内容。在大多数录制的宏指令的开头,可以看到“Selection”。录制的宏使用 Selection 属性返回 Selection 对象。
例如,下列示例将所选内容移动至 Temp 书签,并在书签之后插入文字。 Sub Macro1()
Word 文档
.
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()
Word 文档
.
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 '上面那句是原帮助中的,但肯定是笔误!微软没看出?! .ParagraphFormat.Alignment = wdAlignParagraphCenter End With End Sub
不使用 Selection 对象也可以完成相同的任务。下面的宏在活动文档的开头使用 Range 对象来完成相同的任务。
Sub MyMacro()
With ActiveDocument.Range(Start:=0, End:=0) .InsertAfter \"Title\"
'.ParagraphAlignment.Alignment = wdAlignParagraphCenter '上面那句是原帮助中的,但肯定是笔误!微软没看出?! .ParagraphFormat.Alignment = wdAlignParagraphCenter End With End Sub
删除不必要的属性
Word 文档
.
如果录制了一个关于在对话框中选择选项的宏,即使只更改一个或两个选项,宏录制器也会记录该对话框中的所有选项的设置。如果不希望更改所有的选项,可从录制的宏中删除不必要的属性。下面录制的宏包含“段落”对话框的一些选项(单击“格式”菜单可显示该对话框的所有信息)。
Sub Macro1()
With Selection.ParagraphFormat
.LeftIndent = InchesToPoints(0) '左缩进0英寸 .RightIndent = InchesToPoints(0) '右缩进0英寸 .SpaceBefore = 6 '段前距6磅
.SpaceAfter = 6 '段后距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
Word 文档
.
.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:=\"\ WritePasswordDocument:=\"\
WritePasswordTemplate:=\"\End Sub
可以从录制的宏中删除不需要的参数。例如,可以删除所有设置为空字符串的参数(如 WritePasswordDocument:=\"\"),如下所示。
Sub MyMacro()
Documents.Open FileName:=\"C:\\My Documents\\Test.doc\ ConfirmConversions:= False, _
ReadOnly:=False, AddToRecentFiles:=False, _
Word 文档
.
Revert:=False, Format:=wdOpenFormatAuto End Sub
三、自动运行的宏
通过为一个宏赋予某个特殊的名称,就可在执行某项操作(例如启动 Word 或打开文档)时自动运行宏。Word 将下列名称识别为自动宏,或称“auto”宏。
宏名 AutoExec AutoNew AutoOpen AutoClose AutoExit
运行条件
启动 Word 或加载全局模板时 每次新建文档时 每次打开已有文档时 每次关闭文档时
退出 Word 或卸载全局模板时
当以下条件之一为真时,将识别代码模块中的自动宏。
•
模块在自动宏(如 AutoExec)之后命名,并且包含一个名为“Main”的
过程。
•
任何模块中的过程在自动宏之后命名。
与其他宏一样,自动宏也可以保存于 Normal 模板、其他模板或文档中。要让自动宏运行,它必须位于活动文档的 Normal 模板中,或活动文档选用的模板中。
唯一例外的是 AutoExec 宏,它只有存储于以下位置时才可自动运行:Normal 模板、通过“模板和加载项”对话框全局加载的模板、或由“Startup”文件夹指定的文件夹中的全局模板。
在命名冲突的情况下(多个自动宏名相同),Word 将运行上下文中最近的自动宏。例如,如果同时在文档及其附加的模板中创建了 AutoClose 宏,则仅执行文档中的自动宏。如果在 Normal 模板中创建了 AutoNew 宏,只有当文档或其附加模板中没有名为 AutoNew 的宏时,该自动宏才能运行。(笔者注:简称\"就近原则\"!)
Word 文档
.
注释 按住 Shift 可以终止自动宏的运行。例如,基于包含 AutoNew 宏的模板新建文档时,按住 Shift 可终止 AutoNew 宏的运行。方法是:按住 Shift,单击(“文件”菜单)“新建”对话框中的“确定”按钮,并在显示新文档前持续按住 Shift。如果运行一个宏时有可能触发自动宏,(这种情况,我没遇过!)可用下列指令终止自动宏的运行:
WordBasic.DisableAutoMacros
四、修改 Word 命令
大多数 Word 命令都可通过转换为宏的方式对其进行修改。例如,可修改“文件”菜单上的“打开”命令,使其不再显示 Word 文档文件列表(扩展名为 .doc 的文件),而显示当前文件夹中的所有文件。
若要在“宏”对话框中显示内置 Word 命令列表,可在“宏的位置”框中选定“Word 命令”。显示的命令列表中包含所有的菜单命令、工具栏命令或快捷键命令。菜单命令名称以相关的菜单名称开头。例如,“文件”菜单中的“保存”命令显示为“FileSave”。
方法是工具/宏/宏
Word 文档
.
通过将一个宏命名为与 Word 命令相同的名称,就可用宏替代 Word 命令。例如,如果创建一个名为“FileSave”的宏,当选择“文件”菜单上的“保存”命令、单击“保存”工具栏按钮,或按“保存文件”快捷键时,Word 将运行该宏。
本示例介绍了修改 FileSave 命令的步骤。
1. 在“工具”菜单上,指向“宏”,然后单击“宏”。 2. 在“宏的位置”框中,选择“Word 命令”。 3. 在“宏名”框中,选择“FileSave”。
4. 在“宏的位置”框中选择一个模板或文档以保存该宏。例如,选择 Normal.dot(全局模板)可生成一个共用宏(即修改所有文档的“FileSave”命令)。
5. 单击“创建”按钮。 FileSave 宏显示如下: Sub FileSave() '
' FileSave Macro
Word 文档
.
' Saves the active document or template '
ActiveDocument.Save End Sub
可添加指令或删除现有的 ActiveDocument.Save 指令。之后在运行“FileSave”命令时,新的 FileSave 宏将取代 word 命令。若要恢复“FileSave”原有的功能,需重新命名新的 FileSave 宏或将之删除。
说明: 也可以创建与 Word 命令同名的代码模块(例如 FileSave)并包含名为 Main 的子程序,以此替换 Word 命令。
五、将文本插入文档
使用 InsertAfter 或 InsertBefore 方法在 Selection 或 Range 对象之前或之后插入文字。下列示例在活动文档的末尾插入文字。
Sub InsertTextAtEndOfDocument()
ActiveDocument.Content.InsertAfter Text:=\" The end.\" End Sub
下列示例在所选内容之前插入文字。 Sub AddTextBeforeSelection()
Selection.InsertBefore Text:=\"new text \" End Sub
Range 对象或 Selection 对象在使用了 InsertBefore 或 InsertAfter 方法之后,会扩展并包含新的文本。使用 Collapse 方法可以将 Selection 或 Range 折叠到开始或结束位置。
Word 文档
.
六、选定文档中的文本
可使用 Select 方法选定文档中的对象。Select 方法可用于多种对象,例如 Bookmark、Field、Range 和 Table 对象。下列示例选定活动文档中的第一个表格。
Sub SelectTable()
ActiveDocument.Tables(1).Select End Sub
下列示例选定活动文档中的第一个域。 Sub SelectField()
ActiveDocument.Fields(1).Select End Sub
下列示例选定活动文档中的前四个段落。Range 方法用于创建一个引用前四个段落的 Range 对象,然后将 Select 方法应用于 Range 对象。
Sub SelectRange()
Dim rngParagraphs As Range
Set rngParagraphs = ActiveDocument.Range( _
Start:=ActiveDocument.Paragraphs(1).Range.Start, _ End:=ActiveDocument.Paragraphs(4).Range.End) rngParagraphs.Select End Sub
'选定文档中的文本:我觉得用处不大,原因就是为什么要选中呢?能操作就直接操作,不能的话,就选中吧(他可以说是没办法的办法).
七、编辑文字
本主题包含与下列任务相关的 Visual Basic 示例:
•
确定文本是否被选定
Word 文档
.
• • • •
折叠选定内容或区域 扩展选定内容或区域 重新定义 Range 对象 更改文本
有关其他编辑任务的信息和示例,请参阅下列主题: 从文档返回文本 选定文档中的文本 将文本插入文档 修改文档的某一部分 确定文本是否被选定
Selection 对象的 Type 属性返回所选内容类型的信息。
'如果所选内容为插入点,则下列示例显示一条消息\"Nothing is Selected\"。没选中任何问题
Sub IsTextSelected()
If Selection.Type = wdSelectionIP Then MsgBox \"Nothing is selected\" End Sub
折叠所选内容或区域
使用 Collapse 方法可将 Selection 或 Range 对象折叠到开始或结束点的位置。下列示例在所选内容的开头将所选内容折叠为一个插入点。
Sub CollapseToBeginning()
Selection.Collapse Direction:=wdCollapseStart 'Selection.Collapse Direction:=wdCollapseEnd End Sub
'这个是标准的折叠的程序,以后可能会用到的噢!
Word 文档
.
下列示例将区域折叠至其结束点(在第一个单词之后),并添加新文本。 Sub CollapseToEnd() Dim rngWords As Range
Set rngWords = ActiveDocument.Words(1) '设置第一个单词为区域rngWords
With rngWords
.Collapse Direction:=wdCollapseEnd '折叠到最后,区域与可以折叠的噢!
.Text = \"(This is a test.) \" '在折叠的最后加入这些文字 End With End Sub
扩展所选内容或区域
下列示例使用 MoveEnd 方法扩展所选内容的结尾以包含三个附加的单词(总共是4个!)。MoveLeft、MoveRight、MoveUp 和 MoveDown 方法也可以用于扩展 Selection 对象。
Sub ExtendSelection()
Selection.MoveEnd Unit:=wdWord, Count:=3 End Sub
下列示例使用 MoveEnd 方法扩展区域,以包含活动文档中的前三个段落。 Sub ExtendRange()
Dim rngParagraphs As Range
Set rngParagraphs = ActiveDocument.Paragraphs(1).Range rngParagraphs.MoveEnd Unit:=wdParagraph, Count:=2 End Sub
Word 文档
.
重新定义 Range 对象
使用 SetRange 方法可重新定义现有的 Range 对象。 更改文字
通过更改某一区域中的内容可更改现有的文字。下列指令通过将 Text 属性设为“The”来更改活动文档中的第一个单词。
Sub ChangeText()
ActiveDocument.Words(1).Text = \"The \" End Sub
也可以使用 Delete 方法删除现有文本,然后使用 InsertAfter 或
InsertBefore 方法插入新文本。下列示例删除活动文档的第一段,并插入新文本。
Sub DeleteText()
Dim rngFirstParagraph As Range
Set rngFirstParagraph = ActiveDocument.Paragraphs(1).Range With rngFirstParagraph .Delete
.InsertAfter Text:=\"New text\" .InsertParagraphAfter End With End Sub
'上面的这个例子我们通常不用,我们更喜欢用下面 Sub DeleteText1()
Dim rngFirstParagraph As Range
Set rngFirstParagraph = ActiveDocument.Paragraphs(1).Range rngFirstParagraph.Text = \"New text\" & Chr(13) End Sub
Word 文档
.
八、将格式应用于文本
本主题包含与下列任务相关的 Visual Basic 示例:
• • • • • •
将格式应用于选定内容 将格式应用于某一区域
插入文本并应用字符和段落格式 在 12 磅和无之间切换段前间距 切换加粗格式
将左边距增加 0.5 英寸
将格式应用于选定内容
下列示例使用 Selection 属性将字符和段落格式应用于选定文本。使用 Font 属性获得字体格式的属性和方法,使用 ParagraphFormat 属性获得段落格式的属性和方法。
Sub FormatSelection() With Selection.Font
.Name = \"Times New Roman\" .Size = 14
.AllCaps = True '全部大写 End With
With Selection.ParagraphFormat
.LeftIndent = InchesToPoints(0.5) '左缩进0.5英寸 .Space1 '这是单倍行距的缩写 End With End Sub
Word 文档
.
将格式应用于某一区域
下列示例定义了一个 Range 对象,它引用了活动文档的前三个段落。通过应用 Font 和 ParagraphFormat 对象的属性来设置 Range 对象的格式。
Sub FormatRange()
Dim rngFormat As Range
Set rngFormat = ActiveDocument.Range( _
Start:=ActiveDocument.Paragraphs(1).Range.Start, _ End:=ActiveDocument.Paragraphs(3).Range.End) With rngFormat
.Font.Name = \"Arial\"
.ParagraphFormat.Alignment = wdAlignParagraphJustify '两端对齐
End With End Sub
插入文字并应用字符和段落格式
下列示例在当前文档的上部添加单词 Title。第一段居中对齐,并在该段落之后添加半英寸的间距。将单词 Title 的格式设为 24 磅 Arial 字体。
Sub InsertFormatText() Dim rngFormat As Range
Set rngFormat = ActiveDocument.Range(Start:=0, End:=0) With rngFormat
.InsertAfter Text:=\"Title\"
.InsertParagraphAfter '插入段落标记 With .Font
.Name = \"Tahoma\"
Word 文档
.
.Size = 24 .Bold = True End With End With
With ActiveDocument.Paragraphs(1) .Alignment = wdAlignParagraphCenter .SpaceAfter = InchesToPoints(0.5) End With End Sub
在 12 磅和无之间切换段前间距
下列示例切换选定内容中第一段的段前间距。宏将获取当前段前间距的值,如果该值为 12 磅,则删除段前间距格式(将 SpaceBefore 属性设为零)。如果段前间距的值为除 12 外的其他数值,则将 SpaceBefore 属性设为 12 磅。
Sub ToggleParagraphSpace() With Selection.Paragraphs(1) If .SpaceBefore <> 0 Then .SpaceBefore = 0 Else
.SpaceBefore = 6 End If End With End Sub 切换加粗格式
下列示例切换选定文本的加粗格式。 Sub ToggleBold()
Word 文档
.
Selection.Font.Bold = wdToggle End Sub
将左边距增加 0.5 英寸
下列示例将左边距和右边距增加 0.5 英寸。PageSetup 对象包含文档的所有的页面设置属性(左边距、下边距、纸张大小等)。LeftMargin 属性用于返回和设置左边距设置。RightMargin 属性用于返回和设置右边距设置。
Sub FormatMargins()
With ActiveDocument.PageSetup
.LeftMargin = .LeftMargin + InchesToPoints(0.5) .RightMargin = .RightMargin + InchesToPoints(0.5) End With End Sub
九、查找并替换文字或格式
通过 Find 和 Replacement 对象可实现查找和替换功能。Selection 和 Range 对象可以使用 Find 对象。从 Selection 或 Range 对象访问 Find 对象时,查找操作会略有不同。
查找并选定文字
如果从 Selection 对象访问 Find 对象,当找到搜索条件时,就会更改所选内容。下列示例选定下一个出现的“Hello”。如果到达文档结尾时仍未找到“Hello”,则停止搜索。
With Selection.Find .Forward = True .Wrap = wdFindStop .Text = \"Hello\" .Execute
Word 文档
.
End With
Find 对象包含与“查找和替换”对话框中的选项相关的属性(在“编辑”菜单上选择“查找”可显示该对话框)。可以设置 Find 对象单独的属性或使用 Execute 方法的参数,如下例所示。
Selection.Find.Execute FindText:=\"Hello\ Forward:=True, Wrap:=wdFindStop 查找文字,但不更改所选内容
如果从 Range 对象访问 Find 对象,则找到搜索条件时,不更改所选内容,但是会重新定义 Range 对象。下列示例在活动文档中查找第一个出现的“blue”。如果找到该单词,则重新定义该区域,并将加粗格式应用于单词“blue”。
With ActiveDocument.Content.Find .Text = \"blue\" .Forward = True .Execute
If .Found = True Then .Parent.Bold = True End With
下列示例使用 Execute 方法的参数,执行结果与上例相同。 Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:=\"blue\If myRange.Find.Found = True Then myRange.Bold = True 使用 Replacement 对象
Replacement 对象代表查找和替换操作的替换条件。Replacement 对象的属性和方法对应于“查找和替换”对话框中的选项(单击“编辑”菜单中的“查找”或“替换”命令可显示该对话框)。
Word 文档
.
可通过 Find 对象使用 Replacement 对象。下列示例将所有单词“hi”替换为“hello”。由于 Find 对象是通过 Selection 对象访问的,所以当找到搜索条件时,会更改所选内容。
With Selection.Find .ClearFormatting .Text = \"hi\"
.Replacement.ClearFormatting .Replacement.Text = \"hello\"
.Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue End With
下列示例取消活动文档中的加粗格式。Find 对象的 Bold 属性为 True,而 Replacement 对象的该属性为 False。若要查找并替换格式,可将查找和替换文字设为空字符串 (\"\"),并将 Execute 方法的 Format 参数设为 True。由于从 Range 对象访问 Find 对象,所选内容将保持不变(Content 属性返回一个 Range 对象)。
With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False End With
.Execute FindText:=\"\ Format:=True, Replace:=wdReplaceAll
Word 文档
.
End With
‘上面的查找与替换是重点!他能解决很多的替换问题。 举例:原地址是:
http://club.excelhome.net/dispbbs.asp?boardID=23&ID=153805&page=1
摘题目:怎样用宏统计word文件中某一个汉字,例如“的”字出现的数量? (可以这样:新建一个文档,输入“=rand(50,50)”,再按回车(不包括双引号“”),则产生了虚拟文本,在此虚拟文本中试验)
方法有三:
Sub getfoundcount1() Dim a As Range, i% Dim c, d
c = Timer '设C为运行前的时间
For Each a In ActiveDocument.Characters '在字符间循环 If a Like \"的\" Then '如果是“的”
i = i + 1 '则加上,i的初始值是0,不用设的,默认 End If Next
d = Timer – c '用现在的时间减去运行前的时间等于用时
MsgBox \"Word 找到\" & i & \"个与此条件相匹配的项!\End Sub
'上面此法利用循环比较字符是否是的是“的”字,来判断!用时下面的图形的标题栏
Word 文档
.
图表 3
Sub GetFoundCount2()
Dim FoundCount As Integer, myFindText As String Dim a, b a = Timer myFindText = \"的\"
With ActiveDocument.Content.Find .Text = myFindText '要查找的字符 .MatchWildcards = False '通配符为不勾选
.Wrap = wdFindStop '当查找到后停止,就是每次缩小范围 Do While .Execute '当查找时则累加 FoundCount = FoundCount + 1 Loop End With b = Timer - a Debug.Print b
Debug.Print FoundCount
MsgBox \"Word 找到\" & FoundCount & \"个与此条件相匹配的项!\vbInformation, b
End Sub
'上面是标准的用查找来判断累加,(也是老大的代码)
Word 文档
.
图表 4
Sub getfoundcount3() Dim a, b, c, d, e, f d = Timer
a = ActiveDocument.Range.Text f = VBA.Asc(\"的\") '取得“的”的Ascii码 b = Split(a, Chr(f)) '用此Ascii码来分裂 c = UBound(b) '取得上限 e = Timer – d '取得时间
Debug.Print e '这个是输出到调试区的 Debug.Print c '这个也是
MsgBox \"Word 找到\" & c & \"个与此条件相匹配的项!\e
End Sub
'上面是利用数组,把“的”看成是用于split数组的字符,通过是判断数组的上限来判断是几位数组,即是几个“的”。
图表 5
Word 文档
.
Sub GetFoundCount4()
Dim strText As String, myText As String Dim lngOld As Long, lngNew As Long Dim Times As Single Times = VBA.Timer
strText = ActiveDocument.Content.Text myText = \"的\"
lngOld = Len(strText) '包括“的”的长度
lngNew = Len(Replace(strText, myText, \"\")) '替换“的”后的长度 MsgBox \"Word 找到\" & lngOld - lngNew & \"个与此条件相匹配的项!\vbInformation, VBA.Timer - Times
End Sub
图表 6
两种方法运行最高。
一个是0.1秒与一个是6秒,效率是可想而知!大家试试!
十、从文档返回文本
使用 Text 属性可以返回 Range 或 Selection 对象中的文本。下列示例选定下一个格式设为“标题 1”样式的段落。然后通过 MsgBox 函数显示 Text 属性的内容。
(上面是老大又写了一个,老大随后的代码的运行速度更是十分惊人)
Word 文档
.
Sub FindHeadingStyle() With Selection.Find .ClearFormatting .Style = wdStyleHeading1
.Execute FindText:=\"\ Forward:=True, Wrap:=wdFindStop If .Found = True Then MsgBox Selection.Text End With End Sub
下列指令返回并显示选定的文本。 Sub ShowSelection() Dim strText As String strText = Selection.Text MsgBox strText End Sub
下列示例返回活动文档中的第一个单词。Words 集合中的每一项是代表一个单词的 Range 对象。
Sub ShowFirstWord()
Dim strFirstWord As String
strFirstWord = ActiveDocument.Words(1).Text MsgBox strFirstWord End Sub
下列示例返回与活动文档中第一个书签相关联的文本。 Sub ShowFirstBookmark() Dim strBookmark As String
Word 文档
.
If ActiveDocument.Bookmarks.Count > 0 Then
strBookmark = ActiveDocument.Bookmarks(1).Range.Text MsgBox strBookmark End If End Sub
InputBox 函数
在一对话框来中显示提示,等待用户输入正文或按下按钮,并返回包含文本框内容的 String。
语法
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) InputBox 函数的语法具有以下几个命名参数: 部分
描述
必需的。作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符,由所用字符的宽度决定。如果 prompt 包含多个行,则可在各行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或回车换行符的组合 (Chr(13) & Chr(10)) 来分隔。
Prompt
Title 可选的。显示对话框标题栏中的字符串表达式。如果省略 title,则把应用程序名放入标题栏中。
Default
Xpos
可选的。显示文本框中的字符串表达式,在没有其它输入时作为缺省值。如果省略 default,则文本框为空。
可选的。数值表达式,成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略 xpos,则对话框会在水平方向居中。
Word 文档
.
Ypos
可选的。数值表达式,成对出现,指定对话框的上边与屏幕上边的距离。如果省略 ypos,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。
Helpfile
Context
可选的。字符串表达式,识别帮助文件,用该文件为对话框提供上下文相关的帮助。如果已提供 helpfile,则也必须提供 context。
可选的。数值表达式,由帮助文件的作者指定给某个帮助主题的帮助上下文编号。如果已提供 context,则也必须要提供 helpfile。
说明:如果同时提供了 helpfile 与 context,用户可以按 F1 (Windows) or HELP (Macintosh) 来查看与 context 相应的帮助主题。某些主应用程序,例如,Microsoft Excel,会在对话框中自动添加一个 Help 按钮。如果用户单击 OK 或按下ENTER ,则 InputBox 函数返回文本框中的内容。如果用户单击 Cancel,则此函数返回一个长度为零的字符串 (\"\")。
注意 如果还要指定第一个命名参数以外的参数,则必须在表达式中使用 InputBox。如果要省略某些位置参数,则必须加入相应的逗号分界符。
总结:交流之二已经非常重要了,他可能是所有的内容中(包括后面要介绍的)最重要的。
如果有些地方不太明白,没关系,我会时不时的出一些需要运用交流之二知识能解决的,交流之三也是比较重要的,他与交流之二是包含所有的要学习的“通用方法”了。其后的内容就是介绍一些常规的东东。
注意:交流之二的份量比较重,所以,交流之三会推迟一段时间推出! 这里有一个比喻:假如你进入一家公司!“交流之一”则是厂规、厂训等制度;“交流之二”就是教你如何做事、该怎么做事?“交流之三”则是教你认识一些同事
Word 文档
.
与一些主要的客户;以后就是今天讨论一点点东东,明天再讨论一点点东东了。再就是看各人的造化了。
欢迎大家交流了一下这一块的学习心得,也欢迎提出你的疑问,或你的想法,如果你还什么其他的要求也可以提出来,我们一起来进行探讨,共同提高。
免责声明:如果文档有代码或内容侵犯了你的权利,请告诉我,我马上删除,这是一个非盈利的学习,任何商业行为与本学习无关。你可以复制或传播“他”的全部或部分,但请把“免责声明”也加上,(最好把我们的名字与加上)谢谢了。
案例说明:有一些是本人自编的,但更多的则是来自网上网友(尤其是老大――守柔的),其中的案子,大多是随意编的,如有雷同,纯属巧合。如果你不同意你的代码出现在本学习资料中,请告诉我。谢谢各位网友,虽然你的大名不曾出现,但你的精神,我们会记住的。
关于微软:微软的帮助也有版权的,但我们是学习,应该不会有版权的事,有的话,马上删。
关于时间:主要利用周六、周日来完成学习,当然,平时要看,否则,刚看的东东又忘记了。
关于学时:用时一年,一至二周一次。(保证不低于20课)
关于教材:选择微软的自带帮助做为交流学习的主要资料是基于以下几点考虑的:
1. 因为它权威性最高,通用性最好;
2. 它一般不会有版权的事,因为我们是学习他,而不是来盈利;
3. 看懂它后,大多的微软同类都是相通的,可以说“学了一个”=“学了一类”; 4. 他有很好的结构,有内涵、也有外延;
Word 文档
.
5. 如果在学习过程中我们某些人坚持不下来,但其他人仍然完全可以继续学习,不会受到影响,这也是最重要的一点。
6. 还有一点就是如果长时间不用后,大多会忘记,但帮助始终在。用时,打开帮助,你会看到很多熟练的身影,很容易又找回当初的感觉。
将 Range 对象赋给变量
有多种方法将现有的 Range 对象赋给变量。本主题对两种不同的方法进行了阐述。在下列示例中,将 Range 对象赋给变量 Range1 和 Range2。
例如,下列指令(通俗的话就是:下列语句)将活动文档中的第一个和第二个单词赋给变量 Range1 和 Range2。
Set Range1 = ActiveDocument.Words(1) Set Range2 = ActiveDocument.Words(2) '注意:
1. Words对象是Range对象,它不存在Word对象,你可以这样命名:dim word1 as range,,但是dim word1 as word是不行的,也是错的。
2. Words直观的说就是单词,那么,什么是单词呢?中文中没有单词的概念啊!可以这样来理解,英文的单词是以空格分隔的,所以单词就是二个空格之间的字母加空格。(实验证明,确实是这样的)不过,这与我们的关系不大(因为我们大多处理的是中文)。那么中文的“Word”是怎么回事呢?是词组?还是每个汉字呢?其实我也不知道,我是这样来做的,在VBA中输入如下的程序:
Sub 中文Word() Dim range1 As Range
Set range1 = ActiveDocument.Words(1) range1.select MsgBox range1 End Sub
Word 文档
.
再新建一个Word,输入这样的的汉字“[ a 彼岸赋好 彼岸变量”(不包括红色的双引号),按F8分别测试Words(1)、Words(2)、Words(3)、Words(4)、Words(5)、Words(6)等,发现什么没有。我发现了如下的规律:①标点符号在中文中算是一个Word单位;②字母或者单词后面的空格不算一个Word单位,再英文如果没有结标记则包括后面的空格(例如:\"a the as.\",则第一个是a ,(注意后面有空格),当然最后的.不包括在前一个as内。所以,以上总共有4个Words,你可以用这个来测试。ActiveDocument.Words(1).Select,
ActiveDocument.Words.count);③除此以外,只有汉字与汉字之间的空格算一个Word单词;④有的Word是一个汉字,有的是二个汉字,可能有的还是三个汉字,这是为什么呢?我们打开微软的输入法,再用“彼岸”及“变量”的拼音输入,可以看到这是一个词组(如下图)
所以我
想,有的一个是汉字,有的二个是汉字,他“可能”是根据微软的输入法中的词组定义相一致的。⑤当然,你也可以看看Words集合来看一下这个对象。当然,可能没我说的简单、易懂。当然words对象的不确定性,决定了他使用的频率。如果你看懂我的上面所说,对于words对象基本就OK了。
'注意range对象的赋值就是这样set a=b ,变量的赋值就是a=1,但对象就必须这样赋值!(包括任意的对象,Set是对对象赋值的标准语句)
将一个 Range 对象变量设置为等于另一个 Range 对象变量
下列指令(语句)将名为 Range2 的区域变量设为与 Range1 代表的位置相同。
Set Range2 = Range1 '译为:设置Range2对象与 Range1 代表的位置相同
Word 文档
.
现在两个变量代表同一区域。修改 Range2 的起点、终点或其中的文本将影响 Range1,反之亦然。
请注意,以下指令等价于 Range2.Text = Range1.Text。该指令指定 Range2 的默认属性(Text 属性)为 Range1 的默认属性。但该指令并不修改其实际引用的对象。
Range2 = Range1
Range2 和 Range1 区域具有相同的内容,但它们可能对应文档中的不同位置,甚至对应不同的文档。
'上面这句有点难懂,用程序来说明吧(以后大多是这样,因为我们是学习VBA,只有通过程序来说明内容)
Sub 测试Range1等于Range2() Dim range1 As Range, range2 As Range
Set range1 = ActiveDocument.Range(0, 1) '文档的第一个区域(字) Set range2 = ActiveDocument.Range(1, 2) '文档的第二个区域(字) MsgBox range1 '输出第一个字 MsgBox range2 '输出第二个字
range2 = range1 '把第一个(字)的区域的字赋值给第二个区域 MsgBox range2 '输出第二个区域(字)
'为什么我把字后面加括号,因为我们设置的是区域,就是范围小了点的区域,
'就一个字的区域,所以,也是字,但区域更准确。 End Sub
Word 文档
.
当然,与第一例子类似,要新建一个文档,输入一定(只要二个)字来做测试,按F8一步一步来看,也行。
友情提醒:以后大多是这样:新建、输入、然后把代码复制到VBE中来测试。
使用 Duplicate(复制) 属性
下列指令创建一个Range对象的新副本 Range2,它与Range1有相同的起点、终点和文本。
Set Range2 = Range1.Duplicate
对 Range1 起点或终点的修改不影响 Range2,反之亦然。但是,由于这两个区域指向文档中的同一位置,对一个区域中文本的修改将影响另一个区域中的文本。
'我不知道为什么要使用这个Duplicate属性,上面都说是了Set range2=range1不是好用的很吗?不明白啊,或许以为你会发现的。
修改文档的某一部分(以后为细说对象时,说到这些,现在大致了解一些关键的东东)
Visual Basic 包含一些对象,可用这些对象修改下列文档元素:字符、单词、句子、段落和节。下表包含与这些文档元素相对应的属性和这些属性返回的对象。
表达式 Words(index) Characters(index)
Sentences(in
返回的对象
Range (注意Words返回的是Range对象) Range (注意Characters返回的是Range对象) Range (注意Sentences返回的是Range对象)
Word 文档
.
dex)
Paragraphs(index)
Sections(index)
Paragraph
Section (这个是“节”,就是插入、分隔符中的“节”)
如果使用这些属性时不带索引序号,则返回一个具有相同名称的集合对象。例如,Paragraphs 属性返回 Paragraphs 集合对象。但是如果通过索引序号识别集合中的一项,则返回上表中第二列中的对象。例如,Words(1) 返回一个 Range 对象(注意不是Word对象噢)。有了一个 Range 对象之后,可以使用任何区域属性或方法修改该 Range 对象。例如,下列指令将所选内容的第一个单词复制到“剪贴板”。
Sub CopyWord()
Selection.Words(1).Copy End Sub '仅供参考!
注释 Paragraphs 和 Sections 集合中的项是该集合的单个成员,而不是 Range 对象。但是(返回 Range 对象的)Range 属性对 Paragraph 和 Section 对象都可用。例如,下列指令将活动文档的第一段复制到“剪贴板”。
Sub CopyParagraph()
ActiveDocument.Paragraphs(1).Range.Copy End Sub
上述表格中的所有文档元素属性对 Document、Selection 和 Range 对象都可用。下列示例阐明了如何使用 Document、Selection 和 Range 对象的这些属性。
Word 文档
.
下列示例设置活动文档中第一个单词的大小写。 Sub ChangeCase()
ActiveDocument.Words(1).Case = wdUpperCase End Sub
下列示例将当前节的下边距设为 0.5 英寸(前台是通过页边距来做)。 Sub ChangeSectionMargin()
Selection.Sections(1).PageSetup.BottomMargin = InchesToPoints(0.5) End Sub
下列示例将活动文档的字符间距设为两倍(Content 属性返回一个 Range 对象)。
Sub DoubleSpaceDocument()
ActiveDocument.Content.ParagraphFormat.Space2 'Space2是2倍的缩写
End Sub
修改一组文档元素
若要修改由一组文档元素(字符、单词、句子、段落或节)组成的某区域的文字,需要创建一个 Range 对象。Range 方法根据开始和结束位置可创建 Range 对象。例如,下列指令创建一个 Range 对象,该对象引用活动文档的前十个字符。
Sub SetRangeForFirstTenCharacters()
Word 文档
.
Dim rngTenCharacters As Range
Set rngTenCharacters = ActiveDocument.Range(Start:=0, End:=10) End Sub
'没记错的话,这个例子以前用过,以后有这种情况,就是一个例子反复使用,但角度不同。
使用 Range 对象的 Start 和 End 属性可创建一个新的 Range 对象,该对象引用一组文档元素。例如,下列指令创建一个引用活动文档中前三个单词的 Range 对象 (myRange)。
Sub SetRangeForFirstThreeWords() Dim docActive As Document Dim rngThreeWords As Range
Set docActive = ActiveDocument '设置变量
Set rngThreeWords = docActive.Range(Start:=docActive.Words(1).Start, _
End:=docActive.Words(3).End) End Sub
下列示例创建一个 Range 对象(aRange),该对象从第二段的开头开始,在第三段之后结束。
Sub SetParagraphRange() Dim docActive As Document Dim rngParagraphs As Range
Word 文档
.
Set docActive = ActiveDocument Set rngParagraphs =
docActive.Range(Start:=docActive.Paragraphs(2).Range.Start, _
End:=docActive.Paragraphs(3).Range.End) End Sub
引用活动文档元素
要引用活动的段落、表格、域或其他文档元素,可使用 Selection 属性返回一个 Selection 对象。通过 Selection 对象,可访问选定内容中的所有段落或第一段。下列示例将边框应用于选定内容的第一段。
Sub BorderAroundFirstParagraph()
Selection.Paragraphs(1).Borders.Enable = True End Sub
下列示例将边框应用于选定内容中的每一个段落。 Sub BorderAroundSelection()
Selection.Paragraphs.Borders.Enable = True End Sub
下列示例将底纹应用于选定内容中第一张表格的首行。 Sub ShadeTableRow()
Selection.Tables(1).Rows(1).Shading.Texture = wdTexture10Percent End Sub
如果选定的内容不包含表格,将导致出错。可使用 Count (计数)属性判定选定内容中是否包含表格。下列示例将底纹应用于选定内容中第一张表格的首行。
Word 文档
.
Sub ShadeTableRow()
If Selection.Tables.Count >= 1 Then
Selection.Tables(1).Rows(1).Shading.Texture = wdTexture25Percent Else
MsgBox \"Selection doesn't include a table\" End If End Sub
下列示例将底纹应用于选定内容中每张表格的首行。For Each...Next 循环用于在选定内容的每张表格中循环。
Sub ShadeAllFirstRowsInTables() Dim tblTable As Table
If Selection.Tables.Count >= 1 Then '判断选中区域是否存在表格 For Each tblTable In Selection.Tables '这是在选中表中循环的标准写法
tblTable.Rows(1).Shading.Texture = wdTexture30Percent Next tblTable End If End Sub
使用Word对象
(这一部分不需要了解太深,以后用到时,还会详细的解释这些。原因有二:第一,这个比较抽象,第二,使用的频率不高。PS: 我的《身份证号码自动提取信息》的原理就是这个知识,但遗憾的是大多人看不懂。)
使用 Application 对象事件
若要创建 Application 对象事件的事件处理器,需要完成下列三个步骤: 在类模块中声明对应于事件的对象变量。
Word 文档
.
编写特定事件过程。
从其他模块中初始化声明的对象。 一、声明对象变量
在为 Application 对象事件编写过程之前,必须创建新的类模块并声明一个包含事件的 Application 类型对象。例如,假定已创建新的类模块并命名为 EventClassModule。该类模块包含下列代码:
Public WithEvents App As Word.Application 编写事件过程
定义了包含事件的新对象后,它将出现在类模块的“对象”下拉列表框中,然后可为新对象编写事件过程。(在“对象”框中选定新对象后,用于该对象的有效事件将出现在“过程”下拉列表框中)从“过程”下拉列表框中选择一个事件,在类模块中会增加一空过程。
Private Sub App_DocumentChange() End Sub
初始化已声明的对象
在运行过程之前,必须将类模块中已声明的对象(本例中为 App)连接到 Application 对象。您可在任何模块中使用下列代码:
Dim X As New EventClassModule Sub Register_Event_Handler() Set X.App = Word.Application End Sub
运行 Register_Event_Handler 过程。运行该过程后,类模块中的 App 对象指向 Microsoft Word Application 对象,当事件发生时,将运行类模块中的事件过程。
Word 文档
.
使用 Document 对象的事件
Document 对象支持多种事件,以响应文档状态。若要在名为
“ThisDocument”的类模块中编写响应这些事件的过程。可用下列步骤创建事件过程。
在“工程资源管理器”窗口中的 Normal 工程或文档工程下,双击
“ThisDocument”。(“ThisDocument”位于“文件夹”视图中的“Microsoft Word 对象”文件夹中)。
从“对象”下拉列表框中选择“Document”。 从“过程”下拉列表框中选择一个事件。 类模块中即增加了一个空子程序。
添加要在事件发生时运行的 Visual Basic 指令。
下例显示了 Normal 工程中的一个 New 事件过程,它在新建一个基于 Normal 模板的文档时运行。
Private Sub Document_New()
MsgBox \"New document was created\" End Sub
下例显示了文档工程中的 Close 事件过程,该过程只在该文档关闭时运行。 Private Sub Document_Close() MsgBox \"Closing the document\" End Sub
与自动宏不同,Normal 模板中的事件过程没有全局区。例如,Normal 模板中的事件过程只有在附加模板为 Normal 模板时才发生。
如果文档及其附加模板中存在自动宏,则仅运行保存在文档中的自动宏。如果文档及其附加模板中都存在文档事件过程,则两个事件过程都会运行。
Word 文档
.
使用 ActiveX 控件事件
(这部分主要是VB窗体的使用,对VB熟练的就OK,否则有点吃力,我也吃力。但我想没关系,我虽做不出如花的界面,但功能上能完成,也就行了。)
Microsoft Word 文档可包含 ActiveX 控件。可用“控件工具箱”插入诸如命令按钮、复选框和列表框等 ActiveX 控件。可使用下列步骤添加具有 LostFocus 事件的 ActiveX 复选框控件:
在 Word 中用鼠标右键单击工具栏,然后单击“控件工具箱”。 单击“复选框”控件。
活动文档中即插入一个复选框控件。
用鼠标右键单击复选框,然后单击“查看代码”。
Word 会切换至“Visual Basic 编辑器”并显示 ThisDocument 类模块,并在“对象”下拉列表框中选定该复选框。
在“过程”下拉列表框中选定 LostFocus 事件。 在类模块中会添加一个空过程。
添加要在事件发生时运行的 Visual Basic 指令。
下列示例显示在焦点离开 CheckBox1 时运行的 LostFocus 事件过程。该宏用 Value 属性显示 CheckBox1 的状态(True 为选定,False 为清除)。
Private Sub CheckBox1_LostFocus() MsgBox CheckBox1.Value End Sub
若要查看事件过程的运行情况,可切换回包含该复选框的 Word 文档。单击“控件工具箱”上的“退出设计模式”按钮。选定或清除复选框,然后单击文档中的其他元素。此时复选框失去焦点,LostFocus 过程开始运行;Word 会显示一个消息框,内容为 True 或 False。
Word 文档
.
Word 在 Word 文档中为 ActiveX 控件应用了 LostFocus 和 GotFocus 事件。“过程”下拉列表框中列出的其他事件在“Microsoft 窗体帮助”中有文档说明。
使用控件和对话框
(这一部分介绍的大多是关于窗体有关的东东,他与VB的类似,如果是VB高手,不用看的。像我等低手,有些也看不明白,不过,我觉得无大碍。我们更注重的内涵,而不是华丽的外表)
在文档中使用 ActiveX 控件
如果需要为用户提供复杂的交互方式,使用户可与宏进行直接交互而不受对话框的干扰,类似于将 ActiveX 控件添至自定义对话框,您可将控件直接添至文档。使用下列步骤可将 ActiveX 控件添至文档。有关在 Word 中使用 ActiveX 控件的特定信息,请参阅在文档中使用 ActiveX 控件。
将控件添至文档
若要向文档的图形层添加控件,请单击“控件工具箱”上的控件。若要向文档的文本层添加控件,请按住 Shift 并单击“控件工具箱”上的控件。
设置控件属性
在设计模式下用鼠标右键单击控件,并单击“属性”以显示“属性”窗口。 初始化控件
可在过程中初始化控件。 编写事件过程
所有控件都有一系列预定义的事件。例如,命令按钮有 Click 事件,当用户单击该命令按钮时,该事件发生。您可编写事件发生时运行的事件过程。
运行代码时使用控件的值 可在运行时设置某些属性
Word 文档
.
创建自定义对话框
通过下列步骤创建自定义对话框: 创建用户窗体
在“Visual Basic 编辑器”的“插入”菜单上,单击“用户窗体”。 将控件添至用户窗体
在“工具箱”中找到要添加的控件,并将控件拖至窗体上。 设置控件属性
在设计模式中用鼠标右键单击控件,并单击“属性”以显示“属性”窗口。 初始化控件
您可在显示窗体之前的过程中初始化控件,或为窗体的 Initialize 事件中添加代码。
编写事件过程
所有控件都有一系列预定义的事件。例如,命令按钮有 Click 事件,在用户单击命令按钮时,该事件发生。您可编写事件发生时运行的事件过程。
显示对话框
使用 Show 方法显示用户窗体。 运行代码时使用控件的值
有些属性可在运行时设置。用户在对话框中为控件设置的值将在对话框关闭时丢失。
显示内置 Word 对话框
(这个要掌握,这个是内置的对话框,与Word关系紧密。) 本主题包含下列信息和示例:
• • •
显示内置对话框 返回和更改对话框设置 检查对话框的关闭方式
Word 文档
.
显示内置对话框
可以显示内置对话框以获取用户输入的信息或使用 Visual Basic for Applications 控制 Microsoft Word。Dialog 对象的 Show 方法可显示并执行 Word 内置对话框中的任何操作。若要访问特定的内置 Word 对话框,请指定具有 Dialogs 属性的 WdWordDialog 常量。例如,下列宏指令显示“打开”对话框 (wdDialogFileOpen)。
Sub ShowOpenDialog()
Dialogs(wdDialogFileOpen).Show End Sub
选定文件并单击“确定”按钮后,会将文件打开(执行操作)。下列示例显示“打印”对话框 (wdDialogFilePrint)。
Sub ShowPrintDialog()
Dialogs(wdDialogFilePrint).Show End Sub
设置 DefaultTab 属性可以访问 Word 对话框中的特定选项卡。下列示例显示(“格式”菜单中)“边框和底纹”对话框中的“页面边框”选项卡。
Sub ShowBorderDialog()
With Dialogs(wdDialogFormatBordersAndShading)
.DefaultTab = wdDialogFormatBordersAndShadingTabPageBorder '这个偷长,我都晕了。 .Show End With End Sub
Word 文档
.
Display 方法显示对话框但不执行对话框的操作。如果使用内置对话框提示用户并返回设置,则该方法很有用。例如,下列宏指令显示(“工具”菜单中)“选项”对话框中的“用户信息”选项卡,然后返回并显示用户名称。
Sub DisplayUserInfoDialog()
With Dialogs(wdDialogToolsOptionsUserInfo) .Display MsgBox .Name End With End Sub
注释 您也可使用 Word 的 Visual Basic for Applications 属性显示用户信息而不显示对话框。下列示例使用 Application 对象的 UserName 属性显示应用程序的用户名称,而不显示“用户信息”对话框。
Sub DisplayUserInfo()
MsgBox Application.UserName End Sub
如果在上例中更改用户名称,对话框设置不会发生更改。使用 Execute 方法可以执行对话框中的设置而不显示该对话框。下列示例显示“用户信息”对话框,如果名称不是空字符串,则可使用 Execute 方法设置对话框。
Sub ShowAndSetUserInfoDialogBox()
With Dialogs(wdDialogToolsOptionsUserInfo) .Display
If .Name <> \"\" Then .Execute End With End Sub
Word 文档
.
注释 使用 Word 中的 VBA 属性和方法可设置用户信息而不显示对话框。下列代码示例通过 Application 对象的 UserName 属性更改用户名称,然后显示“用户信息”对话框,显示已进行了更改。请注意,更改对话框值时,并非必须显示对话框。
Sub SetUserName()
Application.UserName = \"Jeff Smith\"
Dialogs(wdDialogToolsOptionsUserInfo).Display End Sub
返回并更改对话框设置
如果可以使用属性或方法返回或更改对话框值,使用 Dialog 对象返回或更改该数值并非很有效。而且在大多数情况下,使用 VBA 代码代替访问 Dialog 对象时,代码更简单并更简短。因此,下列示例同时包含对应的使用相应 VBA 属性执行相同的任务的示例。
使用 Dialog 对象返回或更改对话框设置之前,需要识别单独的对话框。使用 WdWordDialog 常量的 Dialogs 属性可完成该操作。识别 Dialog 对象后,可以返回或设置对话框中的选项。下列示例显示“段落”对话框的右缩进。
Sub ShowRightIndent()
Dim dlgParagraph As Dialog
Set dlgParagraph = Dialogs(wdDialogFormatParagraph) MsgBox \"Right indent = \" & dlgParagraph.RightIndent End Sub
注释 可以使用 Word 的 VBA 属性和方法显示段落的右缩进设置。下列示例使用 ParagraphFormat 对象的 RightIndent 属性显示插入点位置的段落右缩进。
Sub ShowRightIndexForSelectedParagraph()
Word 文档
.
MsgBox Selection.ParagraphFormat.RightIndent End Sub
类似于返回对话框值,您也可以设置对话框值。下列示例标记“段落”对话框中的“与下段同页”复选框。
Sub SetKeepWithNext()
With Dialogs(wdDialogFormatParagraph) .KeepWithNext = 1 .Execute End With End Sub
注释 您也可以使用 VBA 属性和方法更改段落的右缩进。下列示例使用 ParagraphFormat 对象的 KeepWithNext 属性将所选段落与其后的段落保持在同一页。
Sub SetKeepWithNextForSelectedParagraph() Selection.ParagraphFormat.KeepWithNext = True End Sub
注释 使用 Update 方法可确保对话框的值反映当前值。如果预先在宏中定义了对话框变量,然后需要返回或更改当前设置,则可能必须使用 Update 方法。
检查对话框的关闭方式
Show 和 Display 方法返回的值标明关闭对话框时单击的按钮。下列示例显示“分隔符”对话框,如果单击“确定”按钮,则在状态栏中显示一条消息。
Sub DialogBoxButtons()
If Dialogs(wdDialogInsertBreak).Show = -1 Then StatusBar = \"Break inserted\"
Word 文档
.
End If End Sub
下列表格说明与对话框中的按钮相关联的返回值。 返回值 -2 -1 0(零)
> 0(零)
命令按钮:1 代表第一个按钮,2 代表第二个按钮,以此类推。
“关闭”按钮。 “确定”按钮。 “取消”按钮。
说明
内置对话框参数列表
您可能需要对 Microsoft Word 中的许多内置对话框的选项进行设置。若要设置或返回与 Word 对话框相关的属性,可使用等效的 Visual Basic 属性和方法。
例如,如果需要打印文档,可使用 Word Visual Basic for Applications 的 PrintOut 方法。下列代码使用“打印”对话框中的默认设置打印当前文档。但是,如果不希望使用“打印”对话框中的默认设置,可以使用与 PrintOut 方法相关的参数。
Sub PrintCurrentDocument() ThisDocument.PrintOut End Sub
虽然推荐您使用 VBA 关键字获取或设置对话框选项的值,但许多内置的 Word 对话框也具有可用于设置或获取对话框值的参数。详细信息,请参阅显示内置 Word 对话框。
Word 文档
.
WdWordDialog 常量 参数列表
wdDialogConnect Drive、Path 和 Password wdDialogConsistencyChecker (无) wdDialogControlRun Application 。。。 。。。
提醒:以后为不定期的给出一个练习及答案,大家对照学习。 第一期练习题目1: i see 我明白了 i quit 我不干了 let go 放手 me too 我也是 my god 天哪 no way 不行 come on 来吧 hold on 等一等
把以上文字复制到Word中,通过VBA,变换成以下的形式:
Word 文档
.
i see i quit let go me too my god no way come on hold on 我明白了 我不干了 放手 我也是 天哪 不行 来吧 等一等 答案: Sub 换化3() Dim arange As Range Dim array1, array2, array3 Dim i%
On Error Resume Next '忽略错误
Application.ScreenUpdating = False '关闭屏幕更新 Set arange = Selection.Range '设置区域
Word 文档
.
array1 = Split(arange.Text, Chr(13)) For i = 0 To UBound(array1) If i Mod 2 = 0 Then 'MsgBox array1(i)
array2 = array1(i) + Chr(13) + array2 '第一行、三行等奇数行 Else
array3 = array1(i) + Chr(13) + array3 '第二、四行等偶数行 End If Next
Selection.Delete '删除所选的内容 Selection.InsertAfter array2 Selection.InsertAfter array3
Application.ScreenUpdating = False '开启屏幕更新 End Sub
'以上还有简单简懂的方法,在VBE中。
第一期练习题目2: i see i quit let go me too my god no way
Word 文档
.
come on hold on 我明白了 我不干了 放手 我也是 天哪 不行 来吧 等一等
把以上文字复制到Word1中,通过VBA,变换成以下的形式:i see 我明白了 i quit 我不干了 let go 放手 me too 我也是 my god 天哪 no way 不行 come on 来吧
Word 文档
.
hold on 等一等 答案:
Sub第二题答案() Dim arange As Range Dim array1, array2, array3 Dim i%
On Error Resume Next '忽略错误
Application.ScreenUpdating = False '关闭屏幕更新
Set arange = Selection.Range '设置区域 array1 = Split(arange.Text, Chr(13)) For i = UBound(array1) / 2 - 1 To 0 Step -1
array2 = array1(i) + Chr(13) + array1(i + UBound(array1) / 2) + Chr(13) + array2 '
'注意,他不能保存格式,但对于文字可能是最好的方法之一。 Next
Selection.Delete '删除所选的内容 Selection.InsertAfter array2
Application.ScreenUpdating = False '开启屏幕更新 End Sub
函数:Weekday 函数
Word 文档
.
返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几。 语法:Weekday(date, [firstdayofweek]) Weekday 函数语法有下列的命名参数: 部分 date
描述
必要。能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。
Firstdayofweek
设置
firstdayofweek 参数有以下设定值: 常数 vbUseSystem
VbSunday
vbMonday
vbTuesday
vbWednesday
4
星期三 3
星期二 2
星期一 1
星期日(缺省值) 值0
描述
使用 NLS API 设置。
可选。指定一星期第一天的常数。如果未予指定,则以 vbSunday 为缺省值。
Word 文档
.
vbThursday
vbFriday vbSaturday
5 星期四
6 7
星期五 星期六
(以下知识是VBS知识,知道一点也不错!以后可经常摘录一些VBS的知识,但不作说明。因我也只是看得有一点点懂,写不出来的水平。)
Folders 集合
包含在一个 Folder 对象内的所有 Folder 对象的集合。 说明
下面的代码举例说明了如何获得一个 Folders 集合,以及如何用 For Each...Next 语句来访问该集合中的每个Folder:
Sub 文件夹()
ShowFolderList (\"c:\\\") End Sub
Sub ShowFolderList(folderspec) Dim fs, f, f1, fc, s
Set fs = CreateObject(\"Scripting.FileSystemObject\") Set f = fs.GetFolder(folderspec) Set fc = f.SubFolders For Each f1 in fc s = s & f1.name
Word 文档
.
s = s & vbCrLf Next MsgBox s End Sub
总结:交流之三中的Range对象是非常重要的,他可能是新手与老大的区别所在。之三大多知识不是很重要的,主要是消化以前的知识。还有就是常识性的了解一些知识。注意这部分内容请多看帮助。
如果有些地方不太明白,没关系,我会时不时的出一些需要运用交流之三知识能解决的,其后的内容就是介绍外部调用Word的知识,而后就是一个个具体的Word内置的对象了。
注意:这部分再上之四就算入门了。如果你还没有入门,请从头再看一下。
欢迎大家交流了一下这一块的学习心得,也欢迎提出你的疑问,或你的想法,如果你还什么其他的要求也可以提出来,我们一起来进行探讨、共同提高。
在 Microsoft Word 中使用 DAO
(其实说实在话,我也不会。因为DAO的范围比我们Word VBA要大的多,再暂时对我们有一定的难度。作为了解吧。)
数据访问对象(DAO)的属性、对象和方法的用法与 Microsoft Word 属性、对象和方法的用法相同。在建立对 DAO 对象库的引用之后,您可以打开数据库,设计和运行查询,并将结果记录集返回 Word。
Word 文档
.
引用 DAO
使用 DAO 之前,必须建立对 DAO 对象库的引用。使用下列步骤可建立对 DAO 对象库的引用:
1. 切换到“Visual Basic 编辑器”。 2. 在“工具”菜单上,单击“引用”。
3. 在“可使用的引用”框中,单击“Microsoft DAO 3.6 Object Library”。 (以上三条是充分必要的条件)
下列示例打开 Northwind 数据库(是不是超纲了?了解一点!)并将 Shippers 表中的项目插入活动文档。
(以下红色部分是引用DAO的标准语句,基本这几句都要用) Sub UsingDAOWithWord() Dim docNew As Document Dim dbNorthwind As DAO.Database Dim rdShippers As Recordset Dim intRecords As Integer
Set docNew = Documents.Add Set dbNorthwind = OpenDatabase _
(Name:=\"C:\\Program Files\\Microsoft Office\\Office11\\\" _ & \"Samples\\Northwind.mdb\")
Set rdShippers = dbNorthwind.OpenRecordset(Name:=\"Shippers\") For intRecords = 0 To rdShippers.RecordCount - 1
docNew.Content.InsertAfter Text:=rdShippers.Fields(1).Value rdShippers.MoveNext
docNew.Content.InsertParagraphAfter
Word 文档
.
Next intRecords rdShippers.Close dbNorthwind.Close End Sub
使用 OpenDatabase 方法可连接并打开数据库。打开数据库后,用 OpenRecordset 方法访问表格或进行查询。若要浏览记录集,可用 Move 方法。若要寻找指定的记录,可用 Seek 方法。如果仅需要记录的子集而不是整个记录集,可用 CreateQueryDef 方法自定义查询来选择满足搜索条件的记录。结束对数据库的操作后,最好用 Close 方法关闭该数据库,以节省内存。
说明
有关指定 DAO 对象、方法或属性的详细信息,请参阅“数据访问对象帮助”。
与其他应用程序进行通讯
除了处理 Word 数据,您可能需要用户应用程序与 Microsoft Excel、Microsoft PowerPoint 或 Microsoft Access 等其他应用程序进行数据交换。可以通过使用自动功能(以前称为 OLE 自动功能)或动态数据交换(DDE)与其他应用程序进行通讯。
从其他应用程序中自动进行 Word 操作
自动功能允许通过引用其他应用程序的对象、属性和方法来返回、编辑和输出数据。可由其他应用程序引用的应用程序对象称为 Automation 对象。
若要使其他应用程序使用 Microsoft Word 的自动功能,需要首先创建一个对 Word Application 对象的引用。
在 Visual Basic 中,可使用 Visual Basic 的 CreateObject(内存中如果没有Word.Application时,用这个) 或 GetObject(否则“勾引到她”^_^)
Word 文档
.
功能返回一个到 Word Application 对象的引用。例如,在 Microsoft Excel 过程中,可以使用下列指令:
Set wrd = CreateObject(\"Word.Application\")
'这就是在其它程序中或在word中新建一个Word的后台调用语句了。 该指令使 Word 中的 Application 对象可用于自动功能。使用 Word 的 Application 对象的对象、属性和方法,可以控制 Word。例如,下列指令创建一个新的 Word 文档:
wrd.Documents.Add
在创建新文档后,使用 Visible 属性使新文档可见。 wrd.Visible = True
CreateObject 功能启动一个 Word 会话(或者是一个Word进程,这个好解释一些),当引用 Application 对象的对象变量过期时,不会关闭自动功能。将对象设为对 Visual Basic 的 Nothing 关键字的引用不会关闭 Word。相反,使用 Quit 方法可关闭 Word 应用程序。
下列 Microsoft Excel 示例显示 Word 的启动路径。Quit 方法用于在显示启动路径后关闭 Word 的新实例。
Set wrd = CreateObject(\"Word.Application\") MsgBox wrd.Options.DefaultFilePath(wdStartupPath) wrd.Quit
从 Word 中对其他应用程序进行自动操作
若要在 Word 中通过自动功能与其他应用程序交换数据,需首先使用 CreateObject 或 GetObject 函数(与上同,不重复说了)获得应用程序的引用。然后使用另一个应用程序的对象、属性和方法添加、更改或删除信息。完成更改后,再关闭应用程序。下列 Word 示例显示 Microsoft Excel 的启动路径。可以
Word 文档
.
使用 Visual Basic 的带有 Nothing 关键字的 Set 语句清除对象变量,效果等同于关闭该应用程序。
Set myobject = CreateObject(\"Excel.Application\") MsgBox myobject.StartupPath Set myobject = Nothing
使用动态数据交换(DDE)(其实这个DDE我曾不听过,虽然我学VBA已有一年了。)
如果应用程序不支持自动功能(Office组件大多支持。),可使用 DDE。DDE 是一个协议,允许两个应用程序通过 DDE“通道”连续地进行自动数据交换。要控制两个应用程序之间的 DDE 会话,需要建立通道(有时像操作系统的通道?),选定主题,请求并传送数据,然后关闭该通道。下表列出了 Word 使用 DDE 所能支持的任务,以及通过 Visual Basic 控制每个任务的方法。
安全性 动态数据交换 (DDE) 是一种不安全的陈旧技术(我想:如果你是追求前卫的人这一部分可以跳过了。)如果可能,请使用比 DDE 更加安全的技术,如对象链接与嵌入 (OLE)。
任务
启动 DDE
从另一个应用程序获取文本
向另一个应用程序发送文本
在另一个应用程序中执行命令
关闭 DDE 通道
方法 DDEInitiate DDERequest
DDEPoke
DDEExecute DDETermina
Word 文档
.
te
关闭所有的 DDE 通道
DDETerminateAll
OLE 编程标识符
可用 OLE 编程标识符(有时也称为 ProgID)创建一个 Automation 对象。下表列出了 AxtiveX 控件、Microsoft Office 应用程序和 Microsoft Office Web Components 的 OLE 编程标识符。
ActiveX 控件 Microsoft Access Microsoft Excel Microsoft Graph
Microsoft Office Web Components Microsoft Outlook Microsoft PowerPoint Microsoft Word ActiveX 控件
若要创建下表中的 ActiveX 控件,请使用对应的 OLE 编程标识符。 (一般性的了解) 若要创建此控件 复选框 组合框 命令按钮
请使用此标识符 Forms.CheckBox.1 Forms.ComboBox.1 Forms.CommandButton.1
Word 文档
.
框架 图像 标签 列表框 多页控件 选项按钮 滚动条 数值调节钮 TabStrip 文本框 切换按钮
Forms.Frame.1 Forms.Image.1 Forms.Label.1 Forms.ListBox.1 Forms.MultiPage.1 Forms.OptionButton.1
Forms.ScrollBar.1 Forms.SpinButton.1 Forms.TabStrip.1 Forms.TextBox.1 Forms.ToggleButton.1
Microsoft Access
若要创建下表中的 Microsoft Access 对象,请使用对应的 OLE 编程标识符(就是通过这个“找到”你所要的对象等东东)。如果使用了无版本编号后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Access 的对象。
若要创建此对象 Application CurrentData CurrentProject DefaultWebOp
请使用下列标识符之一
Access.Application
Access.CodeData;Access.CurrentData Access.CodeProjectAccess.CurrentProject
Access.DefaultWebOptions
;
Word 文档
.
tions
Microsoft Excel
若要创建下表中的 Microsoft Excel 对象,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Excel 的对象。
若要创建此对象 Application
Workbook
Workbook
Workbook
n
Excel.AddIn 请使用下列标识符之一 Excel.Applicatio
注释
返回包含两个工作表的工作簿;一个
Excel.Chart 用于图表,一个用于数据。图表工作表是活动工作表。
Excel.Sheet 返回带一个工作表的工作簿。
Microsoft Graph
若要创建下表中的 Microsoft Graph 的对象,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Microsoft Graph 的对象。
若要创建此对象 Application
on
请使用下列标识符
之一 MSGraph.Applicati
Word 文档
.
Chart MSGraph.Chart
Microsoft Office Web Components
若要创建下表中的 Microsoft Office Web Components,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Microsoft Office Web Components 的对象。
若要创建此对象 ChartSpace DataSourceControl ExpandControl PivotTable
RecordNavigationControl
Spreadsheet Microsoft Outlook
若要创建下表中的 Microsoft Outlook 对象,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Outlook 的对象。
若要创建此对象 Application
n
请使用下列标识符
之一 Outlook.Applicatio
请使用下列标识符之一 OWC.Chart
OWC.DataSourceControl OWC.ExpandControl OWC.PivotTable
OWC.RecordNavigationControl
OWC.Spreadsheet
Word 文档
.
Microsoft PowerPoint(这个与Word无关,感兴趣看一下)
若要创建下表中的 Microsoft PowerPoint 对象,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 PowerPoint 的对象。
若要创建此对象 Application
请使用下列标识符
之一 PowerPoint.Application
Microsoft Word(这个要掌握,因为他是你在外部程序调用Word时必要知道的。交流资料之一也有类似的,对吧,没记错的话。)
若要创建下表中的 Microsoft Word 对象,请使用对应的 OLE 编程标识符。如果使用了无版本后缀的标识符,则会创建一个在运行宏的计算机上可用的最新版本 Word 的对象。
若要创建此对象 Application
Document Global
从Word Basic 转换到Visual Baisc
(略)
(原因:我们是新手,不可能是从WordBasic过渡过来的?如果是过渡过来的,肯定是高手,那么请多指点一下!谢谢了。)
Word 文档
请使用下列标识符之一
Word.Application Word.Document, Word.Template
Word.Global
.
WordBasic 和 Visual Basic 在概念上的区别
Visual Basic for Applications 和 WordBasic 之间主要的区别是,WordBasic 语言包含大约 900 个同级命令列表,而 Visual Basic 则包含处于分级结构中的多种对象,每种对象都具有一组特定方法和属性(类似于 WordBasic 中的语句和函数)。大多数 WordBasic 命令在任何时候都可运行,而在 Visual Basic 中,只能使用在给定时刻有效的对象的方法和属性。
对象是 Visual Basic 的基本元素;几乎在 Visual Basic 中进行的所有操作都与修改对象有关。Word 中的所有元素(文档、段落、域和书签等)都可用 Visual Basic 中的对象表示。与同级列表中的命令不同,部分对象只能通过其他对象进行访问。例如,只能从 Style、Selection 和 Find 等其他对象访问 Font 对象。
以下两段程序中应用加粗格式的编程任务表明两种编程语言之间的区别。下面的 ordBasic 指令对所选内容应用加粗格式。
Bold 1
下列示例是等效的 Visual Basic 语句,同样对所选内容应用加粗格式。 Selection.Font.Bold = True
Visual Basic 不包含 Bold 语句和函数。但具有名为 Bold 的属性(属性通常为对象的某种特性,例如大小、颜色或是否加粗等)。Bold 是 Font 对象的属性。类似地,Font 是 Selection 对象的属性,该属性返回一个 Font 对象。依照对象的等级结构,可以生成将加粗格式应用于所选内容的指令。
Bold 属性是一个 Boolean 类型的可读写属性。这意味着可将 Bold 属性设为 True 或 False(开或关),也可返回其当前值。下列 WordBasic 指令的返回值表明是否对所选内容应用了加粗格式。
x = Bold()
Word 文档
.
下列示例为等效的 Visual Basic 语句,同样返回所选内容的加粗格式的状态。
x = Selection.Font.Bold 使用 Visual Basic 的思路
若要在 Visual Basic 中执行一项任务,需要确定合适的对象。例如,如果希望应用“字体”对话框中的字符格式,可使用 Font 对象。然后需要逐级深入 Word 对象分级结构,确定从 Application 对象开始,到达要修改的 Font 对象所需要通过的对象,这些对象包含要修改的 Font 对象。确定该对象的路径后(例如,Selection.Font),可使用“Visual Basic 编辑器”中的“对象浏览器”、“帮助”或“自动列表成员”等功能确定可应用于该方法的属性和方法。有关使用属性和方法深入查找对象的详细信息,请参阅理解对象、属性和方法。
属性和方法通常对 Word 对象分级结构中的多种对象有效。例如,下列示例将加粗格式应用于整篇文档。
ActiveDocument.Content.Bold = True
另外,对象本身通常存在于对象分级结构中的多个位置。有关 Word 对象模型的图解说明,请参阅 Microsoft Word 对象。
若要了解在 Office Word 2003 中完成所需任务的 WordBasic 命令,请参阅 Visual Basic 和 WordBasic 命令对照表。
Selection 和 Range 对象
大部分 WordBasic 命令可修改所选内容。例如,Bold 命令可将所选内容设为加粗格式。InsertField 命令可在插入点插入域。任意时刻要在 Visual Basic 中处理所选内容时,可使用 Selection 属性返回 Selection 对象。所选内容可以是一块文字区域或仅为插入点。
下列 Visual Basic 示例将在所选内容之后插入文字和一个新段落。 Selection.InsertAfter Text:=\"Hello World\"
Word 文档
.
Selection.InsertParagraphAfter
除了处理所选内容,还可以定义并处理文档中不同区域的文本。Range 对象用开始字符位置和结束字符位置引用文档中标识的连续区域。类似于在文档中使用书签的方式,在 Visual Basic 中用 Range 对象标识文档中的某一部分。但不同于书签的是,用户看不到 Range 对象,除非使用 Select 方法选定了该 Range 对象。例如,可用 Visual Basic 在文档中的任何位置应用加粗格式,而不必更改所选内容。下列示例对活动文档的前 10 个字符应用加粗格式。
ActiveDocument.Range(Start:=0, End:=10).Bold = True 下列示例对第一个段落应用加粗格式。
ActiveDocument.Paragraphs(1).Range.Bold = True
这两个示例都更改了活动文档中的格式,且没有更改所选内容。有关 Range 对象的详细信息,请参阅处理 Range 对象。
将 WordBasic 宏转换为 Visual Basic
参阅特性
当第一次进行下列任何操作时,Microsoft Office Word 2003 将自动转换 Word 6.x 或 Word 95 模板中的宏。
• • •
打开该模板。
基于该模板新建一篇文档。
使用“工具”菜单上的“模板和加载项”命令在文档中加载模板。
在转换宏时,状态栏上会显示一条消息。转换结束后,必须保存模板,以保存转换后的宏。如果不保存模板,则下次使用该模板时,Word 会再次转换这些宏。
注释Office Word 2003 不能直接转换 Word 2.x 宏。您需要用 Word 6.x 或 Word 95 打开并保存 Word 2.x 模板,然后再用 Office Word 2003 打开这些模板。
Word 文档
.
转换过程将每个宏都转换为 Visual Basic 模块。若要查看经转换的宏,请将鼠标指向“工具”菜单上的“宏”子菜单,然后单击“宏”。“宏”对话框中的宏名称显示为 macroname.Main,其中 Main 指经转换的宏的主子程序(该子程序在早期版本的 Word 中以 Sub MAIN 开头)。若要编辑经转换的宏,请选择宏名并单击“编辑”按钮,即可在“Visual Basic 编辑器”中显示该 Visual Basic 模块。
对每条 WordBasic 语句都进行了修改,使其能在 Visual Basic for Applications 中正常工作。经转换的 WordBasic 宏与编写或录制的新 Visual Basic for Applications 宏具有相同的功能,但不完全一致。下列示例为 Word 95 模板中的一个 WordBasic 宏。
Sub MAIN
FormatFont .Name = \"Arial\Insert \"Hello World\" End Sub
在 Word 中打开该模板时,会将宏转换为下列代码: Public Sub Main()
WordBasic.FormatFont Font:=\"Arial\WordBasic.Insert \"Hello World\" End Sub
经转换的宏中的每一条语句以 WordBasic 属性开始。WordBasic 是 Office Word 2003 对象模型中的一个属性,该属性返回一个具有全部 WordBasic 语句和函数的对象;该对象使 WordBasic 宏可在 Office Word 2003 中运行。
注释如果保存该模板时覆盖了原来的模板,则该 WordBasic 宏会永久地丢失,并且早期版本的 Word 将不能使用经转换的宏。
Word 文档
.
下列 Visual Basic 宏与早期的 WordBasic 宏具有相同的功能,但是没有使用 WordBasic 属性。
Public Sub Main() With Selection.Font .Name = \"Arial\" .Size = 10 End With
Selection.TypeText Text:=\"Hello World\" End Sub
(以上的宏转换也不是重点,交流资料之四重点是了解在外部的调用Word的相关知识。
以下是VBA的相关知识(摘自VBS),他对我们的对一些习惯、概念的理解很好。所以,拿出来了。
在这里,我也“不自量力”(主要是应tommot兄的要求)一下,简单的说一下数组。(前提是把下面的数组变量等仔细看后,才能听懂我所说的)当然,要详细的学数组不是我等凡人能说清的。但我可以说的通俗一点,以便理解,当你理解我的所说,觉得不满足时,找找相关的帮助,就能超过我了。
给变量赋值
创建如下形式的表达式给变量赋值:变量在表达式左边,要赋的值在表达式右边。例如:
B = 200
标量变量和数组变量
多数情况下,只需为声明的变量赋一个值。只包含一个值的变量被称为标量变量。有时候,将多个相关值赋给一个变量更为方便,因此可以创建包含一系列
Word 文档
.
值的变量,称为数组变量。数组变量和标量变量是以相同的方式声明的,唯一的区别是声明数组变量时变量名后面带有括号 ( )。下例声明了一个包含 11 个元素的一维数组:
Dim A(10) '这种带确定的值一看我们就说他是静态数组,因为他给出他的长度。
虽然括号中显示的数字是 10,但由于在 VBScript 中所有数组都是基于 0 的,所以这个数组实际上包含 11 个元素。在基于 0 的数组中,数组元素的数目总是括号中显示的数目加 1。这种数组被称为固定大小的数组。
在数组中使用索引为数组的每个元素赋值。从 0 到 10,将数据赋给数组的元素,如下所示:
A(0) = 256 A(1) = 324 A(2) = 100 . . . A(10) = 55
与此类似,使用索引可以检索到所需的数组元素的数据。例如: 插入我的话了(我是根据以前我学过的一点点C语言的数组来理解的): 我们这样来形容数组在内存的存放形式,当然,这是假设的,实际上不会是这样的,但这样假设有利于我们的理解。
如果定义Dim A(4) as integer 然后这样定义: A(0)=0 A(1)=1 A(2)=2 A(3)=3
Word 文档
.
A(4)=4
在内存中我们可以以为是这样放的。以下是放在内存的地址(注意是地址不是值。)
A(0) A(1) A(2) A(3) A(4) 但的数据是这样的。 0 打个比方吧: 上面的地址就是你家的地址:北京市XX区XX号。数据就是你家的房子或者说床等实物。
是不是很像一条线,在“线”上放着一定的数值。应该就是这种一维的。 有一点感觉了吧?不错,就保持这种感觉。
现在,要重赋一个值给A(0),(即相当于打比方的把一个\"床\"放到你家里) 就可以这样: A(0)=100
现在“床”就是你家的“值”了。
有点意思吧。你可能想,这么麻烦,为什么用数组?
数组的使用可以说是思绪到一定水平的提高必要一步。他能提高程序的速度。
一时,你可能不能理解,没关系,经常使用,慢慢体会就行了。
你再想:黑客帝国---矩阵革命。为什么矩阵要革命,难道说矩阵很利害。对了,就是利害。
矩阵是什么?我不知道,但我知道二位矩阵就是二位数组。Excel的一个工作表就可以看成是一个二位矩阵,即二位数组,他的大小是65536×256
说实用的,三位数组可能就是象X、Y、Z轴的东东。
1 2 3 4 Word 文档
.
但不常用,也不好理解,
常用的还是二位数组。二位数组就是像表格一样。 如a(10)(10)
他的内存可以这样来假设: a(0)(0) a(0)(1) a(0)(2) … a(0)a(10) a(10)(0) a(10)(1) a(10)(2) … a(10)a(10) 仔细体会下面的程式:
我已复制到VBE中,你可以打开VBE,然后运行看一下。 Sub 数组() Dim arr1 As Integer MsgBox arr1
arr1 = Array(\"1\ MsgBox arr1(0) MsgBox arr1(1) MsgBox arr1(2) arr1 = 0 MsgBox arr1 End Sub Sub 数组2() Dim arr1(3) As Integer arr1(0) = 0 arr1(1) = 1 arr1(2) = 2 arr1(3) = 3 MsgBox arr1(0)
Word 文档
.
MsgBox arr1(1) MsgBox arr1(2) MsgBox arr1(3) End Sub Sub 数组3() Dim arr1() As Integer
ReDim arr1(3) '这个是必要的,不然就出错, '正文有说明,有人问为什以要用这个, '原因就是:在程序运行前,不能确定,只有程序 '运行到某步时,根据某个条件值才能确定这个值的情况 arr1(0) = 0 arr1(1) = 1 arr1(2) = 2 arr1(3) = 3 MsgBox arr1(0) MsgBox arr1(1) MsgBox arr1(2) MsgBox arr1(3) End Sub Sub 常规速度() Dim i% Dim atimer atimer = Timer Documents.Add For i = 1 To 1000
Word 文档
.
Selection.InsertAfter i Selection.InsertAfter Chr(13) Next
MsgBox Timer - atimer End Sub Sub 数组速度() Dim i%, astring Dim atimer
atimer = Timer '当初时间
For i = 1 To 1000
astring = astring & i & Chr(13) Next
Documents.Add '添加新文档 Selection.InsertAfter astring
MsgBox Timer - atimer '相减等于运行的时间 End Sub
从上面我猜:静态的定义是Dim A(n) as integer(等,不一定是ineger),动态可以是dim a()as integer,还有一种是变量即默认的值如dim a,其中注意因为a没有定义,所以他是Variant变量,当他应用于a=array(\"1\时,就相应于确定了一个静态数组,且赋了值。这是a就成了数组。同时,因为他是Variant变量,所以,这样赋值后,a=0,他也给设了一个值0,这个很特殊的。这时等于设a不为数组了,如之后,再用msgbox a(0)等就出错了。
有点难理解,多看几遍就行了。慢慢体会,细细玩味。
Word 文档
.
SomeVariable = A(8)
数组并不仅限于一维。数组的维数最大可以为 60(尽管大多数人不能理解超过 3 或 4 的维数,好像最大是64)。声明多维数组时用逗号分隔括号中每个表示数组大小的数字。在下例中,MyTable 变量是一个有 6 行和 11 列的二维数组:
Dim MyTable(5, 10)
在二维数组中,括号中第一个数字表示行的数目,第二个数字表示列的数目。 也可以声明动态数组,即在运行脚本时大小发生变化的数组。对数组的最初声明使用 Dim 语句或 ReDim 语句。但是对于动态数组,括号中不包含任何数字。例如:
Dim MyArray() ReDim AnotherArray()
要使用动态数组,必须随后使用 ReDim 确定维数和每一维的大小。在下例中,ReDim 将动态数组的初始大小设置为 25,而后面的 ReDim 语句将数组的大小重新调整为 30,同时使用 Preserve 关键字在重新调整大小时保留数组的内容。
ReDim MyArray(25)
ReDim Preserve MyArray(30)
(这个很重要,扩大数组时使用的,缩小时,是从后向前删的。可以看一个这个文档中VBE中的数组例子。)
重新调整动态数组大小的次数是没有任何限制的,但是应注意:将数组的大小调小时,将会丢失被删除元素的数据。
建常数
Word 文档
.
您可以使用 Const 语句在 VBScript 中创建用户自定义常数。使用 Const 语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:
Const MyString = \"这是一个字符串。\" Const MyAge = 49
请注意字符串文字包含在两个引号 (\" \") 之间。这是区分字符串型常数和数值型常数的最明显的方法。日期文字和时间文字包含在两个井号 (#) 之间。例如:
Const CutoffDate = #6-1-97#(以前我不知道时,我一输入时间格式,系统自动上这个,我就删啊,可是删掉后,光标跳出行后又来了。我晕了好几天,今天才看到。我悔啊。)
最好采用一个命名方案以区分常数和变量。这样可以避免在运行脚本时对常数重新赋值。例如,可以使用“vb”或“con”作常数名的前缀,或将常数名的所有字母大写。将常数和变量区分开可以在开发复杂的脚本时避免混乱。
过程的数据进出
给过程传递数据的途径是使用参数。参数被作为要传递给过程的数据的占位符。参数名可以是任何有效的变量名。使用 Sub 语句或 Function 语句创建过程时,过程名之后必须紧跟括号。括号中包含所有参数,参数间用逗号分隔。例如,在下面的示例中,fDegrees 是传递给 Celsius 函数的值的占位符:
Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End Function
要从过程获取数据,必须使用 Function 过程。请记住,Function 过程可以返回值;Sub 过程不返回值。
格式化代码
应尽可能多地保留屏幕空间,但仍允许用代码格式反映逻辑结构和嵌套。以
Word 文档
.
下为几点提示:
标准嵌套块应缩进 4 个空格。 过程的概述注释应缩进 1 个空格。
概述注释后的最高层语句应缩进 4 个空格,每一层嵌套块再缩进 4 个空格。例如:
'*********************************************************
' 目的: 返回指定用户在 UserList 数组中第一次出现的位置。 ' 输入: strUserList(): 所查找的用户列表。 ' strTargetUser: 要查找的用户名。
' 返回: strTargetUser 在 strUserList 数组中第一次出现时的索引。 ' 如果目标用户未找到,返回 -1。 '********************************************************* Function intFindUser (strUserList(), strTargetUser) Dim i ' 循环计数器。 Dim blnFound intFindUser = -1
i = 0 ' 初始化循环计数器。 Do While i <= Ubound(strUserList) and Not blnFound If strUserList(i) = strTargetUser Then blnFound = True ' 标记设为 True。 intFindUser = i ' 返回值设为循环计数器。 End If
i = i + 1 ' 循环计数器加 1。 Loop
' 发现目标的标记。
Word 文档
.
End Function
(以上这些要求,大家尽量要按照这些规定来做(没有规矩不成方圆啊)养成好的习惯是很重要的。)
这一讲的重、难点是下面的数组的定义、使用等知识。
下一讲:进入Word的核心,终于走到这一步了。如果你能再坚持一下,你基本就看到胜利了。
下一讲内容:Word的Activedocument对象、pargarphs对象等内部常使用的对象。不按照他的字母顺序来讲了。其中,有些我们不太常用的会跳过的,但我会告诉你一些如果要用到时,用那些方法最快的找到你所需要的对象、属性、方法。(大家可以先预习一下。)
Split函数 描述
返回一个下标从零开始的一维数组,它包含指定数目的子字符串。 语法
Split(expression[, delimiter[, limit[, compare]]]) Split函数语法有如下命名参数: 部分 Expression
描述
必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(\"\"),Split则返回一个空数组,即没有元素和数据的数组。
Delimiter
可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(\" \")作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的 expression字符串。
Word 文档
.
Limit 可选的。要返回的子字符串数,–1表示返回所有的子字符串。
Compare 可选的。数字值,表示判别子字符串时使用的比较方式。关于其值,请参阅“设置值”部分。
设置值
compare参数的设置值如下: 常数
vbUseCompareOption
vbBinaryCompare vbTextCompare vbDatabaseCompare
Join函数
(其实这个函数我在写这个之前我是不知道的。只是在写的过程中,看到帮助中的写到。他其实是上面分裂的逆过程。)
描述
返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。
语法
Join(sourcearray[, delimiter]) Join函数语法有如下命名参数:
Word 文档
值 –1
0 1 2
描述
用Option Compare语句中的设置值执行比较。
执行二进制比较。 执行文字比较。
仅用于Microsoft Access。基于您的数据库的信息执行比较。
.
部分 sourcearray
delimiter
描述
必需的。包含被连接子字符串的一维数组。
可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格(\" \")来分隔子字符串。如果delimiter是零长度字符串(\"\"),则列表中的所有项目都连接在一起,中间没有分隔符。
UBound 函数
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。 语法
UBound(arrayname[, dimension]) UBound 函数的语法包含下面部分: 部分 arrayname
dimension
可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2 表示第二维,如此等等。如果省略 dimension,就认为是 1。
说明
UBound 函数与 LBound 函数一起使用,用来确定一个数组的大小。LBound 用来确定数组某一维的上界。
对具有下述维数的数组而言,UBound 的返回值见下表:
描述
必需的。数组变量的名称,遵循标准变量命名约定。
Word 文档
.
Dim A(1 To 100, 0 To 3, -3 To 4) 语句 UBound(A, 1)
UBound(A, 2)
UBound(A, 3)
UBound 函数示例
该示例使用 UBound 函数,确定数组的指定维的最大可用下标。 Dim Upper
Dim MyArray(1 To 10, 5 To 15, 10 To 20) '声明数组变量。 Dim AnyArray(10)
Upper = UBound(MyArray, 1) '返回 10。 '后面的1是前第一维的最大下标
Upper = UBound(MyArray, 3) '返回 20。 '后面的3是前第二维的最大下标
Upper = UBound(AnyArray) '返回 10。 LBound 函数(这个不常用)
返回一个 Long 型数据,其值为指定数组维可用的最小下标。 语法
LBound(arrayname[, dimension]) LBound 函数的语法包含下面部分: 描述
4 3 返回值 100
Word 文档
.
arrayname 必需的。数组变量的名称,遵循标准的变量命名约定。 dimension 可选的;Variant (Long)。指定返回哪一维的下界。1 表示第一维,2 表示第二维,如此类推。如果省略 dimension,就认为是 1。
说明
LBound 函数与 UBound 函数一起使用,用来确定一个数组的大小。UBound 用来确定数组某一维的上界。
对具有下述维数的数组而言,LBound 的返回值见下表: Dim A(1 To 100, 0 To 3, -3 To 4) 语句 返回值 LBound(A, 1) 1 LBound(A, 2) 0 LBound(A, 3) -3
所有维的缺省下界都是 0 或 1,这取决于 Option Base 语句的设置。使用 Array 函数创建的数组的下界为 0;它不受 Option Base 的影响。
对于那些在 Dim 中用 To 子句来设定维数的数组而言,Private、Public、ReDim 或 Static 语句可以用任何整数作为下界。
Replace函数 描述
返回一个字符串,该字符串中指定的子字符串已被替换成另一子字符串,并且替换发生的次数也是指定的。
语法几
Replace(expression, find, replace[, start[, count[, compare]]]) Replace函数语法有如下命名参数: 部分
描述
Word 文档
.
expression find replace start
必需的。字符串表达式,包含要替换的子字符串。 必需的。要搜索到的子字符串。 必需的。用来替换的子字符串。
可选的。在表达式中子字符串搜索的开始位置。如果忽略,假定从1开始。
count 可选的。子字符串进行替换的次数。如果忽略,缺省值是 –1,它表明进行所有可能的替换。
compare 可选的。数字值,表示判别子字符串时所用的比较方式。关于其值,请参阅“设置值”部分。
设置值
compare参数的设置值如下: 常数
vbUseCompareOption
vbBinaryCompare vbTextCompare vbDatabaseCompare
返回值
Replace的返回值如下:
1
0 1 2 值 –
描述
使用Option Compare语句的设置值来执行比较。
执行二进制比较。 执行文字比较。
仅用于Microsoft Access。基于您的数据库的信息执行比较。
Word 文档
.
如果
expression长度为零 expression为Null find长度为零 replace长度为零
Replace返回值 零长度字符串(\"\")。 一个错误。 expression的复本。
expression的复本,其中删除了所有出现的find 的字符串。
start > Len(expression) count is 0 说明
长度为零的字符串。 expression的复本。
Replace函数的返回值是一个字符串,但是,其中从start所指定的位置开始,到expression字符串的结尾处的一段子字符串已经发生过替换动作。并不是原字符串从头到尾的一个复制。
Filter函数 描述
返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。
语法
Filter(sourcesrray, match[, include[, compare]]) Filter函数语法有如下的命名参数: 部分 sourcearray
描述
必需的。要执行搜索的一维字符串数组。
Word 文档
.
match include
必需的。要搜索的字符串。
可选的。Boolean值,表示返回子串包含还是不包含match字符串。如果include是True,Filter返回的是包含match子字符串的数组子集。如果include是False,Filter返回的是不包含match子字符串的数组子集。
compare 可选的。数字值,表示所使用的字符串比较类型。有关其设置,请参阅下面的“设置值”部分。
设置值
Compare参数的设置值如下: 常数
vbUseCompareOption
vbBinaryCompare vbTextCompare vbDatabaseCompare
说明
如果在sourcearray中没有发现与match相匹配的值,Filter返回一个空数组。如果sourcearray是Null或不是一个一维数组,则产生错误。
Filter函数所返回的数组,其元素数目刚好是所找到的匹配项目数。
1
0 1 2 值 –
描述
使用Option Compare语句的设置值来执行比较。
执行二进制比较。 执行文字比较。
只用于Microsoft Access。基于您的数据库信息来执行比较。
Word 文档
.
数组常用到的函数与方法就是以上这些。(注意,有部分内容我在VBE中加了注释,在这里没有重复说了,所以,如你想仔细了解,最好在VBE中找到相关的代码,按F8,然后一步一步执行,体会他的内涵。)
数组也可以传递。(最后这个例子就是。) Sub 数组传递1() Dim a As Variant Dim c Dim i%, b%
a = Array(\"1\'如果想去掉中间的3,应该怎么做? c = Filter(a, \"3\'这个就是去掉后的长度 MsgBox UBound(c) End Sub
最后一例:原地址是http://www.168518.net/more.asp?rjlm=5
2005年下半年程序员下午试题 第一题(以下是试卷,他用的语言是C,但大多是通的,我下面也给出不用C,而用VBA的代码)
试题一(15分,每空3分)
阅读下列说明和流程图,将应填入___(n)___处的字句写在答题纸的对应栏内。 [流程图说明]
流程图1-1描述了一个算法,该算法将给定的原字符串中的所有前导空白和尾部空白都删除,但保留非空字符的空白。例如,原字符串“ File Name ”,处理变成“File Name” 。流程图1-2、流程图1-3 、流程图1-4分别详细描述了流程图1-1中的框A、B、C。
Word 文档
.
假设原字符串中的各个字符依次存放在字符数组ch 的各元素ch(1) 、ch(2) 、?、ch(n) 中,字符常量KB表示空白字符。
流程图1-1的处理过程是:先从头开始找出该字符串中的第一个非空白字符ch(i),再从串尾开始向前找出位于最末位的非空白字符ch(j) ,然后将ch(i) 、?、ch(j) 依次送入ch(1) 、ch(2)、?中。如果字符串中没有字符或全是空白字符,则输出相应的说明。在流程图中,[流程图1-1]
Word 文档
strlen 是取字符串长度函数。
.
[流程图1-2]
Word 文档
.
1. i Word 文档 . [问题] 在流程图1-1中,判断框P中的条件可表示为:i > ___(5)___ strlen(ch) 答案: i <= n (2) ch (j) = KB (3) k <= j (4) ch(k-i+1) (5) n VBA的代码: Option Base 1 '数组从1开始 Sub a3() Dim a As String Word 文档 . Dim b As Long Dim ch() As String Dim i As Long On Error Resume Next '设a为所求的字符串 a = \" 2 3 \" b = Len(a) ReDim ch(b) '此就是假设原字符在数组的做法 For i = 1 To b ch(i) = Mid(a, i, 1) Next '到这里我们已经后数组对应的值取了字符串对应的值了。 ' MsgBox ch(1) '字符常量KB表示空白字符 '我理解空白字符常用就是chr(32)与全角的空格 '即VBA.AscB(32)与VBA.AscB(0) '流程图1-1的处理过程是:先从头开始找出该字符串中的第一个非空白字符ch(i), '再从串尾开始向前找出位于最末位的非空白字符ch(j) ,然后将ch(i) 、?、ch(j) '依次送入ch(1) 、ch(2)、?中。如果字符串中没有字符或全是空白字符, '则输出相应的说明。在流程图中,strlen 是取字符串长度函数 Dim ac i = 0 Word 文档 . For Each ac In ch() i = i + 1 If ac <> \" \" Then If ac <> \" \" Then Exit For End If End If Next ' MsgBox ch(i) '这时就取找到不是空时开始的位置 '现在反向找,用上面不好使了,用下面的 Dim ib As Long b = UBound(ch) For ib = UBound(ch) To 1 Step -1 b = b - 1 If ch(ib) <> \" \" Then If ch(ib) <> \" \" Then Exit For End If End If Next b = b + 1 '体会一下这里的加1,因为即使没用任何满足的条件,上面b=b-1也执行了一次 'MsgBox b 'MsgBox ch(b) '这就取得了最后不是空的字值位置 Dim bc As Long, ff As Long Word 文档 的 . Dim abc ff = 0 ReDim abc(b - i + 1) For bc = i To b ff = ff + 1 abc(ff) = ch(bc) Next Dim ad Dim ch1 As String For ad = 1 To UBound(abc) ch1 = ch1 & abc(ad) Next MsgBox \"去掉前后空格是\" & ch1 & \"止\去掉前后的长度为\" & Len(ch1) End Sub (VBE中也贴粘了,大家可以试试,在模块内,特别强调这是说做这个题,如果真要去掉前后空格,绝对不要用这个,有更好的——Trim函数。) 用这个函数对这篇文档进行测试(见VBE中的相关代码): 2.164063 2.210938 2.730469 而Trim几乎瞬间就完成了。 可以看出,数组是很常用的方法,也是提高速度的方法,难点的就是这样了。 不说了,虽然我花了不少时间,可是还是怕说得不妥,耽误大家了。再说就 Word 文档 . 有一点自说自话的感觉了,还是等以后的高手(可能就是你噢)再写提高的东东吧。其实:主要还是怕漏洞越来越大了。留着点好“养家糊口”(呵呵)。要想提高,找些运用这些知识的例子或找些相关的帮助看看。我这只是“抛砖引玉”而己。 欢迎大家交流了一下这一块的学习心得,也欢迎提出你的疑问,或你的想法,如果你还什么其他的要求也可以提出来,我们一起来进行探讨、共同提高。 Application 对象 该对象代表 Microsoft Word 应用程序。Application 对象包含可返回最高级对象的属性和方法(VIP?^_^)。例如,ActiveDocument 属性可返回一个 Document 对象。 使用 Application 对象 使用 Application 属性可返回 Application 对象。下列示例(就是我们说的“例子”)显示 Word 用户名。 MsgBox Application.UserName 在使用许多可返回最普通的用户界面对象(例如 ActiveDocument 属性返回的活动文档对象)的属性和方法时,可以不用 Application 对象识别符。例如,可写为 ActiveDocument.PrintOut,而不必写为 Application.ActiveDocument.PrintOut。没有使用 Application 对象识别符的属性和方法被看作是“全局”的。若要在“对象浏览器”中查看全局属性和方法,请单击“类”框中列表顶端的“〈全局〉”(如图)。 Word 文档 . 说明 若要使用来自另一个应用程序的自动功能(以前称为 OLE 自动功能)来控制 Word,请使用 Visual Basic 的 CreateObject 或 GetObject 函数返回一个 Word Application 对象。下列 Microsoft Excel 示例启动 Word(如果 Word 尚未启动),并打开一篇现有的文档。 Set wrd = GetObject(, \"Word.Application\") wrd.Visible = True wrd.Documents.Open \"C:\\My Documents\\Temp.doc\" Set wrd = Nothing ActiveDocument 属性 (我错了,我一直以为activedocuemnt是对象,直到写这个时,才发现他是属性,是application的属性,只不过application可以略罢了。羞啊,具然这个今天才明白。) Word 文档 . 返回一个 Document 对象,该对象代表活动文档。如果没有打开的文档,就会导致出错。只读。 示例 本示例显示活动文档的名称,如果没有打开的文档,则显示一条消息。 If Application.Documents.Count >= 1 Then MsgBox ActiveDocument.Name Else MsgBox \"No documents are open\" End If 本示例将所选内容折叠为插入点,然后创建一个区域,包括选定内容的后面五个字符。 Dim rngTemp As Range Selection.Collapse Direction:=wdCollapseStart '折叠到开始 Set rngTemp = ActiveDocument.Range(Start:=Selection.Start, _ End:=Selection.Start + 5) MsgBox rngTemp 本示例在活动文档的开头插入文本,然后打印该文档。 Dim rngTemp As Range Set rngTemp = ActiveDocument.Range(Start:=0, End:=0) With rngTemp .InsertBefore \"Company Report\" .Font.Name = \"Arial\" .Font.Size = 24 .InsertParagraphAfter End With Word 文档 . ActiveDocument.PrintOut Document 对象 代表一篇文档。Document 对象是 Documents 集合中的一个元素。Documents 集合包含 Word 当前打开的所有 Document 对象。 使用 Document 对象 用 Documents(index) 可返回单个的 Document 对象,其中 index 是文档的名称或索引序号。下列示例关闭名为“Report.doc”的文档,并且不保存所做的修改。 Documents(\"Report.doc\").Close SaveChanges:=wdDoNotSaveChanges '带参数 索引序号代表文档在 Documents 集合中的位置。下列示例激活 Documents 集合中的第一篇文档。 Documents(1).Activate 使用 ActiveDocument 可用 ActiveDocument 属性引用处于活动状态的文档。下列示例用 Activate 方法激活名为“Document 1”的文档,然后将页面方向设置为横向,并打印该文档。 Documents(\"Document1\").Activate'激活这个文档,这个有时用,应该版本不同的原因 ActiveDocument.PageSetup.Orientation = wdOrientLandscape ActiveDocument.PrintOut Document 属性 (应用于pane(代表一个窗格)对象、range对象、selection对象、window对象的属性)返回一个 Document 对象,该对象与指定窗格、窗口或选定部分相关。只读。 示例 Word 文档 . 本示例显示选定部分所在的文档名称和路径。 Msgbox Selection.Document.FullName 该示例将活动文档中的窗口设置为 myDoc。然后切换至下一个窗口,并加以拆分。再用 Activate 方法切换回原文档。 Set myDoc = Application.ActiveWindow.Document If Windows.Count >= 2 Then Application.ActiveWindow.Next.Activate Application.ActiveWindow.Split = True myDoc.Activate End If Window 对象 代表一个窗口,诸如滚动条和标尺等文档特征事实上是窗口的属性。Window 对象是 Windows 集合的一个元素。Application 对象的 Windows 集合包含了应用程序中的所有窗口,而 Document 对象的 Windows 集合只包含显示指定文档的窗口。 使用 Window 对象 可用 Windows(index) 返回一个 Windows 对象,其中 index 为窗口名或索引序号。下列示例最大化 Document1 窗口。 Windows(\"Document1\").WindowState = wdWindowStateMaximize 索引序号指“窗口”菜单中窗口名左侧的数字。下列示例显示 Windows 集合中第一个窗口的标题。 MsgBox Windows(1).Caption 可用 Add 方法或 NewWindow 方法在 Windows 集合中添加一个新窗口。下列每个语句在活动窗口的文档中生成一新窗口。 ActiveDocument.ActiveWindow.NewWindow Word 文档 . NewWindow Windows.Add 说明 对同一文档打开多个窗口时,窗口标题将出现冒号 (:) 和一个数字。 当将视图转换成打印预览时,便创建了新的窗口。在关闭打印预览时,该窗口便从 Windows 集合中被删除。 以下主要来学习application对象的Activedocument属性的属性,因为他返回的是Document 对象,所以,即是学习document对象的属性。(仔细体会这句话,有题外话的) Document对象的部分属性(不提及与XML有关的东东,因为我也不会。想了解的,自己看帮助吧。到时,记得带Konggs分享一下噢。) 以上为Document对象的属性部分截图,很多吧?不过,没关系,我们就学常见的几个。 不常见的也会部分贴出,不做为重点,就是知道有这么回事,就OK。 ActiveWindow 属性(非重点) 返回 Window 对象,该对象代表活动窗口(焦点所在的窗口)。如果没有 Word 文档 . 打开的窗口,则会导致出错。只读。 示例 本示例显示活动窗口的标题文本。 Sub WindowCaption() MsgBox ActiveDocument.ActiveWindow.Caption End Sub 本示例为活动文档的活动窗口打开一个新窗口,然后平铺所有窗口。 Sub WindowTiled() Dim wndTileWindow As Window Set wndTileWindow = ActiveDocument.ActiveWindow.NewWindow Windows.Arrange ArrangeStyle:=wdTiled End Sub 本示例拆分第一个文档窗口。 Sub WindowSplit() Documents(1).ActiveWindow.Split = True End Sub Application 属性 不使用对象识别符号时,此属性返回一个 Application 对象,该对象代表 Microsoft Word 应用程序;当使用对象识别符号时,此属性返回一个 Application 对象,该对象代表指定对象的创建者;当对 OLE 自动功能对象应用此属性时,返回该对象的应用程序。 expression.Application expression 必需。该表达式返回“应用于”列表中的一个对象。 说明 Visual Basic 的 CreateObject 和 GetObject 函数使您可以在 Visual Basic Word 文档 . for Applications 工程中访问 OLE 自动功能对象。 示例 本示例使 Microsoft Word 显示滚动条、屏幕提示和状态栏。 With Application .DisplayScrollBars = True .DisplayScreenTips = True .DisplayStatusBar = True End With 如果正在运行的是 Excel,本示例将显示 Microsoft Excel 启动路径。 If Tasks.Exists(Name:=\"Microsoft Excel\") = True Then Set myobject = GetObject(\"\ MsgBox myobject.Application.StartupPath Set myobject = Nothing End If AttachedTemplate 属性 返回一个 Template 对象,该对象代表与活动文档相关联的模板。若要设置该属性,请指定模板名称或返回 Template 对象的表达式。Variant 类型,可读写。 示例 本示例显示与活动文档相关联的模板名称和路径。 Set myTemplate = ActiveDocument.AttachedTemplate MsgBox myTemplate.Path & Application.PathSeparator _ & myTemplate.Name 本示例在文档 1 的开始处插入图文场的内容(一个内置“自动图文集”词条)。 Word 文档 . Set myRange = Documents(1).Range(0, 0) Documents(1).AttachedTemplate.AutoTextEntries(\"Spike\") _ .Insert myRange 本示例为活动文档附加名为“Letter.dot”模板。 ActiveDocument.AttachedTemplate = \"C:\\Templates\\Letter.dot\" Background 属性 返回一个 Shape 对象,该对象表示指定文档的背景图像。只读。 注释 只有在 Web 版式视图中才能看到背景。 示例 本示例将活动窗口的 Web 版式视图背景色设为浅灰色。 ActiveDocument.ActiveWindow.View.Type = wdWebView With ActiveDocument.Background.Fill .Visible = True .ForeColor.RGB = RGB(192, 192, 192) End With 本示例将 Web 版式视图的背景位图图像设为 Bubbles.bmp。 ActiveDocument.ActiveWindow.View.Type = wdWebView ActiveDocument.Background.Fill.UserPicture _ PictureFile:=\"C:\\Windows\\Bubbles.bmp\" Bookmarks 属性(重要) 返回一个 Bookmarks 集合。该集合代表某一文档、区域或选定部分中的所有书签。只读。 有关返回集合中单个成员的内容,请参阅返回集合中的对象。 示例 本示例将检索活动文档中第一个书签的首字符和尾字符的位置。 Word 文档 . With ActiveDocument.Bookmarks(1) BookStart = .Start BookEnd = .End End With 本示例使用 aMarks() 数组存储活动文档包含的所有书签的名称. If ActiveDocument.Bookmarks.Count >= 1 Then ReDim aMarks(ActiveDocument.Bookmarks.Count - 1) '注意这个是减1,因为数组从0开始的 i = 0 For Each aBookmark In ActiveDocument.Bookmarks aMarks(i) = aBookmark.Name i = i + 1 Next aBookmark End If 本示例将所选内容中用第一个书签(不是文档的标签)标记的文本区域的格式设置为加粗。(作者注:document对象的属性大多数selection对象都有的。) If Selection.Bookmarks.Count >= 1 Then Selection.Bookmarks(1).Range.Bold = True End If BuiltInDocumentProperties 属性(比较重要) 返回一个 DocumentProperties 集合,该集合代表了指定文档的所有内置的文档属性。 说明: 若要返回代表指定内置文档属性的单一 DocumentProperty 对象,请使用 BuiltinDocumentProperties(index),其中 index 是一个 WdBuiltInProperty 常量。 Word 文档 . 如需获得有效常量的列表,请参考 Microsoft Visual Basic 对象浏览器。有关返回集合中单个成员的内容,请参阅返回集合中的对象。 如果 Microsoft Word 没有为一个内置的文档属性定义一个值,则读取这个文档属性的 Value 属性时会产生一个错误。 用 CustomDocumentProperties 属性返回自定义文档属性的集合。 示例 本示例在活动文档的末尾插入一个内置属性列表。 Sub ListProperties() Dim rngDoc As Range Dim proDoc As DocumentProperty Set rngDoc = ActiveDocument.Content rngDoc.Collapse Direction:=wdCollapseEnd For Each proDoc In ActiveDocument.BuiltInDocumentProperties With rngDoc .InsertParagraphAfter .InsertAfter proDoc.Name & \"= \" On Error Resume Next .InsertAfter proDoc.Value End With Next End Sub 本示例显示活动文档中的单词数。 Sub DisplayTotalWords() Dim intWords As Integer intWords Word 文档 = . ActiveDocument.BuiltInDocumentProperties(wdPropertyWords) MsgBox \"This document contains \" & intWords & \" words.\" End Sub CodeName 属性 返回指定文档的代码名称。String 类型,只读。 说明 代码名称是保存文档的事件宏的模块名。该模块的默认名为“ThisDocument”,可在“工程”窗口中查看该模块。有关使用 Document 对象的事件的内容,请参阅使用 Document 对象的事件。(见下图) 示例 本示例返回活动文档的代码窗口名称。 Msgbox ActiveDocument.CodeName Characters 属性 返回一个 Characters 集合,该集合代表文档、区域或所选内容中的字符。只读。 有关返回集合中单个成员的内容,请参阅返回集合中的对象。 示 例 本示例显示所选内容的第一个字符。如果没有选定任何内容,则显示插入点后的第一个字符。 char = Selection.Characters(1).Text MsgBox \"The first character is... \" & char 本示例返回活动文档首句中的字符数(包括空格)。 Word 文档 . numchars = ActiveDocument.Sentences(1).Characters.Count CommandBars 属性 该属性返回一个 CommandBars 集合,该集合代表 Microsoft Word 中的菜单栏和所有的工具栏。 expression.CommandBars expression 必需。该表达式返回“应用于”列表中的一个对象。 说明 在访问 CommandBars 集合之前,可用 CustomizationContext 属性设置模板或文档上下文。(返回或设置一个 Template 或 Document 对象,该对象代表保存着菜单栏、工具栏和组合键的改动的模板或文档。对应于“工具”菜单“自定义”对话框“命令”选项卡上“保存于”框中的值。可读写。)(即鼠标放到工具栏对应按钮时,对应下面的出现的文本,如果略,则与工具栏的文本一样) 有关返回集合中单独成员的内容,请参阅返回集合中的对象。 示例 本示例增大所有的命令栏按钮并激活工具提示。 With CommandBars .LargeButtons = True .DisplayTooltips = True End With 本示例在应用程序窗口底部显示“绘图”工具栏。 With CommandBars(\"Drawing\") .Visible = True .Position = msoBarBottom End With 本示例将“版本”命令按钮添至“常用”工具栏。 Word 文档 . CustomizationContext = NormalTemplate CommandBars(\"Standard\").Controls.Add Type:=msoControlButton, _ ID:=2522, Before:=4 CommandBars 集合对象(与上面的属性相关的知识) 一个代表容器应用程序中命令栏的 CommandBar 对象集合。 使用 CommandBars 集合 用 CommandBars 属性可返回 CommandBars 集合。以下示例在 Immediate(直接) 窗口显示每个菜单栏和工具栏的名称和本地名称,并显示一个数值以表明该菜单栏或工具栏是否出现在屏幕上。 For Each cbar in CommandBars Debug.Print cbar.Name, cbar.NameLocal, cbar.Visible '这个输出到立即窗口,即在VBE 下按CTRl+G就看到了。 Next 用 Add 方法可在集合中添加一个新的命令栏。以下示例创建一个自定义工具栏“Custom1”并将其作为浮动工具栏显示。 Set cbar1 = CommandBars.Add(Name:=\"Custom1\ Position:=msoBarFloating) cbar1.Visible = True 用 CommandBars(index) 可返回一个 CommandBar 对象;此处 index 是该命令栏的名称或索引号。以下示例将工具栏“Custom1”固定在应用程序窗口的底部。 CommandBars(\"Custom1\").Position = msoBarBottom 注释 您可使用名称或索引号指定容器应用程序中可用菜单栏和工具栏列表的菜单栏或工具栏,但必须使用名称指定菜单、快捷菜单或子菜单(所有这些内容均 Word 文档 . 可由 CommandBar 对象表示)。 如果两个或两个以上的自定义菜单或子菜单具有相同的名称,那么 CommandBars(index) 返回第一个具有该名称的菜单。为确保返回正确的菜单或子菜单,可找到显示该菜单的弹出式控件,然后对该弹出式控件使用 CommandBar 属性以返回代表该菜单的命令栏。 例1: Sub 替换空行新方法() Dim a1 Dim b1, c1 Dim d1 As String, astring As String Dim atim As Long atim = Timer Application.ScreenUpdating = False a1 = ActiveDocument.Content b1 = Split(a1, Chr(13)) '变为数组 For Each c1 In b1 '在数组中循环 c1 = Trim(c1) '去掉前后的空格,选择性粘贴后,没有软回车 d1 = Replace(c1, Chr(9), \"\") '如果全部是制表符 If d1 = \"\" Then '不作处理 Else astring = astring + c1 + Chr(13) '累加 End If Next Word 文档 . ActiveDocument.Content = astring Application.ScreenUpdating = True MsgBox Timer – atim ‘2006年5月11日补:缺点是有的“加密文字”(可能不是加密,只是字符集不在常用的范围里。)为显示为乱字符。 End Sub 例 2 : 引 http://club.excelhome.net/dispbbs.asp?boardID=23&ID=165869&page=2&px=0 怎么满足如下的全部替换? 意思是Word文档中许多重复的字词是在一起的,比如I I I LOVE LOVE LOVE U U U U之类,要变成I LOVE U。 我的答案是: Sub 查找() Dim aword%, i% On Error Resume Next Application.ScreenUpdating = False aword = ActiveDocument.Words.Count i = 2 With ActiveDocument Do While i < aword If RTrim(.Words(i)) = RTrim(.Words(i - 1)) Then .Words(i - 1).Delete aword = aword - 1 Else Word 文档 . i = i + 1 End If Loop End With Application.ScreenUpdating = True End Sub 法二: (老大的效率高) Option Compare Text '不区分大小写 Sub Example() Dim oWord As Range, myRange As Range On Error GoTo EndSub '忽略错误 Application.ScreenUpdating = False Set myRange = ActiveDocument.Content GN: For Each oWord In myRange.Words With oWord If Trim(.Text) = Trim(.Next(wdWord).Text) Then .Delete '删除 myRange.SetRange .Start, myRange.End GoTo GN End If End With Next EndSub: Application.ScreenUpdating = True Word 文档 . End Sub 交流资料之五有不少属性。 资料之五介绍的有点杂,但是因为到了真正的某个对象时,往往就是这样。耐心一下,要相信:冬过已经来了,春天还会远吗? 只有认真的知道一个对象,其它的对象很多都是同理的。就像学习语言一样,但你对一门语言研究的比较深时,再学习另一种语言,会理解的很快的。―――――我认为。 从这一期开始,每个学习交流之后附上习题。下一期的开始来附上这一期的答案。如果你的不方便用文字介绍的话,我会考虑用gif动画,放到Word,到时,大家都可以看到带gif动画的Word文档,我不会考虑用flash等为辅助手段。第一,我不怎么会,第二,太华丽的外表只会把内容吞并。 本期习题(全部用VBA完成): 1.新建一个文档,在文档中输入“本程序的位置位于:”路径。(例如我程序的路径:C:\\Program Files\\Microsoft Office\\OFFICE11) 2.为这个文档,加一个变量AA。并设变量的值为5。 变量就是:Variables 3.再添加一个内置属性。设名称为:KGS,值为0。 一点点感慨: 1.这一期迟迟不出,主要是我感到“谋事在人,成事在人”。我已经很努力在说这些我也觉得乏味的东东。在字符与数字的代码中苦苦寻找一两个同伙,苦苦等着有人能指点一下,苦苦想着大家们能“与时俱进”,可惜我几乎几失败了。我把最后的一点点希望,寄托在一批又一批的VBA爱好者们,可是每次几乎是看到了光丝,但最快就消失了。我不明白我为什么我失败?也不明白我为何这么痴 Word 文档 . 心一片? 2.很多次。我在跟一个一个会员重复地说着什么是宏?什么是VBA?然后,他会要求(在QQ中)我详细的教他,一二个小时我会教他。接着我会说:“我不可能为你一个人单独教的,你可以看交流资料系列。”大多会员都希望我能破例单独教。我想这不是不可能的,也是不现实的。望大家谅解。人心比自心,如果你是我,你能做到吗?人的时间有限的,而且我还有很多东东要学啊。 我只能说:我已经尽力了!“成与不成,学与不学”那不是我的事了。 2007年祝大家好运! 欢迎大家交流了一下这一块的学习心得,也欢迎提出你的疑问,或你的想法,如果你还什么其他的要求也可以提出来,我们一起来进行探讨、共同提高。 免责声明:如果文档有代码或内容侵犯了你的权利,请告诉我,我马上删除,这是一个非盈利的学习,任何商业行为与本学习无关。你可以复制或传播“他”的全部或部分,但请把“免责声明”也加上,(最好把我们的名字与加上)谢谢。 案例说明:有一些是本人自编的,但更多的则是来自网上网友(尤其是老大――守柔的),其中的案子,大多是随意编的,如有雷同,纯属巧合。如果你不同意你的代码出现在本学习资料中,请告诉我。谢谢各位网友,虽然你的大名不曾出现,但你的精神,我们会记住的。 关于微软:微软的帮助也有版权的,但我们是学习,应该不会有版权的事,有的话,马上删。 关于时间:主要利用周六、周日来完成学习,当然,平时要看,否则,刚看的东东又忘记了。 关于学时:用时一年,一至二周一次。(保证不低于20课) Word 文档 . 关于教材:选择微软的自带帮助做为交流学习的主要资料是基于以下几点考虑的: 7. 因为它权威性最高,通用性最好; 8. 它一般不会有版权的事,因为我们是学习他,而不是来盈利; 9. 看懂它后,大多的微软同类都是相通的,可以说“学了一个”=“学了一类”; 10. 他有很好的结构,有内涵、也有外延; 11. 如果在学习过程中我们某些人坚持不下来,但其他人仍然完全可以继续学习,不会受到影响,这也是最重要的一点。 12. 还有一点就是如果长时间不用后,大多会忘记,但帮助始终在。用时,打开帮助,你会看到很多熟练的身影,很容易又找回当初的感觉。 技术指导:守柔 技术总监:七叶一枝梅 校对、排版:youyou300 友情支持:八爪鱼 撰稿:konggs Word 文档 因篇幅问题不能全部显示,请点此查看更多更全内容