我目前正在开发一个宏,它迭代活动文档的所有字符,如下所示:
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。
有人知道如何获得当前所选角色的正确位置吗?
由于Word处理不可见内容的方式,使用Start
或End
位置是不可靠的。例如,可以将一个范围的开始设置为另一个范围的结束,但不能用于文档中的确切位置。
对于问题中描述的任务,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
任何.Start
或.End
值都是Word的内部精确定位,包括更多的详细信息,而不仅仅是字符数量。这些位置编号高于字符数。例子:
ActiveDocument.Content.End
Selection.End
(特别是如果您选择整个文档)可以在范围上计算字符数。它包括所有字符类型,如空格,段落标记和隐藏字符。
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