Word VBA: как создать перекрестную ссылку на рисунок в текстовом поле?

Я создаю макрос Word VBA для вставки текстового фрейма, содержащего изображение и его заголовок, а затем создаю перекрестную ссылку на него в тексте основного документа.

Но Word не находит заголовок, если он находится в текстовом фрейме.

Вот иллюстративный код:

    Sub ShowMe()
    Dim items() As String
    items = ActiveDocument.GetCrossReferenceItems("Figure")
    MsgBox ("Found " & UBound(items))
    End Sub

Если в заголовке есть вещь (например, изображение, таблица или просто параграф), встроенная в основной текст документа, он ее находит. Но если заголовок находится в текстовом фрейме или текстовом поле, будь то параграф заголовка, который я создаю в текстовом фрейме, или если я просто щелкаю текстовый фрейм и выполняю «Вставить заголовок» (который фактически создает текстовое поле под кадр), я получаю ноль.

Я пробовал создать перекрестную ссылку, просто создав поле REF вручную, но это не работает надежно. Я подозреваю, что в процессе перекрестных ссылок есть какая-то магия, создавая при необходимости новую скрытую закладку.

Есть предложения, пожалуйста?


person CharlesW    schedule 11.06.2020    source источник
comment
Почему вы помещаете их в текстовое поле? Если вы добавляете заголовок к таблице / диаграмме / изображению с переносом текста, Word добавляет текстовый фрейм (текстовые фреймы и текстовые поля - это разные вещи) к заголовку, чтобы он выровнялся с изображением. На подписи в текстовых фреймах можно делать перекрестные ссылки.   -  person Timothy Rylatt    schedule 11.06.2020
comment
Также можно вставить в таблицу и элемент, и его заголовок. В зависимости от ваших предпочтений эта таблица может иметь одну или две строки.   -  person macropod    schedule 11.06.2020
comment
Эээ, @TimothyRylatt, macropod - это интересные предложения, но они не касаются моей проблемы. Конечно, на заголовки в текстовых фреймах и текстовых полях (и в таблицах в плавающих текстовых полях) можно ссылаться. Но на заголовки в плавающих текстовых фреймах или текстовых полях можно ссылаться вручную с помощью диалогового окна перекрестных ссылок, но они не отображаются в списке ActiveDocument.GetCrossReferenceItems. Как мне найти их в VBA?   -  person CharlesW    schedule 11.06.2020
comment
Только что проверив предложения, я понял, что в Office 365 Word больше не используется текстовый фрейм для плавающих заголовков, а вместо этого добавляется текстовое поле. Использование таблицы с переносом текста, как предлагает @macropod, определенно работает. По сути, если ваш метод вставки подписей не работает с адаптируемой объектной моделью, используйте метод, который работает.   -  person Timothy Rylatt    schedule 12.06.2020
comment
Хорошо, но у меня та же проблема с подходом, который предлагает @TimothyRylatt. И подписи в основном тексте не подходят для моих нужд.   -  person CharlesW    schedule 12.06.2020


Ответы (1)


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

Код для этого довольно длинный, в основном потому, что Word имеет тенденцию к непоследовательному сокращению абзацев. Вы можете найти его на https://github.com/charlesweir/WordImagesAndTables в AnchoredFrame.cls, функция InsertCrossReferenceBesideAnchor

  • Чарльз
person CharlesW    schedule 19.06.2020