ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3109|回复: 2

[转帖] Word VBA中重要的两个对象:Selection和Range

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-4 10:30 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
转自:https://www.cnblogs.com/Alex80/p/4759289.html
Selection 对象
代表窗口或窗格中的当前所选内容。所选内容代表文档中选定(或突出显示)的区域,如果文档中没有选定任何内容,则代表插入点。每个文档窗格只能有一个 Selection 对象,并且在整个应用程序中只能有一个活动的 Selection 对象。
说明


可以使用 Selection 属性返回 Selection 对象。如果 Selection 属性未使用对象限定符,则 Microsoft Office Word 返回活动文档窗口的活动窗格中的所选内容。以下示例从活动文档中复制当前所选内容。

Selection.Copy

以下示例删除 Documents 集合中第三个文档的所选内容。访问该文档的当前所选内容时,该文档无需处于活动状态。

Documents(3).ActiveWindow.Selection.Cut

以下示例复制活动文档第一个窗格中的所选内容,并将其粘贴到第二个窗格中。

ActiveDocument.ActiveWindow.Panes(1).Selection.Copy
ActiveDocument.ActiveWindow.Panes(2).Selection.Paste

Text 属性是 Selection 对象的默认属性。使用此属性可设置或返回当前所选内容中的文本。以下示例将当前所选内容中的文本赋给变量 strTemp。如果最后一个字符是段落标记,则删除该字符。

Dim strTemp as String

strTemp = Selection.Text
If Right(strTemp, 1) = vbCr Then _
    strTemp = Left(strTemp, Len(strTemp) - 1)

Selection 对象有多种方法和属性,可用于折叠、扩展或以其他方式更改当前所选内容。以下示例将插入点移至文档末尾并选择最后三行。

Selection.EndOf Unit:=wdStory, Extend:=wdMove
Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveUp Unit:=wdLine, Count:=2, Extend:=wdExtend

Selection 对象有多种方法和属性,可用于编辑文档中的所选文字。以下示例选择活动文档中的第一句,并用新段落替换该句。

Options.ReplaceSelection = True
ActiveDocument.Sentences(1).Select
Selection.TypeText "Material below is confidential."
Selection.TypeParagraph

以下示例删除 Documents 集合中第一个文档的最后一段,并将其粘贴到第二个文档的开头。

With Documents(1)
    .Paragraphs.Last.Range.Select
    .ActiveWindow.Selection.Cut
End With

With Documents(2).ActiveWindow.Selection
    .StartOf Unit:=wdStory, Extend:=wdMove
    .Paste
End With

Selection 对象有多种方法和属性,可用于更改当前所选内容的格式。以下示例将当前所选内容的字体从 Times New Roman 更改为 Tahoma。

If Selection.Font.Name = "Times New Roman" Then _
    Selection.Font.Name = "Tahoma"

可以使用 Flags、Information 和 Type 等属性返回有关当前所选内容的信息。您可以在某个过程中使用以下示例来确定活动文档中是否选择了内容,如果未选择,则跳过该过程的其余部分。

If Selection.Type = wdSelectionIP Then
    MsgBox Prompt:="You have not selected any text! Exiting procedure..."
    Exit Sub
End If

即使将所选内容折叠到插入点,相应内容也不一定为空。例如,Text 属性仍将字符返回到插入点右侧,此字符也会出现在 Selection 对象的 Characters 集合中。但是,从折叠的所选内容调用 Cut 或 Copy 等方法将引起错误。

用户可以选择文档中不代表连续文本的区域(例如,在使用 Alt 键和鼠标时)。由于这种所选内容的行为不可预知,因此,您可能希望在代码中包含一个步骤,先检查所选内容的 Type 属性,然后再对它执行任意操作 (Selection.Type = wdSelectionBlock)。同样,包含表格单元格的所选内容也会导致不可预知的行为。Information 属性将指示所选内容是否在某个表中 (Selection.Information(wdWithinTable) = True)。以下示例确定所选内容是否正常(例如,它不是表中的行或列,也不是垂直文本块,等等),您可以先用该示例对当前所选内容进行测试,然后再对它执行任意操作。

If Selection.Type <> wdSelectionNormal Then
    MsgBox Prompt:="Not a valid selection! Exiting procedure..."
    Exit Sub
End If

由于 Range 对象与 Selection 对象的许多方法和属性都相同,因此,如果没有必要对当前所选内容进行实际更改,最好使用 Range 对象来处理文档。有关 Selection 对象和 Range 对象的详细信息,请参阅处理 Selection 对象和处理 Range 对象。

