【问题标题】:Get index of selected character获取所选字符的索引
【发布时间】:2020-05-21 07:04:39
【问题描述】:

我正在开发一个宏,它遍历活动文档的所有字符:

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。

如何获取所选角色的位置?

【问题讨论】:

  • 你的字符数是如何计算的?通过在审阅选项卡的校对部分使用字数统计,还是使用ActiveDocument.Characters.Count?需要注意的是,Characters.Count 的 VBA 还将包含回车符(以及其他空格字符,我敢肯定)。

标签: vba ms-word


【解决方案1】:

由于 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

【讨论】:

    【解决方案2】:

    开始/结束位置

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

    • ActiveDocument.Content.End
    • Selection.End(尤其是如果您选择了整个文档,例如)

    Characters.Count

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

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

    示例


    此示例文档仅包含 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
    

    【讨论】:

    • 您尝试过我的回答吗?如果它适合您,请考虑将其标记为答案,如here 所述。如果没有,请不要犹豫,在下面发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-11-13
    • 2021-07-19
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多