我目前正在处理一个宏,该宏将对活动文档的所有字符进行如下迭代:
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。
有人知道我如何获得当前所选角色的正确位置吗?
答案 0 :(得分:0)
由于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
答案 1 :(得分:0)
任何.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 ActiveDocument.Characters.Count
= 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