处理 Selection 对象
用 Microsoft Office Word 处理文档时,通常先选定文字,然后对所选内容执行操作,例如设置文字格式或键入文字。在 Microsoft Visual Basic 中,通常不需要在修改文字前先选定文字,而是创建一个引用文档中特定区域的 Range 对象。有关定义 Range 对象的信息,请参阅处理 Range 对象。但是,如果希望代码响应或更改所选内容,则可使用 Selection 对象。

如果尚未选定文本,可使用 Select 方法选择与特定对象关联的文本并创建一个 Selection 对象。例如,下面的指令选定活动文档中的第一个单词。

Sub SelectFirstWord()
    ActiveDocument.Words(1).Select
End Sub

有关详细信息,请参阅在文档中选定文字。

如果已经选定文本,可使用 Selection 属性返回一个 Selection 对象,该对象表示文档中当前选定的内容。每个文档只能有一个 Selection 对象,该对象始终访问当前选定内容。下面的示例更改当前选定内容中段落的格式。

Sub FormatSelection()
    Selection.Paragraphs.LeftIndent = InchesToPoints(0.5)
End Sub

本示例在当前选定内容后插入单词“Hello”。

Sub InsertTextAfterSelection()
    Selection.InsertAfter Text:="Hello "
End Sub

本示例对选定文本应用加粗格式。

Sub BoldSelectedText()
    Selection.Font.Bold = True
End Sub

宏录制器经常会创建使用 Selection 对象的宏。下面的示例是使用宏录制器创建的。该宏选择活动文档中的前两个单词并对其应用加粗格式。

Sub Macro()
    Selection.HomeKey Unit:=wdStory
    Selection.MoveRight Unit:=wdWord, Count:=2, Extend:=wdExtend
    Selection.Font.Bold = wdToggle
End Sub

下面的示例完成相同的任务,但不选择文本,也不使用 Selection 对象。

Sub WorkingWithRanges()
    ActiveDocument.Range(Start:=0, _
        End:=ActiveDocument.Words(2).End).Bold = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-4 10:33 | 显示全部楼层
Range 对象
代表文档中的一个连续区域。每个 Range 对象由一个起始字符位置和一个终止字符位置定义。
说明


与书签在文档中的使用方法类似,Range 对象在 Visual Basic 过程中用来标识文档的特定部分。但与书签不同的是,Range 对象只在定义该对象的过程运行时才存在。Range 对象独立于所选内容。也就是说,您可以定义和处理一个范围而无需更改所选内容。还可以在文档中定义多个范围,但每个窗格中只能有一个所选内容。

使用 Range 方法可返回一个 Range 对象,该对象由指定的起始和终止字符位置定义。以下示例返回一个代表活动文档中前 10 个字符的 Range 对象。

Set myRange = ActiveDocument.Range(Start:=0, End:=10)

使用 Range 属性可返回一个 Range 对象,该对象由另一对象的起点和终点定义。Range 属性可应用于许多对象(例如,Paragraph、Bookmark 和 Cell)。以下示例返回一个代表活动文档中第一段的 Range 对象。

Set aRange = ActiveDocument.Paragraphs(1).Range

以下示例返回一个代表活动文档中第二至第四段的 Range 对象。

Set aRange = ActiveDocument.Range( _
    Start:=ActiveDocument.Paragraphs(2).Range.Start, _
    End:=ActiveDocument.Paragraphs(4).Range.End)
处理 Range 对象
使用 Microsoft Visual Basic 完成的一种常见任务是在文档中指定一个区域,然后对该区域进行某些操作,如插入文字或应用格式。例如,您可能需要编写一个宏,用于在文档的某部分中查找一个单词或词组。该文档部分可以用 Range 对象表示。标识 Range 对象后,就可以应用 Range 对象的方法和属性来修改该区域的内容。

Range 对象引用文档中的某一连续区域。每个 Range 对象都是通过开始和结束字符位置来定义的。与在文档中使用书签的方法类似,在 Visual Basic 过程中使用 Range 对象可以标识文档中的特定部分。Range 对象可以小至一个插入点,或大至整个文档。但是与书签不同,Range 对象只在定义它的过程运行时才存在。

Start、End 和 StoryType 属性唯一地标识一个 Range 对象。Start 和 End 属性返回或设置 Range 对象的开始和结束字符的位置。文档开始处的字符位置为 0,第一个字符后的位置为 1,依此类推。StoryType 属性的 WdStoryType 常量可以代表 11 种不同的文章类型。

  注释
Range 对象与所选内容无关。也就是说,可以定义和修改某区域而不改变当前的所选内容。也可定义文档中的多个区域,而每个文档窗格中只有一处所选内容。

