专注专心
分类: IT职场
2012-01-23 10:36:56
目 录
Visual Basic支持一个对象集合,该集合中的对象直接对应于Microsoft Word 97中的元素,并且通过用户界面,用户熟悉这些元素中的绝大多数。例如,Document 对象代表了一个打开的文档,Bookmark对象代表了一个文档中的书签,而Selection对象则代表了在一个文档窗口窗格中的选定内容。在Word中,每一类元素-文档、表格、段落、书签、域等等-都可以用Visual Basic的对象来表示。要在Word中自动执行任务,可以使用这些对象的方法和属性。
关于理解和使用Microsoft Office 97对象模型的一般性内容,请参阅本书的第二章“理解对象模型”。在Microsoft Office 97中的对象模型相当丰富,其中包含了大约180个对象。要查看Word对象模型的层次关系图,请参阅“帮助”中的“Microsoft Word 对象”。要获得对某种特定对象的详细描述,可以在此图中单击该对象的名字,或是在“帮助”的索引中对特定对象进行搜索。
怎样显示Word Visual Basic帮助
要使用Word Visual Basic帮助,必须在安装过程中选择“自定义”的安装方式,并且为Word选中“Visual Basic在线帮助”复选框。否则,安装程序不会安装Visual Basic帮助。如果用户已经安装好了Word,那么可以再次运行Setup程序来安装Visual Basic帮助。
要查看Word Visual Basic 帮助,可以在“Visual Basic 编辑器里的“帮助”菜单中点击“目录和索引”一项。在“帮助主题”对话框的“目录”一表中,双击“Microsoft Word Visual Basic 参考”,然后再双击“Visual Basic 参考”。“帮助主题”对话框会重新出现,显示出Microsoft Word Visual Basic的目录和索引。
在用户启动一个Word 时段的同时,也创建了一个Application对象。用户可以使用Application 对象的属性或方法来控制或返回应用程序范围内的特性、控制应用程序窗口的外观或者调整Word 对象模型的其他方面。可以使用Application属性来返回Word Application 对象。以下的示例从视图状态切换到打印预览状态。
Application. PrintPreview = True
Application对象的一些属性控制着应用程序的外观。例如,如果DisplayStatusBar属性为True(真),那么状态栏是可见的,如果WindowState属性值为wdWindowStateMaximize,那么应用程序窗口处于最大化状态。以下的示例设置了屏幕上应用程序窗口的大小。
With Application
.WindowState = wdWindowStateNormal
.Height = 450
.Width = 600
End With
Application对象的属性也可以访问处于对象层次中较低级的对象,比如Windows集合(代表了当前所有打开的窗口)和Documents集合(代表了当前所有打开的文档)。用户可以使用属性,有时候也叫做访问者,从对象层次中最高一级的Application对象向下访问到较低级的对象(Document对象、Window对象、 Selection对象等等)。可以使用以下两个示例之一来打开MyDoc.doc。
Application. Documents. Open FileName :="C:\DOCS\MYDOC.DOC"
Documents. Open FileName :="C:\DOCS\MYDOC.DOC"
因为Document属性是共用的,所以Application属性是可选的。共用属性和方法无需Application 对象限定符。要在“对象浏览器”中浏览共用属性和方法的列表,可以在“类别”栏中单击“<共用>”。共用项就会列在“成员”栏中。
注释 Option对象包含了控制Word 共用行为的一些属性。许多Option对象的属性对应于Option对话框中的各项(Tools 菜单)。使用Application 对象的Option属性可以返回Option 对象。以下的示例设置了三个应用程序范围内的选项(因为Option属性是共用的,所以在本示例中无需Application属性)。
With Application.Options
.AllowDragAndDrop = True
.ConfirmConversions = False
.MeasurementUnit = wdPoints
End With
当用户在Word中打开或创建一个文件的同时,也创建了一个Document对象。用户可以使用Document对象或Documents集合的属性或方法来打开、创建、保存、激活或者关闭文件。
返回Document对象
用户可以使用语法Documents (index)来返回作为一个Document对象的任何打开的文档,在这里index是该文档的名字或索引号。在以下的示例中,变量myDoc包含一个Document对象,该对象代表名为“Report.doc”的打开的文档。
Set myDoc = Documents ("Report.doc")
索引号代表了文档在Documents集合中的位置。在以下的示例中,变量myDoc包含了一个Document对象,该对象代表Documents集合中的第一个文档。
Set myDoc = Documents(1)
注释 因为当用户添加或关闭多个文档时,某个特定文档的索引号会发生改变,所以最好使用文档的名字来对Documents集合中的Document对象进行索引。
除了通过文档的名字或索引号来引用文档,还可以使用ActiveDocument属性来返回一个引用活动文档(当前着眼的文档)的Document对象。以下的示例显示产活动文档的名字;如果没有打开的文档,则该示例显示一条消息。
If Documents. Count >= 1 Then
MsgBox ActiveDocument. Name
Else
MsgBox "No documents are open"
End If
打开文档
要打开一个已经存在的文档,可以使用Open方法。Open方法应用于通过Document属性返回的Documents集合。以下的示例打开了文件Test.doc(从当前文件夹)并且启动了更改跟踪。
Set myDoc = Documents. Open (FileName :="TEST.DOC")
myDoc. TrackRevisions = True
注意到在上例中Open方法的返回值是一个Document对象,该对象表示刚被打开的文档。在此示例中的文件名不包含路径;因此,是假定了该文件在当前的文件夹中。但这会导致出现一个运行时错误,因为一旦用户创建了与当前文件夹不同的文件夹,Visual Basic就再也找不到该文件了。但是,用户可以通过指明完整的路径,就如同下表所示的那样,来确保打开正确的文件。
操作系统 |
FileName参数 |
Windows |
FileName :="C:\Documents\Temporary File.doc" |
Macintosh |
FileName :="Hard Drive:Documents:Temporary File" |
如果用户的宏只用于一种文件系统,那么可以在FileName参数中指定路径分隔符(“\”或者“:”),就如同上表所示的那样。以下示例显示了与文件系统无关的代码,可以用来打开Sales.doc,并且假定Sales.doc已经保存在Word 的程序文件夹中。
programPath = Options. DefaultFilePath (wdProgramPath)
Documents. Open FileName :=programPath & Application. PathSeparator & "SALES.DOC"
PathSeparator属性返回当前文件系统(例如,“\”用于MS-DOS/Windows的文件分配表,或者“:”用于Macintosh)的正确的文件分隔符。DefaultFilePath属性返回文件的位置,比如文档所在文件夹的路径、程序文件夹或者当前文件夹。
如果所指定的文件名既没有在当前文件夹(如果没有指定路径)出现也没有在指定的文件夹(如果指定了路径)中出现,那么就会发生错误。以下的示例使用FileSearch对象的属性和方法来判断名为“Test.doc”的文件是否存在于用户的默认文档文件夹中。如果找到了该文件(FoundFiles. Count = 1),那么就打开它;否则,显示一条消息。
defaultDir = Options. DefaultFilePath (wdDocumentsPath)
With Application. FileSearch
.FileName = "Test.doc"
.LookIn = defaultDir
.Execute
If .FoundFiles. Count = 1 Then
Documents. Open FileName :=defaultDir & Application. PathSeparator & "TEST.DOC"
Else
MsgBox "Test.doc file was not found"
End If
End With
也可以允许用户选择要打开的文件,而不是定死Open方法的FileName参数值。如同以下示例所示的那样,可以使用带有wdDialogFileOpen常量的Dialogs属性来返回一个Dialog 对象,该对象表示“打开”对话框(在“文件”菜单中)。Show方法可以显示并且执行在“打开”对话框中完成的动作。
Dialogs (wdDialogFileOpen). Show
Display 方法只是用来显示特定的对话框而不作任何更多的操作。以下的示例检查Display方法的返回值。如果用户单击“确定”来关闭对话框,返回值-1并且打开所选择的文件,该文件的名字保存在变量fSelected中。
Set dlg = Dialogs (wdDialogFileOpen)
aButton = dlg. Display
fSelected = dlg. Name
If aButton = -1 Then
Documents. Open FileName :=fSelected
End If
要对如何显示Word对话框作进一步了解,请参阅“帮助”中的“显示内置Word 对话框”一节的内容。
要判断某个特殊的文档是否打开,可以使用一条For Each…Next语句来对Documents集合进行列举。如果名为“Sample.doc”的文档已经被打开了,以下的示例就激活它;如果它尚未被打开,则该示例会打开它。
docFound = True
For Each aDoc In Documents
If InStr (1, aDoc. Name, "sample.doc", 1) Then
aDoc. Activate
Exit For
Else
docFound = False
End If
Next aDoc
If docFound = False Then Documents. Open _
FileName :="C:\Documents\Sample.doc"
可以使用Count属性来确定当前打开文档的数目。Count属性应用于Documents集合,可以使用Document属性返回该集合。如果没有已打开的文档,以下的示例会显示一条消息。
If Documents. Count = 0 Then MsgBox "No documents are open"
创建和保存文档
要创建一个新文档,可以对Documents集合应用Add 方法。以下的示例创建了一个新文档。
Documents. Add
Add方法返回了仅作为一个Document对象而创建的文档。当用户添加一个文档时,可以设置Add 方法的返回值是一个对象变量,以便用户可以在自己的代码中引用该新文档。以下的示例创建了一个新文档,并且设置它的上边距为1.25英寸。
Dim myDoc As Document
Set myDoc = Documents. Add
myDoc. PageSetup. TopMargin = InchesToPoints(1.25)
第一次保存新文档时,可以随Document对象使用SaveAs方法。以下的示例将名为“Temp.doc”的活动文档保存在当前文件夹中。
ActiveDocument. SaveAs FileName :="Temp.doc"
在文档被保存之后,用户可以使用它的文档名来调整Document对象。以下的示例创建了一个新文档并且立刻把它保存为“1996 Sales.doc”。然后,该示例使用新名字来作Documents集合中的该文档的索引,并且向该文档添加一张表格。
Documents. Add.SaveAs FileName :="1996 Sales.doc"
Documents ("1996 Sales.doc").Tables.Add _
Range :=Selection. Range, NumRows :=2, NumColumns :=4
要保存对一个已经存在的文档所进行的更改,可以随同Document对象使用Save方法。以下的指令保存了名为“Sales.doc”的文档。
Documents ("Sales.doc"). Save
如果用户随同一个尚未保存的文档或模板使用Save方法,将会显示“另存为”对话框来提示用户为该文件取名。要保存所有打开的文档,可以对Documents集合应用Save方法。以下的示例保存了所有打开的文档,但没有提示用户为文件取名。
Documents. Save NoPrompt :=True
激活一个文档
要使另一个文档成为活动文档,可以对Document对象应用Activate方法。以下的示例激活了打开的文档(MyDocument.doc)。
Documents ("MyDocument.doc"). Activate
以下的示例打开了两个文档,然后激活其中的第一个文档(Sample.doc)。
Set Doc1 = Documents. Open (FileName :="C:\Documents\Sample.doc")
Set Doc2 = Documents.Open (FileName :="C:\Documents\Other.doc")
Doc1. Activate
打印一个文档
要打印一个文档,可以对Document对象应用PrintOut 方法,如以下示例所示。
ActiveDocument. PrintOut
要通过程序来设置那些也可以在“打印”对话框(在“文件”菜单中)里进行设置的打印选项,可以使用PrintOut 方法的参数来实现。用户可以使用Options 对象的属性来设置打印选项,这些选项也可以在“选项”对话框(在“工具”菜单中)“打印”一表里进行设置。以下示例设置活动文档打印隐藏的文字,并且只打印出前三页。
Options. PrintHiddenText = True
ActiveDocument. PrintOut Range :=wdPrintFromTo, From :="1", To :="3"
关闭文档
要关闭一个文档,可以对Document对象应用Close方法。以下的示例关闭了名为“Sales.doc”的文档。
Documents ("Sales.doc"). Close
如果对文档进行过修改,Word会显示出一条消息来询问用户是否要保存所进行的修改。用户可以随SaveChanges参数使用wdDoNotSaveChanges或 wdSaveChanges常量来使该提示不再出现。以下的示例保存并且关闭了Sales.doc。
Documents ("Sales.doc"). Close SaveChanges :=wdSaveChanges
要关闭所有已打开的文档,可以对Documents集合应用Close方法。以下的示例没有保存修改就关闭了所有的文档。
Documents. Close SaveChanges :=wdDoNotSaveChanges
访问文档中的对象
用户可以从Document对象来访问返回对象的一系列属性和方法。要查看在Document对象中所能使用的对象的层次关系图,可以参阅“帮助”中的“Microsoft Word对象(Documents)”。例如,Table属性,它能够返回一个Table对象的集合,可以在Document对象中使用。随着一个集合对象使用的Count属性能够判断在该集合中所包含的项数。以下的示例显示一条消息来指出在活动文档中有多少表格。
MsgBox ActiveDocument. Tables. Count & " table(s) in this document"
使用Table(index)可以返回一个单张表格对象,这里的index是索引号。在以下的示例中,myTable代表“Sales.doc”文档里的第一张表格。
Set myTable = Documents ("Sales.doc"). Tables(1)
关于返回一个特殊对象的信息可以从“帮助”中的对象主题本身 (例如,“Table 对象”)和相应的集合对象主题(例如,“Table集合对象”)中获得。
向文档添加对象
可以使用随着能在Document对象中访问的集合对象的Add方法来向文档添加诸如脚注、备注或表格这样的对象。例如,以下命令在myRange变量(myRange是一个包含了一个Range对象的对象变量)所指定的位置上添加了一张3x3的表格。
ActiveDocument. Tables. Add Range :=myRange, NumRows :=3, NumColumns :=3
以下的示例在myRange变量所指定的位置上添加了一个脚注。
ActiveDocument. Footnotes. Add Range :=myRange, Text :="The Willow Tree"A
要获得支持Add方法的集合对象列表,请参阅“帮助”中的“Add 方法”。
当使用Visual Basic时一个常见的任务就是在文档中指定一块区域,然后对它进行处理,比如插入文字或应用格式等。例如,用户可能想编写一个宏,来对文档中某个部分里的某个单词或短语进行定位。那就可以使用一个Range对象来表示想在其中搜索特定单词或短语的部分文档。在确定Range对象后,用户能够应用该对象的方法和属性来修改相应范围中的内容。
一个Range对象代表了文档中的一块连续的区域。每一个Range对象都由一个起始字符位置和一个终止字符位置来定义。与用户在文档中使用书签的方法类似,可以在Visual Basic中使用Range对象来识别一个文档的特定部分。一个Range对象既可以和插入点一样小,也可以和整个文档一样大。但是,与书签不同,Range对象仅仅在定义它的过程正在运行时才存在。
Range对象同选定内容相互独立;也就是说,可以定义和修改范围而不会改变选定内容。用户也可以在文档中定义多个范围,而此时每个文档窗格中仅有一个选定内容。
Start、End和StoryType属性唯一地确定了一个Range对象。Start和End属性分别返回或者设置Range对象的起始和结束字符的位置。每个文档构成部分起始处的字符位置是0 (zero),而第一个字符之后的位置是1,依此类推。StoryType 属性的WdStoryType常量可以表示十一种不同的文档构成部分类型。例如,如果在注脚区域中有一个Range对象,那么StoryType属性返回wdFootnotesStory。要对文档构成部分作进一步了解,请参阅本节后面的“运用文档构成部分”一节的有关内容。
使用Range对象来代替Selection对象
宏录制器会经常创建一个使用Selection属性来控制操纵Selection对象的宏。但是,用户通常可以用一个或几个Range对象来以很少的命令完成相同的任务。以下的示例是用宏录制器创建的。该宏对文档中的前两个单词进行加粗。
Selection. HomeKey Unit :=wdStory
Selection. MoveRight Unit :=wdWord, Count:=2, Extend :=wdExtend
Selection. Font.Bold = wdToggle
以下的示例没有使用Selection对象而完成了相同的任务。
ActiveDocument. Range (Start:=0, End :=ActiveDocument. Words(2). End) .Bold = True
以下的示例对文档中的前两个单词进行加粗,然后插入一个新的段落。
Selection. HomeKey Unit :=wdStory
Selection. MoveRight Unit :=wdWord, Count :=2, Extend :=wdExtend
Selection. Font.Bold = wdToggle
Selection. MoveRight Unit :=wdCharacter, Count:=1
Selection. TypeParagraph
以下的示例没有使用Selection对象就完成了上述示例中的同样任务。
Set myRange = ActiveDocument. Range(Start:=0, End :=ActiveDocument. Words(2). End)
myRange. Bold = True
myRange. InsertParagraphAfter
前面的两个示例改变了活动文档中的格式但没有改变选定内容。在大多数的场合下,Range对象比Selection对象更可取,原因如下:
使用Range方法返回Range对象
可以使用Range方法在特定文档中创建一个Range对象。Range方法(可以从Document对象使用)返回一个Range对象,该对象定位于主文档构成部分中,有给定的起始点和结束点。以下示例创建了一个Range对象,并且赋给myRange变量。
Set myRange = ActiveDocument. Range (Start :=0, End :=10)
在上述示例中,myRange表示活动文档中的前十个字符。当对保存在myRange变量中的Range对象应用一种属性或方法时,就可以看到已经创建的Range对象。以下的示例对活动文档中的前十个字符进行加粗。
Set myRange = ActiveDocument. Range(Start :=0, End :=10)
myRange. Bold = True
当用户需要对一个Range对象进行多次引用时,可以使用Set语句来设置一个等价于Range对象的变量。但是,如果用户需要在一个对象上执行一次操作,那么就没有必要将对象保存到变量中。用户可以使用一条确定范围并且改变Bold属性的命令来取得同样的结果;如以下示例所示。
ActiveDocument. Range(Start :=0, End :=10). Bold = True
和书签类似,一个范围能够在文档中横跨一组字符,也可以标记其中的一个位置。在以下的示例中,Range对象的起始和终止点相同,并且该范围内不包含任何文字。该示例在活动文档的起始处插入文字。
ActiveDocument. Range(Start :=0, End :=0). InsertBefore Text :="Hello "
用户可以通过使用如上述示例所示的字符位置数字,或者随同Selection对象、Bookmark对象或Range对象使用Start属性和End属性,来定义一个范围的起始和终止位置。以下示例创建了一个Range对象,来表示活动文档中的第三和第四个句子。
Set myDoc = ActiveDocument
Set myRange = myDoc. Range (Start :=myDoc. Sentences(3). Start, _
End :=myDoc. Sentences (4). End)
技巧 Range对象在文档中的表示不可见。但是,用户可以使用Select方法来选定一个Range对象,以保证Range对象表示正确的文字范围。在以下示例中的Range对象表示活动文档中的前三个段落。在该宏运行完毕之后,选定内容是指包含在aRange变量中的文字范围。
Set aRange = ActiveDocument.Range (Start :=0, _
End :=ActiveDocument. Paragraphs (3). Range. End)
aRange. Select
使用Range属性来返回一个Range对象
在许多对象都可以使用Range属性-例如,Paragraph对象、Bookmark对象、Endnote对象以及Cell对象-Range属性用来返回一个Range对象。以下的示例返回了一个Range对象,该对象表示活动文档的第一段。
Set myRange = ActiveDocument.Paragraphs (1). Range
在创建了对Range对象的引用之后,用户可以使用它的任何属性或方法来修改该范围。以下的示例复制了活动文档中的第一段。
Set myRange = ActiveDocument. Paragraphs (1). Range
myRange. Copy
以下的示例复制了活动文档中表格一的第一行。
ActiveDocument. Tables(1). Rows(1). Range. Copy
以下的示例显示了活动文档中由第一个书签标记的文字。Range属性可以在Bookmark对象中使用。
MsgBox ActiveDocument. Bookmarks (1). Range. Text
如果用户需要对同一个Range对象应用多种属性或方法,那么可以使用With…End With语句。以下的示例为活动文档的第一段设定了文字的格式。
Set myRange = ActiveDocument. Paragraphs (1). Range
With myRange
.Bold = True
.ParagraphFormat. Alignment = wdAlignParagraphCenter
.Font. Name = "Arial"
End With
要获得关于返回Range对象的其他示例,请参阅“帮助”中的“Range属性”。
修改文档的一部分
Visual Basic包含了一些对象,可以使用它们来修改以下类型的文档元素:字符、单词、句子、段落以及节。下面的表格包含了对应于这些文档元素的属性和属性所返回的对象。
表 达 式 |
返 回 的 对 象 |
Word (index) |
Range对象 |
Characters (index) |
Range对象 |
Sentences (index) |
Range对象 |
Paragraphs (index) |
Paragraph对象 |
Sections (index) |
Section对象 |
当用户不带index来使用这些属性时,就返回一个同名的集合-例如,Paragraphs属性返回Paragraphs集合。但是,如果用户使用index来确定在某个集合中的一项,就返回上述表格第二列中的对象-例如,Words(1)返回一个Range对象。用户可以使用任何范围属性或方法来修改Range对象,如以下示例所示,该示例将选定内容中的第一个单词复制到剪贴板中。
Selection. Words (1). Copy
在Paragraphs集合以及Sections集合中的集合项分别是Paragraph对象和Section对象,而不是Range对象。但是,在Paragraph对象和Section对象中都可以使用Range属性(它返回一个Range对象)。以下的示例将获得文档中的第一段复制到剪贴板中。
ActiveDocument. Paragraphs(1). Range. Copy
上述表格中所有的文档元素属性都可以在Document对象、Selection对象以及Range对象中使用,如以下三个示例所示。
ActiveDocument. Words(1). Case = wdUpperCase
Selection.Sections(1). PageSetup. BottomMargin = InchesToPoints(0.5)
ActiveDocument. Content. ParagraphFormat. Space2
修改一组文档元素
要修改由一组文本元素(字符、单词、句子、段落或节)构成的范围,可以创建一个包含文档元素的Range对象。随同Range对象使用Start和End属性,用户可以新建一个Range对象,该对象引用了一组文档元素。以下的示例创建了一个Range对象(myRange),该对象引用了活动文档中的前三个单词,然后将这些单词的字体改为Arial。
Set Doc = ActiveDocument
Set myRange = Doc.Range (Start :=Doc. Words(1). Start, End :=Doc. Words(3). End)
myRange. Font. Name = "Arial"
以下的示例创建了一个Range对象,该对象起始于第二段的开头,到第四段之后结束。
Set myDoc = ActiveDocument
Set myRange = myDoc. Range (Start :=myDoc. Paragraphs(2). Range. Start, _
End :=myDoc. Paragraphs(4). Range. End)
以下的示例创建了一个Range对象(aRange),该对象起始于第二段的开头,到第三段之后结束。ParagraphFormat属性用来访问诸如SpaceBefore和SpaceAfter这样的设置段落格式的属性。
Set Doc = ActiveDocument
Set aRange = Doc. Range (Start :=Doc. Paragraphs(2). Range. Start, _
End :=Doc. Paragraphs(3). Range. End)
With aRange. ParagraphFormat
.Space1
.SpaceAfter = 6
.SpaceBefore = 6
End With
返回或设置范围中的文字
可以使用Text属性来返回或设置一个Range对象中的内容。以下的示例返回了活动文档中的第一个单词。
strText = ActiveDocument. Words(1). Text
以下示例将活动文档中的第一个单词改为“Hello”。
ActiveDocument. Words(1). Text = "Hello"
可以使用InsertAfter 方法或者InsertBefore方法在一个范围的前面或后面插入文字。以下的示例在活动文档的第二段之前插入文字。
ActiveDocument. Paragraphs(2). Range. InsertBefore Text :="In the beginning "
在使用InsertAfter 方法或者InsertBefore方法之后,范围随之扩大,包含新的文字。但是,也可以使用Collapse方法将范围折叠到起始位置或终止位置。以下的示例在现有文档之前插入单词“Hello”,然后将范围折叠到它的起始位置(在单词“Hello”之前)。
With ActiveDocument.Paragraphs(2).Range
.InsertBefore Text:="Hello "
.Collapse Direction:=wdCollapseStart
End With
设置范围中文字的格式
可以使用Font属性来取得设置字符格式的属性和方法,而使用ParagraphFormat属性来取得设置段落格式的属性和方法。以下的示例设置了活动文档中第一段的字符格式和段落格式。
With ActiveDocument. Paragraphs(1). Range. Font
.Name = "Times New Roman"
.Size = 14
.AllCaps = True
End With
With ActiveDocument. Paragraphs(1). Range. ParagraphFormat
.LeftIndent = InchesToPoints(0.5)
.Space1
End With
重新定义Range对象
可以使用SetRange方法来重新定义一个已经存在的Range对象。以下的示例定义myRange为当前的选定内容。SetRange方法重新定义myRange,使它表示当前的选定内容加上随后的十个字符。
Set myRange = Selection. Range
myRange. SetRange Start :=myRange. Start, End :=myRange. End + 10
要获得重新定义Range对象的其他信息和示例,请参阅“帮助”中“SetRange方法”。
用户也可以通过改变Start属性和End属性的值,或者使用MoveStart方法或MoveEnd方法来重新定义一个Range对象。以下的示例重新定义myRange对象,使它表示当前的选定内容加上随后的十个字符。
Set myRange = Selection. Range
myRange. End = myRange. End + 10
以下的示例使用MoveEnd方法扩展了myRange,使它包含下一段。
Set myRange = ActiveDocument. Paragraphs(2)
myRange. MoveEnd Unit :=wdParagraph, Count :=1
在范围内的段落中循环
可以通过几种不同的方法在范围内的段落中进行循环。本节包含使用For Each...Next语句和Next属性及方法在范围内的段落中进行循环的内容。也可以使用同样的技术在范围内的字符、单词或句子中进行循环。
使用For Each...Next语句
建议在范围内进行段落循环时使用For Each...Next语句,另外建议在集合内进行循环时也同样使用该语句。以下的示例在获得文档的前五段中进行循环,在每段之前添加文字。
Set myDoc = ActiveDocument
Set myRange = myDoc.Range (Start:=myDoc. Paragraphs(1). Range. Start, _
End :=myDoc. Paragraphs(5). Range. End)
For Each para In myRange. Paragraphs
para.Range. InsertBefore "Question:" & vbTab
Next para
假定用户想修改上述的代码,在范围内对用户选定的段落进行循环。可以使用Selection属性来表示选定内容中的各个段落。以下的示例在选定内容的段落中进行循环,去除加粗格式。
For Each para In Selection. Paragraphs
para.Range. Bold = False
Next para
使用Next属性或方法
用户也可以使用Next属性和方法在范围的段落中进行循环。以下的示例说明了怎样在范围的单词中进行循环,将每个单词增大一点字号。
Set myRange = ActiveDocument.Words(1)
For i = 1 To 5
myRange. Font. Size = myRange. Font. Size + i
Set myRange = myRange. Next(Unit :=wdWord, Count :=1)
Next i
以下的示例在范围的段落中进行循环,将范围的对齐方式由居中改为左对齐。该示例也使用Next属性重新定义了myRange,使它表示下一段。
Set myRange = ActiveDocument. Paragraphs(1). Range
For i = 1 To 5
If myRange. Paragraphs(1). Alignment = wdAlignParagraphCenter Then
myRange. Paragraphs(1). Alignment = wdAlignParagraphLeft
End If
Set myRange = myRange. Paragraphs(1). Next. Range
Next i
将Range对象赋值给变量
可以通过几种途径来把一个已经存在的Range对象赋给一个变量。在以下示例中,变量Range1和变量Range2都表示Range对象。在该示例中命令把活动文档中第一和第二个单词分别赋值给变量Range1和Range2。
Set Range1 = ActiveDocument. Words(1)
Set Range2 = ActiveDocument. Words(2)
设置一个Range对象变量等价于另一个Range对象变量
以下的示例创建变量Range2,并且与Range1相同。
Set Range2 = Range1
现在就有两个变量表示着同样的范围。当用户调整Range2的起始位置、终止位置或者文字时,所做的更改也同样会影响到Range1,反之亦然。
以下的示例将Range1默认属性 (Text属性)的值赋给Range2的默认属性。在此示例中的代码等价于Range2. Text = Range1. Text,它没有改变Range对象实际所表示的内容,它仅仅改变Range2的contents (text)。
Range2 = Range1
这两个范围(Range2和Range1)包含有相同的内容,但是它们可能指向文档中的不同位置,或者干脆是不同的文档。
使用Duplicate属性
以下的示例创建了一个新复制的Range对象,Range2,该对象有着和Range1一样的起始位置、终止位置以及文字内容。
Set Range2 = Range1. Duplicate
如果改变了Range1的起始位置或是终止位置,这种改变并不会影响到Range2,反之亦然。但是,因为这两个范围指向文档的相同位置,改变一个范围中的文字内容也会同时改变另一个范围的文字内容。
运用文档构成部分
一个文档构成部分是文档中的一个区域,该区域中的文字区别于文档中的其他区域。例如,如果一个文档包含了正文文字、脚注和页眉,则该文档就包含了文档正文部分、脚注部分和页眉部分。
可以使用StoryType属性来返回指定范围、选定内容或书签的文档构成部分。如果在脚注部分中包含了选定内容,那么下例将关闭活动窗口中的脚注窗格。
ActiveWindow. View. Type = wdNormalView
If Selection. StoryType = wdFootnotesStory Then ActiveWindow. ActivePane. Close
StoryRanges集合包含了一个文档中每种有效的文档构成部分类型的第一个过程部分范围。可以使用NextStoryRange方法来返回以后的文档构成部分。以下的示例搜索活动文档中的每个文档过程部分来找出文字“Microsoft Word”。该示例也将它每次找到的文字全部设置为斜体。
For Each myStoryRange In ActiveDocument. StoryRanges
myStoryRange. Find. Execute FindText :="Microsoft Word", Forward :=True
While myStoryRange. Find. Found
myStoryRange. Italic = True
myStoryRange. Find.Execute FindText :="Microsoft Word", _
Forward :=True, Format :=True
Wend
While Not (myStoryRange. NextStoryRange Is Nothing)
Set myStoryRange = myStoryRange. NextStoryRange
myStoryRange. Find.Execute FindText :="Microsoft Word", Forward :=True
While myStoryRange. Find. Found
myStoryRange. Italic = True
myStoryRange. Find.Execute FindText :="Microsoft Word", _
Forward :=True, Format :=True
Wend
Wend
Next myStoryRange
当用户使用Word中的某个文档时,通常会先选择文字,然后再执行一项操作,比如设定以有文字的格式,或是键入新文字。在Visual Basic中,通常没有必要在修改文字之前先选定该文字;而是创建一个表示文档特定部分的Range对象并对其进行操作。但是,当用户想要自己的代码对选定内容作出响应或是改变选定内容,就可以通过Selection对象来完成任务。
可以使用Selection属性来返回Selection对象。在文档窗口的每个窗格中只能有一个Selection对象,在任何时刻,也只能有一个活动的Selection对象。选定内容可以包含文档的一块区域,也可以被折叠到一个插入点。以下的示例改变了选定内容中各个段的段落格式。
Selection. Paragraphs. SpaceBefore = InchesToPoints (0.25)
Selection属性可以在Application对象、Window对象和Pane对象中使用。如果随同Application对象使用Selection属性,则该Selection对象表示活动的选定内容。
Selection. InsertAfter Text :="Next Text"
也可以随同一个Window对象或Pane对象使用Selection属性来返回一个在特定窗口或窗口窗格中Selection对象。以下的示例随同Window对象使用Selection属性,在文档窗口“Document2”中插入文字。
Windows ("Document2"). Selection.InsertAfter Text :="New Text"
以下的示例随同Pane对象使用Selection属性,在主页眉窗格中插入文字。
With ActiveWindow
.View. Type = wdPageView
.View. SeekView = wdSeekPrimaryHeader
.ActivePane. Selection. InsertAfter Text :="Header"
End With
在使用InsertAfter方法或InsertBefore方法之后,选定内容随之扩大,包括了新的文字。但是,用户也可以使用Collapse方法将选定内容折叠到它的起始或终止位置。以下的示例在选定内容的文字之后插入单词“Hello”,任何将选定内容折叠到单词“Hello”之后的插入点。
Selection. InsertAfter Text :="Hello"
Selection. Collapse Direction :=wdCollapseEnd
移动和扩展选定内容
用户可以通过几种方法来移动或扩展由Selection对象所表示的选定内容(例如,Move和MoveEnd)。以下的示例将选定内容移动到下一段的开头。
Selection. MoveDown Unit :=wdParagraph, Count :=1, Extend :=wdMove
用户也可以通过改变Selection对象的Start属性及End属性的值,或者通过MoveStart和MoveEnd方法来移动或扩展选定内容。以下的示例通过把终止位置移动到段尾来对选定内容进行扩展。
Selection. MoveEnd Unit :=wdParagraph, Count :=1
因为在一个文档窗口或窗格中只能有一个选定内容,用户也可以通过选定另一个对象来移动选定内容。可以使用Select方法,选择文档的一项。在使用Select方法之后,就可以使用Selection属性返回一个Selection对象。以下的示例选定了活动文档中的第一个单词,然后把该单词变为“Hello”。
ActiveDocument. Words(1). Select
Selection. Text = "Hello "
用户也可以通过GoToNext方法、GoToPrevious方法或GoTo方法来移动选定内容。以下的示例将选定内容移动到文档中的第四行。
Selection. GoTo What :=wdGoToLine, Which :=wdGoToAbsolute, Count :=4
以下的示例将选定内容恰好移动到活动文档中的下一个域之前。
Selection. GoToNext What :=wdGoToField
在Selection对象使用的对象
可以在Range对象和Document对象中使用的许多其他对象也能在Selection对象中使用,这使得用户可以在一个选定内容中控制操纵对象。要获得能在Selection对象使用的对象的完整列表,请参阅“帮助”中的“Microsoft Word 对象(Selection)”,或者“Selection对象”。
以下的示例更新了选定内容中各个域的结果。
If Selection. Fields. Count >= 1 Then Selection. Fields. Update
以下的示例将一节中的各个段落缩进了0.5英寸。
Selection. Paragraphs. LeftIndent = InchesToPoints (0.5)
用户可以使用For Each...Next语句在选定内容中的单个对象上进行循环操作,来代替对选定内容中的所有对象逐个进行控制操纵。以下的示例在选定内容的每个段落上进行循环操作,将找到的任何居中的段落变为左对齐。
For Each para In Selection. Paragraphs
If para. Alignment = wdAlignParagraphCenter Then para. Alignment = _
wdAlignParagraphLeft
Next para
以下的示例显示出选定内容中每个书签的名字。
For Each aBook In Selection. Bookmarks
MsgBox aBook. Name
Next aBook
Selection对象的属性和方法
本节突出介绍Selection对象的一些常用属性和方法。
返回或设置选定内容中的文字
可以使用Text属性来返回或设置一个Selection对象的内容。以下的示例返回所选的文字。
strText = Selection. Text
以下的示例将所选文字改为“Hello World”。
Selection. Text = "Hello World"
可以InsertBefore 方法或InsertBefore方法,在选定内容之前或之后插入文字。以下的示例在选定内容之前插入了文字。
Selection. InsertBefore Text :="And furthermore "
为许多文字设定格式
可以使用Font属性来访问设置字符格式的属性和方法,也可以使用ParagraphFormat属性来访问设置段落格式的属性和方法。以下的示例设置了选定内容的字符和段落格式。
With Selection. Font
.Name = "Times New Roman"
.Size = 14
End With
Selection. ParagraphFormat. LeftIndent = InchesToPoints (0.5)
返回一个Range对象
如果一种方法或属性是在Range对象而不是Selection对象中使用的(例如,CheckSpelling方法),那么可以使用Range属性来从Selection对象返回一个Range对象。以下的示例对所选单词进行拼写检查。
Selection. Range. CheckSpelling
返回关于选定内容的信息
可以使用Information属性来返回关于选定内容的信息。例如,用户可以判断当前页的页码、文档的总页数,或是判断选定内容是否在一个页眉或注脚中。Information属性可取三十五种不同的常量(wdActiveEndPageNumber, wdNumberOfPagesInDocument 和 wdInHeaderFooter等等),用户可以使用它们来返回关于选定内容的不同信息。举个例子,如果选定内容处于一张表格中,那么以下的示例将显示表格中的行号或列号。
If Selection. Information (wdWithInTable) = True Then
MsgBox "Columns = " & Selection. Information (wdMaximumNumberOfColumns) _
& vbCr & "Rows = " & Selection. Information (wdMaximumNumberOfRows)
End If
要获得可以随Information属性一起使用的常量的完整列表和说明,请参阅“帮助”中的“Information属性”。
判断文字是否被选定
可以使用Type属性来设置或返回选定内容在文档中被指定的方式。例如,可以使用wdSelectionBlock常量来判断一个文字块是否被选定。如果选定内容是一个插入点,那么以下的示例选定包含该插入点的段落。
If Selection. Type = wdSelectionIP Then
Selection. Paragraphs(1). Range. Select
End If
可以使用Find和Replacement对象来查找并且替换文档中文字的特定范围。Find对象可以在Selection对象或Range对象中使用(根据Find对象是从Selection对象还是从Range对象返回的,查找操作也略有不同)。
使用Selection.Find
如果是在Selection对象中使用Find对象,那么当找到符合选择条件的文本后选定内容将会改变。以下的示例选定下一次出现的单词“Hello”。如果在找到单词“Hello”之前已经到达了文档的末尾,那么停止搜索。
With Selection. Find
.Forward = True
.Wrap = wdFindStop
.Text = "Hello"
.Execute
End With
Find对象包含与“查找”和“替换”对话框(在“编辑”菜单中)里的选项有关的属性。用户既可对Find对象的属性逐一进行设置,也可以随同Execute方法使用参数来进行设置,如果以下示例所示。
Selection. Find. Execute FindText :="Hello", Forward :=True, Wrap :=wdFindStop
使用Range.Find
如果是在Range对象中使用Find对象,选定内容不会改变,但是当找到符合选择条件的文本时范围会被重新定义。以下的示例确定活动文档中第一次出现的单词“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", Forward :=True
If myRange. Find. Found = True Then myRange. Bold = True
使用Replacement对象
Replacement对象表示查找-替换操作的替换条件。Replacement对象的属性和方法对应于“查找”和“替换”对话框(在“编辑”菜单中)里的选项。
可以在Find对象中使用Replacement对象。以下的示例将所有出现单词“hi”的地方替换为“hello”。当找到符合选择条件的文本时,选定内容将会改变,因为代码从Selection对象返回Find对象。
With Selection. Find
.ClearFormatting
.Text = "hi"
.Replacement. ClearFormatting
.Replacement. Text = "hello"
.Execute Replace :=wdReplaceAll, Forward :=True, Wrap :=wdFindContinue
End With
以下的示例去除了活动文档中所有的粗体格式。Bold属性对Find对象为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 :="", ReplaceWith :="", Format :=True, Replace :=wdReplaceAll
End With
Word对象模型包含了表格对象,也包含了表格中各种不同元素的对象。可以随同Document对象、Range对象、Selection对象使用Table属性来返回Table集合。Table(index)返回了一个单独的Table对象,在这里index是表格的索引号。索引号代表在选定内容、范围或文档中表格的位置。以下的示例将选定内容中的第一个表格转换为文本。
If Selection. Tables. Count >= 1 Then
Selection. Tables(1). ConvertToText Separator :=wdSeparateByTabs
End If
可以随同Column对象、 Range 对象、Row对象或 Selection对象使用Cells属性来返回Cells集合。用户可以通过使用Table对象的Cell方法或是索引Cells集合来获得一个Cell对象。以下的两条语句都能够设置myCell为一个Cell 对象,该Cell对象代表活动文档中表格一的第一个单元格。
Set myCell = ActiveDocument. Tables(1). Cell(Row :=1, Column :=1)
Set myCell = ActiveDocument. Tables(1). Columns(1). Cells(1)
注释 要在一个表格的一个单元格中插入文字,可以使用Text属性、InsertAfter方法或者随Range对象使用InsertBefore方法。可以随Cell对象使用Range属性来返回一个Range对象。以下的示例在表格一的每一个单元格中插入连续的单元格序号。
i = 1
For Each c In ActiveDocument. Tables(1). Range. Cells
c. Range. InsertBefore Text :="Cell " & i
i = i + 1
Next c
可以随同Table对象、Range对象或Selection对象使用Column属性来返回Columns集合。Columns(index)返回了一个单独的Column对象,在这里index是索引号。以下的示例选择了表格一的第一列。
ActiveDocument. Tables(1). Columns(1). Select
可以随同Table对象、Range对象或Selection对象使用Row属性来返回Rows集合。Rows(index)返回了一个单独的Row对象,在这里index是索引号。以下的示例给表格一的第一行加底纹。
ActiveDocument. Tables(1). Rows(1). Shading. Texture = wdTexture10Percent
修改图形表格的行与列
当用户试图使用在一个图形表格(或者任何表格,其中有两个以上相邻的单元格被合并,但是行与列没有统一)中某一单独的行或列时,就可能出现一个运行时错误。如果活动文档中的第一个表格的每列含有不一致的行号,以下的示例就会出错。
ActiveDocument. Tables(1). Rows(1). Borders.Enable = False
用户可以首先使用SelectColumn或SelectRow方法来选定某个特定行或列的单元格,以此避免这样的错误。当用户选好了行或列,再随Selection对象使用Cells属性。以下的示例选定了活动文档中表格一的第一行。该示例使用Cells属性返回所选的单元格(在第一行中所有单元格),以便可以删除边框。
If ActiveDocument. Tables(1). Uniform = False
ActiveDocument. Tables(1). Cell(1, 1). Select
With Selection
.SelectRow
.Cells. Borders. Enable = False
End With
End If
以下的示例选定了表格一的第一列。该示例使用了一个For Each...Next循环来向选定内容(第一列的所有单元格)中的每个单元格添加文字。
If ActiveDocument. Tables(1). Uniform = False
ActiveDocument. Tables(1). Cell(1, 1). Select
Selection. SelectColumn
i = 1
For Each oCell In Selection. Cells
oCell.Range. Text = "Cell " & i
i = i + 1
Next oCell
End If
本节提供了关于运用一些普通Word对象的信息和技巧。
使用HeaderFooter对象
HeaderFooter对象既可以表示一个页眉也可以表示一个注脚。HeaderFooter对象是HeaderFooter集合的一个成员,它可以在Section对象中使用。Headers(index)或Footer(index)属性返回了一个单独的HeaderFooter对象,在这里index是WdHeaderFooterIndex常量的一个值。
以下的示例创建了一个Range对象(aRange),该对象表示活动文档第一节的主要注脚。在该示例设置Range对象之后,它删除了已有的注脚文本。它还向注脚添加了AUTHOR域以及两个表和FILENAME域。
Set oRange = ActiveDocument. Sections(1). Footers (wdHeaderFooterPrimary). Range
With oRange
.Delete
.Fields. Add Range :=oRange, Type :=wdFieldFileName, Text :="\p"
.InsertAfter Text :=vbTab
.InsertAfter Text :=vbTab
.Collapse Direction :=wdCollapseStart
.Fields.Add Range :=oRange, Type :=wdFieldAuthor
End With
注释 PageNumbers集合仅仅能在HeaderFooter对象中使用。可以对PageNumbers集合应用Add方法来向一个页眉或注脚添加页码。
使用Styles集合
Styles集合可以在Document对象中使用。以下的示例改变了活动文档中“标题1”样式的格式。
ActiveDocument. Styles (wdStyleHeading1). Font. Name = "Arial"
Styles集合不能在Template对象中使用。如果想修改一个模板中的样式,可以使用OpenAsDocument方法按文档来打开模板,这样用户就可以对样式进行修改。以下的示例改变了活动文档所附的模板中“标题1”样式的格式。
Set aDoc = ActiveDocument. AttachedTemplate. OpenAsDocument
With aDoc
.Styles(wdStyleHeading1). Font. Name = "Arial"
.Close SaveChanges :=wdSaveChanges
End With
指定CommandBars
在使用CommandBars集合(表示菜单栏和工具栏)之前,可以使用CustomizationContext属性来设置保存着对菜单栏和工具栏的更改的Template或Document对象。以下的示例给“格式”工具栏添加了“双下划线”命令。因为自定义更改保存在Normal模板中,所有的文档都会受到影响。
CustomizationContext = NormalTemplate
CommandBars ("Formatting"). Controls. Add Type :=msoControlButton, _
ID :=60, Before :=7
要了解关于菜单栏和工具栏的更改范围的更多信息,请参阅第八章,“菜单栏和工具栏”。
使用Dialogs集合
可以使用Dialogs属性返回Dialogs集合,该集合表示内置Word对话框(例如,“打开”和“保存”对话框等)。用户不能新建内置对话框,也不能向Dialogs集合添加内置对话框。要了解关于创建用ActiveX控件创建自定义对话框的内容,请参阅第十二章,“ActiveX 控件和对话框”。
返回MailMerge和MailMerge对象
可以使用Document对象的MailMerge属性来返回一个MailMerge对象。无论所指定的文档是否是一个邮件合并文档,都可以使用MailMerge属性。在用户使用Execute方法执行合并之前,可以使用State属性来确定邮件合并操作的状态。如果活动文档是附加了数据源的主文档,那么以下的示例将执行邮件合并。
Set myMerge = ActiveDocument.MailMerge
If myMerge. State = wdMainAndDataSource Then myMerge. Execute
使用Document对象的Envelope属性可以返回一个Envelope对象。无论用户是否向所指定的文档添加了一个信封,都可以使用Envelope对象。但是,如果用户使用以下属性而没有向文档添加信封,那么会出现错误:Address属性, AddressFromLeft属性, AddressFromTop属性,FeedSource属性, ReturnAddress属性,ReturnAddressFromLeft属性, ReturnAddressFromTop属性或 UpdateDocument属性。
以下的示例使用On Error GoTo语句来捕获用户没有向活动文档添加信封的错误。但是,如果用户已经向文档添加了信封,将显示收件人地址。
On Error GoTo ErrorHandler
MsgBox ActiveDocument. Envelope. Address
ErrorHandler:
If Err = 5852 Then MsgBox "Envelope is not in the specified document"
在文档中添加和编辑域
用户可以通过对Field集合应用Add方法来给文档添加域。以下的示例添加了一个DATE域来替换选定内容。
ActiveDocument. Fields. Add Range:=Selection. Range, Type :=wdFieldDate
在添加一个域之后,用户可以通过使用Result或Code属性来返回或设置域结果和域代码,这两种属性都可以返回一个Range对象。以下的示例更改选定内容的第一个域代码,更新该域,然后显示域结果。
If Selection. Fields. Count >= 1 Then
With Selection. Fields (1)
.Code. Text = "CREATEDATE \*MERGEFORMAT"
.Update
MsgBox . Result. Text
End With
End If
InlineShape对象同Shape对象的对比
一个Shape对象代表图形层的一个对象,诸如自选图形、任意多边形、OLE对象、ActiveX控件、图片等。Shape对象锁定于文本范围内,但是能够任意移动,使用户可以将它们定位于页面的任何位置。要了解运用Shape对象的信息,请参阅第十章,“形状和图形层”,也可以参阅“帮助”中的“Shape对象”。
一个InlineShape对象代表文档文字层的一个对象。一个嵌入式形状可能是图片、OLE对象或ActiveX控件。可以将InlineShape对象视为字符,并将其象字符一样放在一行文本中。要了解关于InlineShape对象的信息,请参阅“帮助”中的“InlineShape集合对象”或“InlineShape对象”。
在Word窗体中使用FormField对象
用户可以创建一个Word在线窗体,该窗体包含复选框、文本文本框和下拉式列表框。使用“窗体”工具栏可以插入这些窗体元素。对应的Visual Basic对象是CheckBox, TextInput, 和DropDown。所有这些对象都可以在FormFields集合的任何一个FormField对象中使用;但是,用户应当使用按照窗体域的类型使用相应的对象。例如,以下命令从活动文档的“Check1”域中选择复选框。
ActiveDocument. FormFields ("Check1").CheckBox. Value = True
除了“窗体”工具栏中的窗体元素之外,用户还可以向一个在线窗体添加ActiveX控件。使用“控件工具箱”可以插入ActiveX控件。用户可以把控件插入文字层或图形层;控件将分别由一个InlineShape 对象或一个Shape对象来表示。要了解关于运用ActiveX控件的更多内容,请参阅第十二章,“ActiveX控件和对话框”。
可以通过在用户代码中包含判断语句来判断由一个表达式返回的特定对象或者一个变量所引用的对象是否有效,以此避免代码在运行时的错误。本节讨论了一些检查表达式返回值或变量保存值有效性的技术。
用户可以随同一个变量或表达式使用TypeName函数来确定对象的类型。如果Selection. NextField返回了一个Field对象,那么以下的示例将在状态栏中显示一条消息。