分享

Word VBA参考教程(摘录)

 王咸美 2013-08-04

Word VBA教程:理解对象、属性和方法

对象是 Visual Basic 的结构基础,在 Visual Basic 中进行的所有操作几乎都与修改对象有关。Microsoft Word 的任何元素,如文档、表格、段落、书签、域等,都可用 Visual Basic 中的对象来表示。

什么是对象和集合?

对象代表一个 Word 元素,如文档、段落、书签或单独的字符。集合也是一个对象,该对象包含多个其他对象,通常这些对象属于相同的类型;例如,一个集合对象中可包含文档中的所有书签对象。通过使用属性和方法,可以修改单独的的对象,也可修改整个的对象集合。

什么是属性?

属性是对象的一种特性或该对象行为的一个方面。例如,文档属性包含其名称、内容、保存状态以及是否启用修订。若要更改一个对象的特征,可以修改其属性值。

若要设置属性的值,可在对象的后面紧接一个句号、属性名称、一个等号及新的属性值。下列示例在名为“MyDoc.doc”的文档中启用修订。

 

Sub TrackChanges()

    Documents("Sales.doc").TrackRevisions = True

End Sub

在本示例中,Documents 引用由打开的文档构成的集合,而“MyDoc.doc”标识集合中单独的文档。并设置该文档的TrackRevisions属性。

不能设置某些属性。属性的帮助主题中会标明可以设置该属性(可读写),或只能读取该属性(只读)。

通过返回对象的一个属性值,可以获取有关该对象的信息。下列示例返回活动文档的名称。

 

Sub GetDocumentName()

    Dim strDocName As String

    strDocName = ActiveDocument.Name

    MsgBox strDocName

End Sub

在本示例中,ActiveDocument 引用 Word 活动窗口中的文档。该文档的名称赋给了strDocName 变量。

说明

每个属性的帮助主题表明可以设置该属性(可读写),只能读取该属性(只读),或只能写入该属性(只写)。此外“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

下列示例使用名称(指定为一个字符串)来识别 Documents集合中的 Document对象。

 

Sub CloseSalesDoc()

    Documents("Sales.doc").Close

End Sub

集合对象通常具有可用于修改整个对象集合的方法和属性。Documents对象具有Save方法,可用于保存集合中的所有文档。下列示例通过使用 Save方法保存所有打开的文档。

 

Sub SaveAllOpenDocuments()

    Documents.Save

End Sub

Document对象也可使用 Save方法保存单独的文档。下列示例保存名为 Sales.doc 的文档。

 

Sub SaveSalesDoc()

    Documents("Sales.doc").Save

End Sub

若要返回一个处于 Word对象结构底层的对象,就必须使用可返回对象的属性和方法,深入到该对象。

若要查看该过程的执行,请打开“Visual Basic 编辑器,在视图菜单上单击对象浏览器。单击左侧列表中的 Application。然后单击右侧成员列表中的 ActiveDocument对象浏览器底部会显示文字,表明 ActiveDocument 是只读的,该属性返回 Document对象。然后单击对象浏览器底部的 Document,则会在列表中自动选定 Document对象,并将在成员列表中显示 Document对象的成员。滚动成员列表,找到 Close,单击 Close方法。对象浏览器窗口底部会显示文字,说明该方法的语法。有关该方法的详细内容,请按 F1 或单击帮助按钮,以跳转到 Close方法的帮助主题。

根据这些信息可编写下列指令,以关闭活动文档。

 

Sub CloseDocSaveChanges()

    ActiveDocument.Close SaveChanges:=wdSaveChanges

End Sub

下列示例将活动文档窗口最大化。

 

Sub MaximizeDocumentWindow()

    ActiveDocument.ActiveWindow.WindowState = wdWindowStateMaximize

End Sub

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,可跳转到相应的帮助主题。
  • Microsoft Word对象。该主题阐明在分级结构中 Word对象的排列方式。在结构图中单击一个对象,可显示相应的帮助主题。
  • 对象浏览器。“Visual Basic 编辑器中的对象浏览器显示 Word对象的成员(属性和方法)。

 

 

Word VBA教程:将格式应用于文本

本主题包含与下列任务相关的 Visual Basic 示例:

将格式应用于选定内容

下列示例使用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)

        .Space1

    End With

End Sub

将格式应用于某一区域

下列示例定义了一个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"

            .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()

    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

Word VBA教程:编辑文字

本主题包含与下列任务相关的 Visual Basic 示例:

有关其他编辑任务的信息和示例,请参阅下列主题:

从文档返回文本

选定文档中的文本

将文本插入文档

修改文档的某一部分

确定文本是否被选定

Selection对象的Type属性返回所选内容类型的信息。如果所选内容为插入点,则下列示例显示一条消息。

 

Sub IsTextSelected()

    If Selection.Type = wdSelectionIP Then MsgBox "Nothing is selected"

End Sub

折叠所选内容或区域

使用Collapse方法可将 Selection Range对象折叠到开始或结束点的位置。下列示例在所选内容的开头将所选内容折叠为一个插入点。

 

Sub CollapseToBeginning()

    Selection.Collapse Direction:=wdCollapseStart

End Sub

下列示例将区域折叠至其结束点(在第一个单词之后),并添加新文本。

 

