VBA Word Shape位置 - 左上角

时间:2018-02-16 09:10:48

标签: vba word-vba qr-code shape

我根据Stroke Scribe ActiveX对象的制作人提供的示例编写了一个小函数。这是一个插件,允许我们通过VBA Macro在Microsoft Word中创建QR码对象。

问题在于设置形状位置

shp.Left = 0 + LeftMargin
shp.Top = 0 + TopMargin

我想把这个形状(QR码)放在最左上角的特定页面上。但有时形状会跳到上一页(在底部)或其他位置(垂直中心)。

你能帮我识别一个问题并修复它,每次都在左上角找到Shape Object吗?

代码:

Sub QRCodeGenerator(SOP, BookmarkID, Page, TopMargin, LeftMargin)
Dim doc As Document
Set doc = Application.ActiveDocument



For Each sh In doc.Shapes
  If sh.Type = msoOLEControlObject Then
    If sh.OLEFormat.ProgID = "STROKESCRIBE.StrokeScribeCtrl.1" Then
      sh.Delete
    End If
  End If
Next

With doc.PageSetup
   usable_w = .PageWidth
   usable_h = .PageHeight
End With

Dim pg As Range
Set pg = doc.GoTo(wdGoToPage, wdGoToRelative, Page)

Dim shp As Shape
Set shp = doc.Shapes.AddOLEControl(ClassType:="STROKESCRIBE.StrokeScribeCtrl.1", Anchor:=pg)

Dim sMyString As String
sMyString = ActiveDocument.Bookmarks(BookmarkID).Range.Text
sMyString = Replace(sMyString, "FORMTEXT ", "")

shp.LockAspectRatio = msoFalse
shp.Height = InchesToPoints(0.6)
shp.Width = shp.Height
shp.Left = 0 + LeftMargin
shp.Top = 0 + TopMargin ' // usable_h - shp.Height * 3 + TopMargin

Dim ss As StrokeScribe
Set ss = shp.OLEFormat.Object

ss.Alphabet = QRCODE 'StrokeScribe will draw a QR code picture
ss.Text = SOP & ";" & sMyString 'Any text you want to encode in the barcode
ss.QrECL = H  'Changes the default error correction level. This can be omitted
ss.QrMinVersion = 3 'Specifies the minimum barcode size. This can be omitted
ss.FontColor = RGB(0, 0, 0)
' ss.UTF8 = True 'Enable this, if you want to encode national characters for smartphones
If ss.Error Then
   MsgBox ss.ErrorDescription
End If

End Sub 

1 个答案:

答案 0 :(得分:0)

Word SHAPE对象必须锚定到Range。该范围的页面位置确定Shape将显示在哪个页面上。你无能为力"锁定"一个特定页面的形状。

也就是说,可以指示Shape始终出现在锚定范围所在的任何页面上的相同位置。

如果在文档编辑完成之前添加这样的Shape,这总是很棘手,因为编辑可以将锚定段落移动到不同的页面。它可以帮助选择一个段落作为不可能移动的锚点,例如可能是页面上的第一段。

我很久以前做过的一件事就是写一个宏,在打印或保存之前检查Shapes的页面位置。插入和定位Shape时,我给它一个包含页码的名称。在打印/保存之前,宏会检查Shape名称中的页码以及Shape所在的页面。如果两者不匹配,请剪切形状并将其粘贴到正确页面上的段落(它会记住其位置设置)。

下面的代码示例演示如何命名Shape,将锚点锁定到特定段落,并将Shape flush置于页面的左上角。

Sub ShapePosTopLeft()
    Dim doc As word.Document
    Dim shp As word.Shape
    Dim rng As word.Range

    Set doc = ActiveDocument
    Set rng = doc.GoTo(wdGoToPage, wdGoToRelative, Page)
    Set rng = rng.Paragraphs(1).Range
    Set shp = doc.Shapes.AddOLEControl(ClassType:="STROKESCRIBE.StrokeScribeCtrl.1", Anchor:=rng)


    With shp
        .Name = "Shape_Page" & Page
        .LockAnchor = True
        .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
        .RelativeVerticalPosition = wdRelativeVerticalPositionPage
        .Left = 0
        .Top = 0
    End With
End Sub