使用vba

时间:2018-01-03 16:35:12

标签: vba ms-word word-vba

我正在编写一个简单的代码来定位文档中的形状(实际上是图片)。我想让他们定位:

  • 水平到正好0毫米。从可打印区域的左侧

  • 垂直至7毫米。在段落下面(形状锚定到的)

我写了一个简单的代码:

Selection.ShapeRange.RelativeHorizontalPosition = wdRelativeHorizontalPositionColumn
Selection.ShapeRange.Left = MillimetersToPoints(0)
Selection.ShapeRange.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph
Selection.ShapeRange.Top = MillimetersToPoints(7)

Selection.ShapeRange.WrapFormat.Type = wdWrapTopBottom

对于页面上的1个形状,它可以正常工作。但如果有超过1个形状,它会以某种方式"抛出"第二个形状到页面顶部。看起来Word将它锚定到页面上的第1段。但它不应该。同时水平定位还可以。

感谢您解决此问题的任何帮助。

我对这个问题的可能解决方案如下:

Sub PositShape_3()
Dim I As Integer

If Selection.InlineShapes.Count <> 0 Then
  For I = Selection.InlineShapes.Count To 1 Step -1
    Selection.InlineShapes(I).ConvertToShape
  Next I
End If

Selection.ShapeRange.RelativeHorizontalPosition = wdRelativeHorizontalPositionColumn
Selection.ShapeRange.Left = MillimetersToPoints(0)
Selection.ShapeRange.RelativeVerticalPosition = wdRelativeVerticalPositionLine
Selection.ShapeRange.Top = MillimetersToPoints(7)

Selection.ShapeRange.WrapFormat.Type = wdWrapTopBottom

End Sub    

尽管使用wdRelativeVerticalPositionLine解决了这个问题,但仍然有趣的是为什么使用wdRelativeVerticalPositionParagraph会产生意想不到的意外后果。

1 个答案:

答案 0 :(得分:0)

请注意在您向我们展示的代码中使用SELECTION。如果不更改段落选择,则形状将始终锚定到同一段落。在Word中使用选择是很棘手的;使用更有形的对象(例如特定段落)会更好。

以下代码示例说明如何使用段落对象来锚定和定位连续添加的形状。

Sub insertShapesProgressively()
  Dim shp As word.Shape
  Dim shpRng As word.ShapeRange
  Dim rng As word.Range
  Dim iParaCounter As Long

  'We want to insert the Shape anchored to three different paragraphs
  ' on the same page
  For i = 7 To 9
    Set rng = ActiveDocument.Paragraphs(i).Range
    Set shp = ActiveDocument.shapes.AddShape(msoShapeWave, 0, 0, 10, 10, rng)
    Set shpRng = rng.ShapeRange
    shpRng.RelativeHorizontalPosition = wdRelativeHorizontalPositionColumn
    shpRng.Left = MillimetersToPoints(0)
    shpRng.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph
    shpRng.Top = MillimetersToPoints(7)
    shpRng.WrapFormat.Type = wdWrapTopBottom
  Next
End Sub