Sub CollapseToEnd()

    Dim rngWords As Range

    Set rngWords = ActiveDocument.Words(1)

    With rngWords

        .Collapse Direction:=wdCollapseEnd

        .Text = "(This is a test.) "

    End With

End Sub

扩展所选内容或区域

下列示例使用MoveEnd方法扩展所选内容的结尾以包含三个附加的单词。MoveLeftMoveRightMoveUp 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

重新定义 Range对象

使用SetRange方法可重新定义现有的 Range对象。有关详细信息,请参阅处理 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

Word VBA教程:查找并替换文字或格式

通过Find Replacement对象可实现查找和替换功能。Selection Range对象可以使用 Find对象。从 Selection Range对象访问 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对象。下列示例在活动文档中查找第一个出现的“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”。由于 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:="", ReplaceWith:="", _
        Format:=True, Replace:=wdReplaceAll
End With

Word VBA教程:杂项任务

本主题包含下列任务的 Visual Basic 示例:

更改视图

View对象包含与窗口或窗格的视图属性相关的属性和方法(全部显示、域底纹、表格网格线等)。下列示例将视图更改为页面视图。

 

Sub ChangeView()

    ActiveDocument.ActiveWindow.View.Type = wdPrintView

End Sub

设置页眉或页脚中的文字

HeadersFooters HeaderFooter属性返回HeaderFooter对象。下列示例更改当前页眉中的文字。

 

Sub AddHeaderText()

    With ActiveDocument.ActiveWindow.View

        .SeekView = wdSeekCurrentPageHeader

        Selection.HeaderFooter.Range.Text = "Header text"

        .SeekView = wdSeekMainDocument

    End With

End Sub

该示例创建一个 Range对象 (rngFooter),该对象引用活动文档中第一节的主页脚。设置 Range对象之后,删除现有的页脚文字,并在页脚中添加 FILENAME 域、两个制表符和 AUTHOR 域。

 

Sub AddFooterText()

    Dim rngFooter As Range

    Set rngFooter = ActiveDocument.Sections(1) _

        .Footers(wdHeaderFooterPrimary).Range

    With rngFooter

        .Delete

        .Fields.Add Range:=rngFooter, Type:=wdFieldFileName, Text:="\p"

        .InsertAfter Text:=vbTab & vbTab

        .Collapse Direction:=wdCollapseStart

        .Fields.Add Range:=rngFooter, Type:=wdFieldAuthor

    End With

End Sub

设置选项

Options对象包含的属性对应于工具菜单的选项对话框中的各项。下列示例设置 Word 的三个应用程序选项。

 

Sub SetOptions()

    With Options

        .AllowDragAndDrop = True

        .ConfirmConversions = False

        .MeasurementUnit = wdPoints

    End With

End Sub

更改文档版式

PageSetup 包含文档的所有页面设置属性(左边距、下边距、纸张大小等),并作为其自身的属性。下列示例设置活动文档的页边距。

 

Sub ChangeDocumentLayout()

    With ActiveDocument.PageSetup

        .LeftMargin = InchesToPoints(0.75)

        .RightMargin = InchesToPoints(0.75)

        .TopMargin = InchesToPoints(1.5)

        .BottomMargin = InchesToPoints(1)

    End With

End Sub

循环遍历文档中的段落

本示例循环遍历活动文档中的所有段落。如果某段落的段前间距为 6 磅,则本示例将该段前间距更改为 12 磅。

 

Sub LoopParagraphs()

    Dim parCount As Paragraph

    For Each parCount In ActiveDocument.Paragraphs

        If parCount.SpaceBefore = 12 Then parCount.SpaceBefore = 6

    Next parCount

End Sub

详细内容,请参阅循环遍历一个集合

自定义菜单和工具栏

CommandBar对象同时代表菜单和工具栏。可使用菜单或工具栏名称的CommandBars属性返回单独的 CommandBar对象。Controls属性返回一个CommandBarControls对象,该对象引用指定命令栏上的项。下列示例将字数统计命令添加至常用菜单。

 

Sub AddToolbarItem()

    Dim btnNew As CommandBarButton

    CustomizationContext = NormalTemplate

    Set btnNew = CommandBars("Standard").Controls.Add _

        (Type:=msoControlButton, ID:=792, Before:=6)

    With btnNew

        .BeginGroup = True

        .FaceId = 700

        .TooltipText = "Word Count"

    End With

End Sub

下列示例将双下划线命令添至格式工具栏。

 

Sub AddDoubleUnderlineButton()

    CustomizationContext = NormalTemplate

    CommandBars("Formatting").Controls.Add _

        Type:=msoControlButton, ID:=60, Before:=7

End Sub

打开宏录制器,并自定义一个菜单或工具栏,以确定某个命令的 ID 值(例如,ID 60 双下划线命令)。

Word VBA教程:处理表格

本主题包含与下列任务相关的 Visual Basic 示例:

创建一张表格,插入文字,并应用格式

下列示例在活动文档的开头插入一张 4 3 行的表格。For Each...Next 结构用于循环遍历表格中的每个单元格。在 For Each...Next 结构中,InsertAfter方法用于将文字添至表格单元格(单元格 1、单元格 2、以此类推)。

 

