我使用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.5
和w = .width * 0.5
)对展示位置没有影响。
非常感谢您的任何见解或澄清。
答案 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
是第一个代码示例中的行号。
合并细胞的初步实验表明存在其他问题......