移动图像而无需复制/粘贴

时间:2019-03-29 12:56:53

标签: vba ms-word clipboard

现在,我有一个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 个答案:

答案 0 :(得分:1)

仅在目标位于同一页面上时才能移动Shape。在这种情况下,可以通过更改形状的顶部和左侧属性来移动它。不幸的是(极端),无法通过更改锚点来移动图像。因此,将图像移到另一页(或故事)的唯一方法是使用复制/粘贴。

如果要移动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