Sub CreateNewTable()

    Dim docActive As Document

    Dim tblNew As Table

    Dim celTable As Cell

    Dim intCount As Integer

    Set docActive = ActiveDocument

    Set tblNew = docActive.Tables.Add( _

        Range:=docActive.Range(Start:=0, End:=0), NumRows:=3, _

        NumColumns:=4)

    intCount = 1

    For Each celTable In tblNew.Range.Cells

        celTable.Range.InsertAfter "Cell " & intCount

        intCount = intCount + 1

    Next celTable

    tblNew.AutoFormat Format:=wdTableFormatColorful2, _

        ApplyBorders:=True, ApplyFont:=True, ApplyColor:=True

End Sub

在表格单元格中插入文字

下列示例在活动文档中第一张表格的第一个单元格中插入文字。Cell方法返回单独的 Cell对象。Range属性返回一个 Range对象。Delete方法用于删除现有的文字,而InsertAfter方法用于插入文字“Cell 1,1”

 

Sub InsertTextInCell()

    If ActiveDocument.Tables.Count >= 1 Then

        With ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range

            .Delete

            .InsertAfter Text:="Cell 1,1"

        End With

    End If

End Sub

返回表格单元格中的文字,不包括表格结束单元格标记

下列示例返回并显示文档中第一张表格的第一行中每个单元格的内容。

 

Sub ReturnTableText()

    Dim tblOne As Table

    Dim celTable As Cell

    Dim rngTable As Range

    Set tblOne = ActiveDocument.Tables(1)

    For Each celTable In tblOne.Rows(1).Cells

        Set rngTable = ActiveDocument.Range(Start:=celTable.Range.Start, _

            End:=celTable.Range.End - 1)

        MsgBox rngTable.Text

    Next celTable

End Sub

 

Sub ReturnCellText()

    Dim tblOne As Table

    Dim celTable As Cell

    Dim rngTable As Range

    Set tblOne = ActiveDocument.Tables(1)

    For Each celTable In tblOne.Rows(1).Cells

        Set rngTable = celTable.Range

        rngTable.MoveEnd Unit:=wdCharacter, Count:=-1

        MsgBox rngTable.Text

    Next celTable

End Sub

将文本转换为表格

下列示例在活动文档的开头插入用制表符分隔的文本,然后将这些文本转换为表格。

 

Sub ConvertExistingText()

    With Documents.Add.Content

        .InsertBefore "one" & vbTab & "two" & vbTab & "three" & vbCr

        .ConvertToTable Separator:=Chr(9), NumRows:=1, NumColumns:=3

    End With

End Sub

返回每个表格单元格的内容

下列示例定义一个数组,该数组的元素个数等于文档中第一张表格(假定为 Option Base 1)中的单元格数。For Each...Next 结构用于返回每个表格单元格的内容,并将文字指定给相应的数组元素。

 

Sub ReturnCellContentsToArray()

    Dim intCells As Integer

    Dim celTable As Cell

    Dim strCells() As String

    Dim intCount As Integer

    Dim rngText As Range

    If ActiveDocument.Tables.Count >= 1 Then

        With ActiveDocument.Tables(1).Range

            intCells = .Cells.Count

            ReDim strCells(intCells)

            intCount = 1

            For Each celTable In .Cells

                Set rngText = celTable.Range

                rngText.MoveEnd Unit:=wdCharacter, Count:=-1

                strCells(intCount) = rngText

                intCount = intCount + 1

            Next celTable

        End With

    End If

End Sub

将活动文档中的所有表格复制到新文档中

本示例将当前文档中的表格复制到新文档中。

 

Sub CopyTablesToNewDoc()

    Dim docOld As Document

    Dim rngDoc As Range

    Dim tblDoc As Table

    If ActiveDocument.Tables.Count >= 1 Then

        Set docOld = ActiveDocument

        Set rngDoc = Documents.Add.Range(Start:=0, End:=0)

        For Each tblDoc In docOld.Tables

            tblDoc.Range.Copy

            With rngDoc

                .Paste

                .Collapse Direction:=wdCollapseEnd

                .InsertParagraphAfter

                .Collapse Direction:=wdCollapseEnd

            End With

        Next

    End If

End Sub

Word VBA教程:处理 Document对象

Visual Basic 中,可使用Document对象或Documents集合对象的方法来修改文件。本主题包含与下列任务相关的 Visual Basic 示例:

新建文档

Documents集合包含所有打开的文档。若要新建文档,可使用Add方法将一个 Document对象添至 Documents集合。下列指令新建一篇文档。

 

Documents.Add

新建文档更好的方法是将返回值赋给一个对象变量。Add方法返回一个引用新文档的 Document对象。在下列示例中,将 Add方法返回的 Document对象赋给一个对象变量。然后设置该 Document对象的部分属性和方法。使用对象变量可以很容易地控制新文档。

 

Sub NewSampleDoc()

    Dim docNew As Document

    Set docNew = Documents.Add

    With docNew

        .Content.Font.Name = "Tahoma"

        .SaveAs FileName:="Sample.doc"

    End With

End Sub

打开文档

若要打开现有的文档,可使用 Documents集合的Open方法。下列指令打开 MyFolder 文件夹中名为 MyDocument.doc 的文档。

 

