我根据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
答案 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