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的目录和索引。
运用Application 对象 在用户启动一个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 运用Document对象 当用户在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 方法”。
运用Range对象 当使用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对象,而在每个文档窗口中只能有一个Selection对象。 控制管理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 本例设置选中的第一节的下边距为0.5英寸。 Selection.Sections(1). PageSetup. BottomMargin = InchesToPoints(0.5) 本例设置活动文档中的文字为两倍行距(Content属性返回一个Range对象,该对象表示主文档构成部分)。 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属性和方法在范围的段落中进行循环。以下的示例说明了怎样在范围的单词中进行循环,将每个单词增大一点字号。 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",Format :=True Wend Wend Next myStoryRange
运用Selection对象 当用户使用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 可以使用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 |