使用 Range 方法
使用 Document 对象的 Range 方法可创建一个 Range 对象,该对象位于主文字部分 (文章:单个文本框或一串相链接文本框中包含的文字。)中并具有给定的起点和终点。下面的示例创建一个 Range 对象,该对象从第一个字符的开始位置开始并延伸到第十个字符。

Sub SetNewRange()
    Dim rngDoc As Range
    Set rngDoc = ActiveDocument.Range(Start:=0, End:=10)
End Sub

将属性或方法应用于 Range 对象时,可以看到已经创建了 Range 对象。下面的示例对活动文档的前 10 个字符应用加粗格式。

Sub SetBoldRange()
    Dim rngDoc As Range
    Set rngDoc = ActiveDocument.Range(Start:=0, End:=10)
    rngDoc.Bold = True
End Sub

如果需要多次引用一个 Range 对象,可使用 Set 语句设置一个其值为该 Range 对象的变量。但是,如果仅需要对 Range 对象执行一次操作,则不必将该对象存储在变量中。只使用一个标识区域并更改 Bold 属性的指令,也能得到相同的结果。

Sub BoldRange()
    ActiveDocument.Range(Start:=0, End:=10).Bold = True
End Sub

类似于书签,一个区域可以跨越一组字符或标记文档中的某个位置。下列示例中的 Range 对象的开始和结束位置相同。该区域不包含任何文字。下列示例在活动文档的开头插入文字。

Sub InsertTextBeforeRange()
    Dim rngDoc As Range
    Set rngDoc = ActiveDocument.Range(Start:=0, End:=0)
    rngDoc.InsertBefore "Hello "
End Sub

可以使用上述字符位置编号,或通过将 Start 和 End 属性用于 Selection、Bookmark 或 Range 等对象,来定义区域的开始和结束位置。下面的示例创建一个 Range 对象,该对象从第二段开头开始,至第三段末尾结束。

Sub NewRange()
    Dim doc As Document
    Dim rngDoc As Range

    Set doc = ActiveDocument
    Set rngDoc = doc.Range(Start:=doc.Paragraphs(2).Range.Start, _
        End:=doc.Paragraphs(3).Range.End)
End Sub

使用 Range 属性
有多个对象具有 Range 属性,如 Paragraph、Bookmark 和 Cell。该属性用于返回 Range 对象。下面的示例返回一个 Range 对象,该对象引用活动文档中的第一段。

Sub SetParagraphRange()
    Dim rngParagraph As Range
    Set rngParagraph = ActiveDocument.Paragraphs(1).Range
End Sub

得到 Range 对象后,可使用它的任何属性或方法来修改该 Range 对象。下列示例选定活动文档中的第二个段落并将所选内容居中。

Sub FormatRange()
    ActiveDocument.Paragraphs(2).Range.Select
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End Sub

若要对同一个 Range 对象应用多种属性或方法,可使用 With…End With 结构。下列示例设置活动文档中第一段的文字格式。

Sub FormatFirstParagraph()
    Dim rngParagraph As Range
    Set rngParagraph = ActiveDocument.Paragraphs(1).Range
    With rngParagraph
        .Bold = True
        .ParagraphFormat.Alignment = wdAlignParagraphCenter
        With .Font
            .Name = "Stencil"
            .Size = 15
        End With
    End With
End Sub

重新定义 Range 对象
使用 SetRange 方法可重新定义现有的 Range 对象。下面的示例将一个区域定义为当前的所选内容。然后应用 SetRange 方法以重新定义该区域,使之包含当前所选内容和接下来的 10 个字符。

Sub ExpandRange()
    Dim rngParagraph As Range
    Set rngParagraph = Selection.Range
    rngParagraph.SetRange Start:=rngParagraph.Start, _
        End:=rngParagraph.End + 10
End Sub

有关其他信息和示例,请参阅 Document 的 Range 方法。

  注释
调试宏时,可以使用 Select 方法确保 Range 对象引用正确的文本区域。例如,下面的示例选择一个 Range 对象,该对象引用活动文档中的第二段和第三段,然后设置所选内容的字体格式。

Sub SelectRange()
    Dim rngParagraph As Range

    Set rngParagraph = ActiveDocument.Paragraphs(2).Range

    rngParagraph.SetRange Start:=rngParagraph.Start, _
        End:=ActiveDocument.Paragraphs(3).Range.End
    rngParagraph.Select

    Selection.Font.Italic = True
End Sub

TA的精华主题

TA的得分主题

发表于 2020-2-4 15:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 13:33 , Processed in 0.026408 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表