Sub OpenDocument()

    Documents.Open FileName:="C:\MyFolder\Sample.doc"

End Sub

保存现有文档

若要保存一篇文档,可使用 Document对象的Save方法。下列指令保存名为 Sales.doc 的文档。

 

Sub SaveDocument()

    Documents("Sales.doc").Save

End Sub

通过对 Documents集合应用 Save方法,可以保存所有打开的文档。下列指令保存所有打开的文档。

 

Sub SaveAllOpenDocuments()

    Documents.Save

End Sub

保存新文档

若要保存一篇文档,可使用 Document对象的SaveAs方法。下列指令在当前文件夹中保存活动文档,命名为“Temp.doc”

 

Sub SaveNewDocument()

    ActiveDocument.SaveAs FileName:="Temp.doc"

End Sub

FileName参数可以仅包含文件名,也可以包含完整的路径(例如,“C:\Documents\Temporary File.doc”)。

关闭文档

若要关闭一篇文档,可使用 Document对象的Close方法。下列指令关闭并保存名为 Sales.doc 的文档。

 

Sub CloseDocument()

    Documents("Sales.doc").Close SaveChanges:=wdSaveChanges

End Sub

通过应用 Documents集合的 Close方法可关闭所有打开的文档。下列指令在不保存更改的情况下关闭所有的文档。

 

Sub CloseAllDocuments()

    Documents.Close SaveChanges:=wdDoNotSaveChanges

End Sub

下列示例在文档关闭以前提示用户保存文档。

 

Sub PromptToSaveAndClose()

    Dim doc As Document

    For Each doc In Documents

        doc.Close SaveChanges:=wdPromptToSaveChanges

    Next

End Sub

激活文档

若要更改活动文档,可使用 Document对象的Activate方法。下列指令激活已打开的名为 Sales.doc 的文档。

 

Sub ActivateDocument()

    Documents("Sales.doc").Activate

End Sub

确定文档是否已打开

若要确定文档是否处于打开状态,可使用 For Each...Next 语句列举 Documents集合中的元素。如果文档 Sample.doc 是打开的,则下列示例激活该文档,如果没有打开文档,则将该文档打开。

 

Sub ActivateOrOpenDocument()

    Dim doc As Document

    Dim docFound As Boolean

    For Each doc In Documents

        If InStr(1, doc.Name, "sample.doc", 1) Then

            doc.Activate

            docFound = True

            Exit For

        Else

            docFound = False

        End If

    Next doc

    If docFound = False Then Documents.Open FileName:="Sample.doc"

End Sub

引用活动文档

与通过名称或索引序号引用文档不同(例如Documents("Sales.doc")),ActiveDocument属性返回一个引用活动文档(具有焦点的文档)的 Document对象。下列示例显示活动文档的名称,或在没有打开的文档时显示一条消息。

 

Sub ActiveDocumentName()

    If Documents.Count >= 1 Then

        MsgBox ActiveDocument.Name

    Else

        MsgBox "No documents are open"

    End If

End Sub

Word VBA教程:将文本插入文档

使用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 VBA教程:选定文档中的文本

可使用Select方法选定文档中的对象。Select方法可用于多种对象,例如BookmarkFieldRange 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

详细内容,请参阅处理 Selection对象

Word VBA教程:编辑文字

本主题包含与下列任务相关的 Visual Basic 示例:

有关其他编辑任务的信息和示例,请参阅下列主题:

从文档返回文本

选定文档中的文本

将文本插入文档

修改文档的某一部分

确定文本是否被选定

Selection对象的Type属性返回所选内容类型的信息。如果所选内容为插入点,则下列示例显示一条消息。

 

Sub IsTextSelected()

    If Selection.Type = wdSelectionIP Then MsgBox "Nothing is selected"

End Sub

折叠所选内容或区域

使用Collapse方法可将 Selection Range对象折叠到开始或结束点的位置。下列示例在所选内容的开头将所选内容折叠为一个插入点。

 

Sub CollapseToBeginning()

    Selection.Collapse Direction:=wdCollapseStart

End Sub

下列示例将区域折叠至其结束点(在第一个单词之后),并添加新文本。

 

Sub CollapseToEnd()

    Dim rngWords As Range

    Set rngWords = ActiveDocument.Words(1)

    With rngWords

        .Collapse Direction:=wdCollapseEnd

        .Text = "(This is a test.) "

    End With

End Sub

扩展所选内容或区域

下列示例使用MoveEnd方法扩展所选内容的结尾以包含三个附加的单词。MoveLeftMoveRightMoveUp 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

重新定义 Range对象

使用SetRange方法可重新定义现有的 Range对象。有关详细信息,请参阅处理 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

Word VBA教程:将格式应用于文本

本主题包含与下列任务相关的 Visual Basic 示例:

将格式应用于选定内容

下列示例使用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)

        .Space1

    End With

End Sub

将格式应用于某一区域

下列示例定义了一个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"

            .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()

    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

Word VBA教程:查找并替换文字或格式

通过Find Replacement对象可实现查找和替换功能。Selection Range对象可以使用 Find对象。从 Selection Range对象访问 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对象。下列示例在活动文档中查找第一个出现的“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”。由于 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:="", ReplaceWith:="", _
        Format:=True, Replace:=wdReplaceAll
