获取当前所选字符的索引

问题描述 投票:1回答:2

我目前正在开发一个宏,它迭代活动文档的所有字符,如下所示:

Dim index As Integer
index = Selection.Start

Dim counter As Integer
counter = 0

MsgBox Selection.Characters(1)

For Each c In ActiveDocument.Characters
    If counter < index Then
        counter = counter + 1
    Else
        MsgBox c.Font.Name
    End If
Next

通过第一个If声明,我想跳过所有字符,直到我的选择标记。

我现在的问题是索引超过最大值。字符数(可能是因为图像)导致错误的循环。

例如:索引显示2889,但我整个文档的字符数仅为1238。

有人知道如何获得当前所选角色的正确位置吗?

vba ms-word word-vba
2个回答
0
投票

由于Word处理不可见内容的方式,使用StartEnd位置是不可靠的。例如,可以将一个范围的开始设置为另一个范围的结束,但不能用于文档中的确切位置。

对于问题中描述的任务,Range.InRange方法将起作用。如果作为参数传递的Range包含调用该方法的Range,则返回True。例如:

Dim index As Word.Range
Set index = Selection.Range

Dim counter As Integer
counter = 0

MsgBox Selection.Characters(1)

For Each c In ActiveDocument.Characters
    If c.InRange(Index) Then
        counter = counter + 1
    Else
        MsgBox c.Font.Name
    End If
Next

0
投票

开始/结束位置

任何.Start.End值都是Word的内部精确定位,包括更多的详细信息,而不仅仅是字符数量。这些位置编号高于字符数。例子:

  • ActiveDocument.Content.End
  • Selection.End(特别是如果您选择整个文档)

Characters.Count

可以在范围上计算字符数。它包括所有字符类型,如空格,段落标记和隐藏字符。

  • ActiveDocument.Characters.Count
  • ActiveDocument.StoryRanges(wdMainTextStory).Characters.Count
  • Selection.Characters.Count

Example for .Count vs. .End 此示例文档仅包含7个字符,但中间的“1”是字段中的页码。单词计数如下:

  • ActiveDocument.Characters.Count = 8 (不显示字段时的上部示例:8 = 6位+页码+段落)
  • ActiveDocument.Characters.Count = 32 (显示字段时的示例:32 =包括大括号的所有可见字符)
  • ActiveDocument.Content.End = 34 (该字段的大括号是特殊字符,另外计算)

光标的角色位置

您可以使用光标的位置构建一个范围以获取其字符位置(对于超过32.767个字符的文档,请使用数据类型Long):

Dim pos As Long
pos = ActiveDocument.Range(0, Selection.Start + 1).Characters.Count

光标的字体名称

下面的代码显示了光标位置左侧字符的字体名称,就像Word本身在字体下拉菜单中所做的那样(慢)。

Dim pos As Long
pos = ActiveDocument.Range(0, Selection.Start).Characters.Count
MsgBox ActiveDocument.Characters(pos).Font.Name

如果您只需要选择的第一个字符的字体,只需使用以下更快的版本。它显示第一个选定字符的字体名称。如果您没有选择任何内容,它会直接在光标右侧提供字体名称:

MsgBox Selection.Characters(1).Font.Name
© www.soinside.com 2019 - 2024. All rights reserved.