Переместить изображение без копирования / вставки - PullRequest
3 голосов
/ 29 марта 2019

Прямо сейчас у меня есть макрос Word, который перемещает изображение перед конкретным текстом, копируя и вставляя его в это место.Это работает довольно хорошо, но это дорого.Если в моем документе Word содержится 1000 изображений, запуск макроса может занять 30 минут.

Должен быть лучший способ, верно?

Можно ли переместить привязку изображения без копирования?/ вставка всего изображения?

Моя конечная цель - взять текст + изображение, выровненное в таблице (текст слева, изображение справа), вырвать его из таблицы, но сохранить левый / правый характер.

В частности, я ищу изображения в таблицах (строка 1, столбец 2) и хочу переместить их в начало текста в той же таблице (1-й столбец, 1-я строка).Вот фрагмент кода:

For Each shape In innerTable.Cell(1, 2).Range.InlineShapes
    If shape.Type = wdInlineShapePicture Then
        shape.Select
        Selection.Cut
        innerTable.Range.Paragraphs(1).Range.Characters(1).Paste
        'Do it only for the 1st image found:
        Exit For
    End If

Next

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

1 Ответ

1 голос
/ 29 марта 2019

Перемещение Shape возможно только в том случае, если цель находится на той же странице.В этом случае Shape можно перемещать, изменяя его свойства Top и Left.К сожалению (крайне), нет способа переместить изображение, изменив точку привязки.Таким образом, единственный способ переместить изображение на другую страницу (или историю) - использовать копирование / вставку.

Если необходимо переместить InlineShape, просто назначьте InlineShape.Range.FormattedText для цели Range.Или расширить диапазон с текстом, чтобы также включить InlineShape.Что касается Word, InlineShape - это символ.

Для достижения поставленной конечной цели

взять текст + изображение, выровненное в таблице (текст слева, изображениесправа), вырвите его из таблицы, но сохраняйте тот левый / правый характер

используйте таблицу с дополнительным столбцом справа.Поместите изображение как InlineShape.Затем можно обработать всю строку, например, следующим образом.

Это создаст новую строку в нужной позиции, скопирует Range.FormattedText строки, которую нужно переместить в новую строку.Удаляет дополнительную создаваемую строку, а также удаляет исходную строку.

Sub MoveRow()
    Dim tbl As Word.Table
    Dim rwToMove As Word.Row
    Dim rwTarget As Word.Row
    Dim rwBeforeTarget As Word.Row
    Dim posNewRow As Long

    posNewRow = 1
    Set rwToMove = Selection.Rows(1)
    Set tbl = rwToMove.Range.Tables(1)
    Set rwBeforeTarget = tbl.Rows(posNewRow)
    Set rwTarget = tbl.Range.Rows.Add(rwBeforeTarget) '(posNewRow)
    rwTarget.Range.FormattedText = rwToMove.Range.FormattedText
    tbl.Rows(posNewRow + 1).Delete
    rwToMove.Delete
End Sub
...