End With

Word VBA教程:从文档返回文本

使用Text属性可以返回 Range Selection对象中的文本。下列示例选定下一个格式设为标题 1”样式的段落。然后通过 MsgBox函数显示 Text属性的内容。

 
Sub FindHeadingStyle()
    With Selection.Find
        .ClearFormatting
        .Style = wdStyleHeading1
        .Execute FindText:="", Format:=True, _
            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
    If ActiveDocument.Bookmarks.Count > 0 Then
        strBookmark = ActiveDocument.Bookmarks(1).Range.Text
        MsgBox strBookmark
    End If
End Sub

Word VBA教程:将 Range对象赋给变量

有多种方法将现有的Range对象赋给变量。本主题对两种不同的方法进行了阐述。在下列示例中,将 Range对象赋给变量Range1 Range2。例如,下列指令将活动文档中的第一个和第二个单词赋给变量Range1 Range2

 
Set Range1 = ActiveDocument.Words(1)
Set Range2 = ActiveDocument.Words(2)

将一个 Range对象变量设置为等于另一个 Range对象变量

下列指令将名为Range2 的区域变量设为与Range1 代表的位置相同。

 
Set Range2 = Range1

现在两个变量代表同一区域。修改Range2 的起点、终点或其中的文本将影响Range1,反之亦然。

请注意,以下指令等价于Range2.Text = Range1.Text。该指令指定Range2的默认属性(Text属性)为Range1的默认属性。但该指令并不修改其实际引用的对象。

 
Range2 = Range1

Range2 Range1 区域具有相同的内容,但它们可能对应文档中的不同位置,甚至对应不同的文档。

使用 Duplicate属性

下列指令创建一个 Range对象的新副本Range2,它与Range1 有相同的起点、终点和文本。

 
Set Range2 = Range1.Duplicate

Range1起点或终点的修改不影响Range2,反之亦然。但是,由于这两个区域指向文档中的同一位置,对一个区域中文本的修改将影响另一个区域中的文本。

Word VBA教程:修改文档的某一部分

Visual Basic 包含一些对象,可用这些对象修改下列文档元素:字符、单词、句子、段落和节。下表包含与这些文档元素相对应的属性和这些属性返回的对象。

表达式

返回的对象

Words(index)

Range

Characters(index)

Range

Sentences(index)

Range

Paragraphs(index)

Paragraph

Sections(index)

Section

 

如果使用这些属性时不带索引序号,则返回一个具有相同名称的集合对象。例如,Paragraphs属性返回Paragraphs集合对象。但是如果通过索引序号识别集合中的一项,则返回上表中第二列中的对象。例如,Words(1) 返回一个 Range对象。有了一个 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

上述表格中的所有文档元素属性对 DocumentSelection Range对象都可用。下列示例阐明了如何使用DocumentSelection Range对象的这些属性。

下列示例设置活动文档中第一个单词的大小写。

 

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

End Sub

修改一组文档元素

若要修改由一组文档元素(字符、单词、句子、段落或节)组成的某区域的文字,需要创建一个 Range对象。Range方法根据开始和结束位置可创建 Range对象。例如,下列指令创建一个 Range对象,该对象引用活动文档的前十个字符。

 

Sub SetRangeForFirstTenCharacters()

    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

    Set docActive = ActiveDocument

    Set rngParagraphs = docActive.Range(Start:=docActive.Paragraphs(2).Range.Start, _

        End:=docActive.Paragraphs(3).Range.End)

End Sub

有关定义 Range对象的详细信息,请参阅处理 Range对象

Word VBA教程:引用活动文档元素

要引用活动的段落、表格、域或其他文档元素,可使用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属性判定选定内容中是否包含表格。下列示例将底纹应用于选定内容中第一张表格的首行。

 
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 VBA教程:使用 Application对象事件

若要创建Application对象事件的事件处理器,需要完成下列三个步骤:

  1. 在类模块中声明对应于事件的对象变量。
  2. 编写指定事件的过程。
  3. 从其他模块中初始化已声明的对象。

声明对象变量

在为 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 VBA教程:使用 Document对象的事件

Document对象支持三种事件:CloseNew Open。若要在名为“ThisDocument”的类模块中编写响应这些事件的过程。可用下列步骤创建事件过程。

  1. 工程资源管理器窗口中的 Normal 工程或文档工程下,双击“ThisDocument”。(“ThisDocument”位于文件夹视图中的“Microsoft Word对象文件夹中)。
  2. 对象下拉列表框中选择“Document”
  3. 过程下拉列表框中选择一个事件。

类模块中即增加了一个空子程序。

  1. 添加要在事件发生时运行的 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 模板时才发生。

如果文档及其附加模板中存在自动宏,则仅运行保存在文档中的自动宏。如果文档及其附加模板中都存在文档事件过程,则两个事件过程都会运行。

说明

有关创建Application对象事件过程的详细信息,请参阅使用 Application对象事件

Word VBA教程:使用 Application对象事件

若要创建Application对象事件的事件处理器,需要完成下列三个步骤:

  1. 在类模块中声明对应于事件的对象变量。
  2. 编写指定事件的过程。
  3. 从其他模块中初始化已声明的对象。

