Получить индекс текущего выбранного персонажа - PullRequest
0 голосов
/ 22 января 2019

В настоящее время я работаю над макросом, который перебирает все символы активного документа следующим образом:

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 голосов
/ 22 января 2019

Начальная / конечная позиции

Любые значения .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
    (фигурные скобки для поля являются специальными символами и учитываются дополнительно)

Положение символа курсора

Вы можете построить диапазон с положением курсора, чтобы получить его положение символа (пожалуйста, используйте тип данных Long для документов длиной более 32,767 символов):

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

Имя шрифта курсора

Следующий код показывает имя шрифта символа непосредственно влево позиции курсора , как само слово делает в раскрывающемся меню шрифта(медленно).

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

Если вам нужен только шрифт первого выбранного символа, просто используйте следующую более быструю версию.Показывает имя шрифта первого выбранного символа.Если вы ничего не выбрали, вы получите имя шрифта непосредственно вправо от курсора:

MsgBox Selection.Characters(1).Font.Name
0 голосов
/ 22 января 2019

Работа с позициями Start или End ненадежна из-за того, как Word обрабатывает невидимый контент. Например, он подходит для установки начала одного диапазона на конец другого, но не для точного местоположения в документе.

Для задачи, описанной в вопросе, будет работать метод Range.InRange. Возвращает 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
...