Shapes.AddPicture在Word表中

时间:2018-01-16 16:44:53

标签: vba ms-word word-vba

我使用Word表格作为图片的占位符,其中表格单元格只包含图片而没有文字。

将图片插入Word表时,插入内联形状时没有问题。图片显示在预期的单元格中。但是,使用将图片作为Shape插入的“等效”代码,形状并不总是出现在预期的单元格中。到目前为止,我在Word 2013中看到了这个问题,32位版本。

Sub test()
    Dim s As Shape
    Dim x As String
    Dim f As String
    Dim r As Long
    Dim c As Long
    Dim h As Single
    Dim w As Single
    Dim rng As Word.Range
    Dim ins As Word.InlineShape

    f = "file name of a picture, .bmp .jpg etc."

    Word.Application.ScreenUpdating = False

    If Selection.Information(wdWithInTable) Then
        ' insert a picture in a table cell
        r = Selection.Information(wdStartOfRangeRowNumber)
        c = Selection.Information(wdStartOfRangeColumnNumber)

        With Selection.Tables(1).Cell(r, c)
            Set rng = .Range
            rng.collapse wdCollapseStart
            .Range.Text = ""
            h = .height
            w = .width
        End With

        ' Works reliably
        Set s = Word.Selection.InlineShapes.AddPicture(f, False, True, rng).ConvertToShape
        s.height = h
        s.width = w

        ' Not at all reliable
        ' Set s = Word.ActiveDocument.Shapes.AddPicture(f, False, True, 0, 0, w, h, rng)

    Else
        ' insert a picture at the cursor
        h = 100
        w = 100
        Set s = Word.ActiveDocument.Shapes.AddPicture(f, False, True, 0, 0, w, h)
    End If

    Word.Application.ScreenUpdating = True

    s.WrapFormat.Type = wdWrapInline
    s.Title = "Title"
    s.AlternativeText = "Some metadata"
End Sub

想法是选择文档中表格中的单元格或表格外部页面上的某个单元格。表格外部按预期工作,图片出现在光标位置。

要查看问题,请从新文档,单页开始,添加3 x 3表并稍微加深行。请务必提供要插入的文件,变量f。选择其中一个单元格,然后运行代码。当图片作为内嵌形状插入然后立即转换为形状时,这可以正常工作。这一行发生在这一行:

Set s = Word.Selection.InlineShapes.AddPicture(f, False, True, rng).ConvertToShape

但是,首选的解决方案是从头开始插入一个Shape,代码如下:

Set s = Word.ActiveDocument.Shapes.AddPicture(f, False, True, 0, 0, w, h, rng)

图片出现,但通常不在预期的位置。它可以放在不同的单元格或桌子外的某个地方。

Shapes.AddPicture的rng参数会以某种方式被忽略或损坏吗?

使用3 x 3表格进行更多尝试 - 添加图片然后设置每个可能的WrapFormat.Type(有8个可能的值),我看到:

  • 除了WrapFormat.Type以外的每个wdWrapInLine,图片插入只要在表格行从左到右完成就可以正常工作,并且;
  • 对于每个WrapFormat.Type毫无例外,当该行最初为空时,插入第2列或第3列的图片会出现在左侧的一列中。

缩小图片(例如设置h = .height * 0.5w = .width * 0.5)对展示位置没有影响。

非常感谢您的任何见解或澄清。

2 个答案:

答案 0 :(得分:2)

主要问题似乎是插入错误列的图片。这是因为空表格单元格的“焦点”(范围的位置)在前一个单元格中具有其起始点。真的没有多大意义,但这就是Word的工作原理......

尝试将范围折叠到结尾,而不是从代码中提取此摘录中的开始(wdCollapseEnd):

    With Selection.Tables(1).Cell(r, c)
        Set rng = .Range
        rng.collapse wdCollapseEnd 'instead of wdCollapseStart
        .Range.Text = ""
        h = .height
        w = .width
    End With

答案 1 :(得分:0)

最后,选择性地使用rng.collapse就可以了。我还没有检查Word 2010或2016中的行为是否相同。

对于表格行中任何位置的第一个形状rng.collapse wdCollapseEnd

对于该表格行的所有后续形状rng.collapse wdCollapseBegin

我使用以下代码来计算表格行中的形状:

Dim numShapes() As Integer
Dim cel As Word.cell

ReDim numShapes(1 To Selection.Tables(1).Rows.Count)
For Each cel In Selection.Tables(1).Range.Cells
    If cel.Range.ShapeRange.Count <> 0 Then
        numShapes(cel.RowIndex) = numShapes(cel.RowIndex) + 1
    End If
Next cel

,支票就是

If numShapes(r) <> 0 Then
    rng.collapse wdCollapseStart
Else
    rng.collapse wdCollapseEnd
End If

其中r是第一个代码示例中的行号。

合并细胞的初步实验表明存在其他问题......