声明对象变量

在为 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 VBA教程:使用 Document对象的事件

Document对象支持三种事件:CloseNew Open。若要在名为“ThisDocument”的类模块中编写响应这些事件的过程。可用下列步骤创建事件过程。

  1. 工程资源管理器窗口中的 Normal 工程或文档工程下,双击“ThisDocument”。(“ThisDocument”位于文件夹视图中的“Microsoft Word对象文件夹中)。
  2. 对象下拉列表框中选择“Document”
  3. 过程下拉列表框中选择一个事件。

类模块中即增加了一个空子程序。

  1. 添加要在事件发生时运行的 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 模板时才发生。

如果文档及其附加模板中存在自动宏,则仅运行保存在文档中的自动宏。如果文档及其附加模板中都存在文档事件过程,则两个事件过程都会运行。

说明

有关创建Application对象事件过程的详细信息,请参阅使用 Application对象事件

Word VBA教程:使用 ActiveX 控件事件

Microsoft Word 文档可包含 ActiveX 控件。可用控件工具箱插入诸如命令按钮、复选框和列表框等 ActiveX 控件。可使用下列步骤添加具有 LostFocus事件的 ActiveX 复选框控件:

  1. Word 中用鼠标右键单击工具栏,然后单击控件工具箱
  2. 单击复选框控件。

活动文档中即插入一个复选框控件。

  1. 用鼠标右键单击复选框,然后单击查看代码

Word 会切换至“Visual Basic 编辑器并显示 ThisDocument 类模块,并在对象下拉列表框中选定该复选框。

  1. 过程下拉列表框中选定 LostFocus事件。

在类模块中会添加一个空过程。

  1. 添加要在事件发生时运行的 Visual Basic 指令。

下列示例显示在焦点离开 CheckBox1 时运行的 LostFocus事件过程。该宏用Value属性显示 CheckBox1 的状态(True 为选定,False 为清除)。

 

Private Sub CheckBox1_LostFocus()

    MsgBox CheckBox1.Value

End Sub

若要查看事件过程的运行情况,可切换回包含该复选框的 Word 文档。单击控件工具箱上的退出设计模式按钮。选定或清除复选框,然后单击文档中的其他元素。此时复选框失去焦点,LostFocus 过程开始运行;Word 会显示一个消息框,内容为 True False

Word Word 文档中为 ActiveX 控件应用了 LostFocus GotFocus事件。过程下拉列表框中列出的其他事件在“Microsoft 窗体帮助中有文档说明。

Word VBA教程:通过录制宏生成代码

如果无法确定要使用的 Visual Basic方法或属性,可打开宏录制器并进行手动操作。宏录制器会将操作译成 Visual Basic 代码。录制操作完成后,可根据需要修改代码。例如,如果无法确定实现段落缩进的属性或方法,可执行下列操作:

  1. 工具菜单上,指向,然后单击录制新宏
  2. 如果需要,可更改默认的宏名称,然后单击确定启动录制器。
  3. 格式菜单上,选定段落
  4. 更改段落左缩进的值,然后单击确定
  5. 单击停止录制工具栏上的停止录制按钮。
  6. 工具菜单上,指向,然后单击
  7. 从步骤 2 中选择宏的名称,然后单击编辑按钮。

查看 Visual Basic 代码来确定对应于段落左缩进的属性(LeftIndent属性)。将插入点置于LeftIndent 之中,并按 F1 或单击帮助按钮。在帮助主题中,可以查看示例以及支持 LeftIndent属性的对象(单击应用于)。

说明

录制的宏使用Selection属性返回Selection对象。例如,下列指令将所选段落缩进 0.5 英寸。

 

Sub IndentParagraph()

    Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5)

End Sub

您也可以修改录制的宏并与Range对象一起使用。相关信息,请参阅修改录制的 Visual Basic

Word VBA教程:修改录制的 Visual Basic

宏录制器是查找所需的 Visual Basic方法和属性的非常方便的工具。如果不知道使用何种属性或方法,可打开宏录制器,手动执行操作。宏录制器会将操作译为 Visual Basic 代码。但录制宏具有一些限制条件。您不能录制下列内容:

  • 条件分支
  • 变量指定
  • 循环结构
  • 自定义用户窗体
  • 出错处理
  • 用鼠标选定的文字(必须使用组合键)

若要增强宏的功能,可能需要修改录制到模块中的代码。

删除 Selection属性

使用宏录制器创建的宏取决于所选内容。在大多数录制的宏指令的开头,可以看到Selection。录制的宏使用Selection属性返回Selection对象。例如,下列示例将所选内容移动至 Temp 书签,并在书签之后插入文字。

 

Sub Macro1()

    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()

    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

    End With

End Sub

不使用 Selection对象也可以完成相同的任务。下面的宏在活动文档的开头使用 Range对象来完成相同的任务。

 

Sub MyMacro()

    With ActiveDocument.Range(Start:=0, End:=0)

        .InsertAfter "Title"

        .ParagraphFormat.Alignment = wdAlignParagraphCenter

    End With

End Sub

删除不必要的属性

