获取当前所选字符的索引

时间:2019-01-21 21:09:00

标签: vba ms-word

我目前正在处理一个宏,该宏将对活动文档的所有字符进行如下迭代:

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。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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

MsgBox Selection.Characters(1).Font.Name