如果录制了一个关于在对话框中选择选项的宏,即使只更改一个或两个选项,宏录制器也会记录该对话框中的所有选项的设置。如果不希望更改所有的选项,可从录制的宏中删除不必要的属性。下面录制的宏包含段落对话框的一些选项(单击格式菜单可显示该对话框)。

 

Sub Macro1()

    With Selection.ParagraphFormat

        .LeftIndent = InchesToPoints(0)

        .RightIndent = InchesToPoints(0)

        .SpaceBefore = 6

        .SpaceAfter = 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

        .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:="", Revert:=False, _

        WritePasswordDocument:="", _

        WritePasswordTemplate:="", Format:=wdOpenFormatAuto

End Sub

可以从录制的宏中删除不需要的参数。例如,可以删除所有设置为空字符串的参数(如WritePasswordDocument:=""),如下所示。

 

Sub MyMacro()

    Documents.Open FileName:="C:\My Documents\Test.doc", _

        ConfirmConversions:= False, _

        ReadOnly:=False, AddToRecentFiles:=False, _

        Revert:=False, Format:=wdOpenFormatAuto

End Sub

Word VBA教程:自动运行的宏

通过为一个宏赋予某个特殊的名称,就可在执行某项操作(例如启动 Word 或打开文档)时自动运行宏。Word 将下列名称识别为自动宏,或称“auto”宏。

宏名

运行条件

AutoExec

启动 Word 或加载全局模板时

AutoNew

每次新建文档时

AutoOpen

每次打开已有文档时

AutoClose

每次关闭文档时

AutoExit

退出 Word 或卸载全局模板时

当以下条件之一为真时,将识别代码模块中的自动宏。

  • 模块在自动宏(如 AutoExec)之后命名,并且包含一个名为“Main”的过程。
  • 任何模块中的过程在自动宏之后命名。

与其他宏一样,自动宏也可以保存于 Normal 模板、其他模板或文档中。要让自动宏运行,它必须位于活动文档的 Normal 模板中,或活动文档选用的模板中。唯一例外的是 AutoExec 宏,它只有存储于以下位置时才可自动运行:Normal 模板、通过模板和加载项对话框全局加载的模板、或由“Startup”文件夹指定的文件夹中的全局模板。

在命名冲突的情况下(多个自动宏名相同),Word 将运行上下文中最近的自动宏。例如,如果同时在文档及其附加的模板中创建了 AutoClose 宏,则仅执行文档中的自动宏。如果在 Normal 模板中创建了 AutoNew 宏,只有当文档或其附加模板中没有名为 AutoNew 的宏时,该自动宏才能运行。

注意  按住 Shift 可以终止自动宏的运行。例如,基于包含 AutoNew 宏的模板新建文档时,按住 Shift 可终止 AutoNew 宏的运行。方法是:按住 Shift,单击(文件菜单)新建对话框中的确定按钮,并在显示新文档前持续按住 Shift。如果运行一个宏时有可能触发自动宏,可用下列指令终止自动宏的运行:

WordBasic.DisableAutoMacros

Word VBA教程:修改 Word 命令

大多数 Word 命令都可通过转换为宏的方式对其进行修改。例如,可修改文件菜单上的打开命令,使其不再显示 Word 文档文件列表(扩展名为 .doc 的文件),而显示当前文件夹中的所有文件。

若要在对话框中显示内置 Word 命令列表,可在宏的位置框中选定“Word 命令。显示的命令列表中包含所有的菜单命令、工具栏命令或快捷键命令。菜单命令名称以相关的菜单名称开头。例如,文件菜单中的保存命令显示为“FileSave”

通过将一个宏命名为与 Word 命令相同的名称,就可用宏替代 Word 命令。例如,如果创建一个名为“FileSave”的宏,当选择文件菜单上的保存命令、单击保存工具栏按钮,或按保存文件快捷键时,Word 将运行该宏。

本示例介绍了修改 FileSave 命令的步骤。

  1. 工具菜单上,指向,然后单击
  2. 宏的位置框中,选择“Word 命令
  3. 宏名框中,选择“FileSave”
  4. 宏的位置框中选择一个模板或文档以保存该宏。例如,选择 Normal.dot(全局模板)可生成一个共用宏(即修改所有文档的“FileSave”命令)。
  5. 单击创建按钮。

FileSave 宏显示如下:

 

Sub FileSave()

'

' FileSave Macro

' Saves the active document or template

'

    ActiveDocument.Save

End Sub

可添加指令或删除现有的ActiveDocument.Save 指令。之后在运行“FileSave”命令时,新的 FileSave 宏将取代 word 命令。若要恢复“FileSave”原有的功能,需重新命名新的 FileSave 宏或将之删除。

说明

也可以创建与 Word 命令同名的代码模块(例如 FileSave)并包含名为 Main 的子程序,以此替换 Word 命令。

Word VBA教程:在宏结束时存储值

宏结束时,变量中的值并未自动存储在磁盘上。如果宏需要保留一个值,则必须在宏的执行操作完成以前,将该值保存在宏的外部。本主题介绍了五个易于存储和检索宏值的位置。

文档变量

文档变量允许您将宏值作为文档或模板的一部分存储。例如,可在宏驻留的文档或模板中存储宏的值。可用Variables集合的Add方法向文档或模板添加变量。下列示例用 ThisDocument属性将文档变量保存于运行宏的相同位置(文档或模板)。

 
Sub AddDocumentVariable()
    ThisDocument.Variables.Add Name:="Age", Value:=12
End Sub

下列示例用Variable对象的Value属性返回文档变量的值。

 
Sub UseDocumentVariable()
    Dim intAge As Integer
    intAge = ThisDocument.Variables("Age").Value
End Sub

说明

可用 DOCVARIABLE 域将文档变量插入文档。

文档属性

与文档变量相同,文档属性允许将值作为文档或模板的一部分存储。可在的属性对话框中查看文档属性(单击文件菜单上的属性可显示该对话框)。

Word对象模块将文档属性分为两组:内置的和自定义的。自定义文档属性包括属性对话框中自定义选项卡上显示的属性。内置文档属性包括属性对话框中除自定义选项卡以外的所有选项卡上的属性。

若要访问内置属性,可使用BuiltInDocumentProperties属性返回一个包含内置文档属性的DocumentProperties集合。使用CustomDocumentProperties属性返回一个包含自定义文档属性的 DocumentProperties集合。下列示例在运行的宏所在的相同位置(文档或模板)创建一个名为“YourName”的自定义文档属性。

 
Sub AddCustomDocumentProperties()
    ThisDocument.CustomDocumentProperties.Add Name:="YourName", _
        LinkToContent:=False, Value:="Joe", Type:=msoPropertyTypeString
End Sub

内置文档属性不能添至 BuiltInDocumentProperties属性返回的 DocumentProperties集合中。但是可检索内置文档属性的内容或更改可读/写的内置文档属性的值。

说明

可用 DOCPROPERTY 域将文档属性插入文档中。

自动图文集词条

自动图文集词条可用于在模板中存储信息。与文档变量或属性不同,自动图文集词条可包含除宏变量以外的其他条目,例如带格式文本或图形。可使用AutoTextEntries集合的Add方法创建新的自动图文集词条。下列示例创建一个包含所选内容的名为“MyText”自动图文集词条。如果下列指令是模板宏的一部分,则新的自动图文集词条将存储在模板中;否则,自动图文集词条将存储在驻留指令的文档附加模板中。

 
Sub AddAutoTextEntry()
    ThisDocument.AttachedTemplate.AutoTextEntries.Add Name:="MyText", _
        Range:=Selection.Range
End Sub

使用AutoTextEntry对象的Value属性可检索自动图文集词条对象的内容。

设置文件

可使用PrivateProfileString属性从设置文件中检索信息并进行设置。Windows 设置文件的结构与 Windows 3.1 WIN.INI 文件相同。下列示例将 Macro.ini 文件中 DocTracker 节下的 DocNum 键设为 1

 
Sub MacroSystemFile()
    System.PrivateProfileString( _
        FileName:="C:\My Documents\Macro.ini", _
        Section:="DocTracker", Key:="DocNum") = 1
End Sub

运行上述指令后,Macro.ini 文件包含下列文本:

 
[DocTracker]
DocNum=1

PrivateProfileString属性有三个参数:FileNameSection KeyFileName参数用于指定设置文件的路径和文件名。Section参数指定出现在相关的键前面的括号之间的节的名称(不包括节名的括号)。Key参数指定其后跟随等号 (=) 的键名和设置。

使用相同的 PrivateProfileString 属性可从设置文件中检索设置。下列示例检索 Macro.ini 文件中 DocTracker 节下的 DocNum 设置。

 
Sub GetSystemFileInfo()
    Dim intDocNum As Integer
    intDocNum = System.PrivateProfileString( _
        FileName:="C:\My Documents\Macro.ini", _
        Section:="DocTracker", Key:="DocNum")
    MsgBox "DocNum is " & intDocNum
End Sub

Windows 注册表

可使用PrivateProfileString属性设置和检索 Windows 注册表中的信息。下列示例从 Windows 注册表中检索 Microsoft Word 2002 程序目录。

 
Sub GetRegistryInfo()
    Dim strSection As String
    Dim strPgmDir As String
    strSection = "HKEY_CURRENT_USER\Software\Microsoft" _
        & "\Office\10.0\Word\Options"
    strPgmDir = System.PrivateProfileString(FileName:="", _
        Section:=strSection, Key:="PROGRAMDIR")
    MsgBox "The directory for Word is - " & strPgmDir
End Sub

PrivateProfileString属性有三个参数:FileNameSection Key。若要返回或设置注册表项的值,应将 FileName参数指定为空字符串 ("")Section参数应为注册表子键的完整路径。Key参数应为 Section 指定的子键中项的名称。

也可用下列 PrivateProfileString 语法在 Windows 注册表中设置信息。

System.PrivateProfileString(FileName, Section, Key) = value

下列示例将 Windows 注册表中 Word 2002 Option 子键的 DOC-PATH 项设为“C:\My Documents”

 
Sub SetDocumentDirectory()
    Dim strDocDirectory As String
    strDocDirectory = "HKEY_CURRENT_USER\Software\Microsoft" _
        & "\Office\10.0\Word\Options"
    System.PrivateProfileString(FileName:="", _
        Section:=strDocDirectory, Key:="DOC-PATH") = "C:\My Documents"
End Sub

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多