Last active
March 26, 2020 15:58
-
-
Save larsschenk/d5edd3db92b07e463945cf7e8ce6529c to your computer and use it in GitHub Desktop.
Word Macro (VBA) to add one barcode to each page containing a variable content and a page number.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Option Explicit | |
' Konzept - Barcode beim Öffnen eines Dokumentes hinzufügen. | |
' | |
' Ein oder mehrere Barcodes werden beim Öffnen eines Dokumentes bzw. beim Aufrufen von | |
' AddBarcodes unter bestimmten Bedinungen eingefügt. | |
' Auf jeder Seite wird unten rechtes jeweils ein Barcode eingefügt. | |
' Barcodes werden nicht als InlineShape eingefügt sondern als ein freei fließenes Shape. | |
' Damit wird die Positionierung des Barcodes flexibel ermöglicht. | |
' Als InlineShape kann der Barcode nicht frei im Dokument positioniert werden sondern muss | |
' sich Inline im Text befinden. | |
' Nachteil: Frei positionierbare Objekte sind nicht absolut stabil. | |
' Es kann Probleme geben wenn die frei positionierbaren Objekte in der Position verändert werden. | |
' | |
' Es wird getestet ob ein Barcode bereits eingefügt wurde. | |
' Wenn ein Barcode bereits existiert, werden keine weiteren Barcodes eingefügt. | |
' Aber alle Barcodes werden mit einem aktuellen Timestamp versehen. | |
' | |
' Wenn noch kein Barcode vorhanden ist soll der Barcode mit einem bestimmten Wert belegt werden. | |
' Dieser Wert ist dem Dokument zu entnehmen - z.b. immer bestimmte Werte aus einem Feld oder | |
' einem Bookmark. Derzeit wird zur Demo die aktuelle Zeit in den Barcode übernommen. | |
' | |
' Der Barcode soll beim Einfügen immer ans untere, rechte Ende einer jeden Seite eingefügt werden. | |
' Da die Dokumente unterschiedliche Formate haben können (z.B. Portrait und Landscape), | |
' kann keine statische Position verwendet werden. Diese muss ermittelt werden. | |
' | |
' Der naheliegende Ansatz Barcode im Header oder Footer zu verwenden, funktioniert hier nicht, da | |
' nur ein BarcodeObjekt in den Header/Footer verwendet werden kann der dann für alle Seiten identisch ist. | |
' Ändert man den Text in Barcode in Header/Footer so ändert sich der Barcode | |
' für alle Seiten was nicht gewünscht ist. Daher müssen Barcode je Seite eingefügt werden. | |
' Das ist eine komplexere Aufgabe und erfordert Beachtung wenn Seiten neu eingefügt oder gelöscht werden. | |
' Hierbei müssen dann die Seitenzahlen neu zugewiesen werden. | |
' Insofern stellt dieser Lösungsansatz nur eine rudimentäre Lösung für dieses komplexe Problem dar. | |
' | |
' (c) 2019-2020 www.activebarcode.de | |
' Lars Schenk, info@activebarcode.de | |
' | |
' Check if a barcode is already created | |
' Return TRUE if there is a barcode | |
Private Function DocumentHasABarcode() As Boolean | |
Dim result As Boolean | |
result = False | |
Dim shp As Shape | |
Dim sVersion As String | |
For Each shp In ActiveDocument.Shapes | |
If shp.Type = msoOLEControlObject Then | |
sVersion = shp.OLEFormat.Object.Version | |
If (VBA.Left(sVersion, 2) = "6.") Then | |
result = True | |
End If | |
End If | |
Next | |
DocumentHasABarcode = result | |
End Function | |
' This public sub cam be called from makros, too. | |
' It will also be called whenever a documen is opened. | |
Public Sub AddBarcodes() | |
Dim widthInPoints As Double | |
Dim heightInPoints As Double | |
Dim barcodeText As String | |
Dim shouldAddBarcode As Boolean | |
widthInPoints = 200 | |
heightInPoints = 75 | |
' Use timestamp as barcode text to show some usaful stuff in this concept | |
barcodeText = Time ' Can be used from bookmark or field | |
' Test if a barcode already exists to avoid adding multiple barcodes | |
' TODO add more condition here when not to add barcodes. I.e. if required datasource are not available. | |
shouldAddBarcode = Not DocumentHasABarcode() | |
If shouldAddBarcode Then | |
Dim aBarcode As Object | |
Dim pge As Page | |
Dim pgNumber As Integer | |
pgNumber = 0 | |
For Each pge In ActiveDocument.ActiveWindow.Panes(1).Pages | |
pgNumber = pgNumber + 1 | |
' pre ActiveBarcode Version 6.8.0 use: | |
' ClassType:="BARCODE.BarcodeCtrl.1" | |
' since ActiveBarcode Version 6.8.0: | |
Set aBarcode = ActiveDocument.Shapes.AddOLEControl(ClassType:="ACTIVEBARCODE.BarcodeCtrl.1", _ | |
Anchor:=ActiveDocument.GoTo(What:=wdGoToPage, Count:=pgNumber)) | |
' position barcode to the end of the page: | |
aBarcode.OLEFormat.Object.Text = barcodeText + " Page: " + CStr(pgNumber) | |
' Set type to Datamatrix24x24 (56) | |
aBarcode.OLEFormat.Object.Type = 56 | |
aBarcode.top = ActiveDocument.PageSetup.PageHeight - _ | |
ActiveDocument.PageSetup.BottomMargin - _ | |
ActiveDocument.PageSetup.FooterDistance - _ | |
heightInPoints | |
aBarcode.Left = ActiveDocument.PageSetup.PageWidth - _ | |
ActiveDocument.PageSetup.RightMargin - _ | |
widthInPoints | |
aBarcode.Width = widthInPoints | |
aBarcode.Height = heightInPoints | |
Next | |
Else | |
' Iterate through all barcodes and set new text. | |
Dim sVersion As String | |
Dim shp As Shape | |
For Each shp In ActiveDocument.Shapes | |
If shp.Type = msoOLEControlObject Then | |
sVersion = shp.OLEFormat.Object.Version | |
If (VBA.Left(sVersion, 2) = "6.") Then | |
shp.OLEFormat.Object.Text = barcodeText | |
End If | |
End If | |
Next | |
End If | |
End Sub | |
' Event Handler when opening a document. | |
Private Sub Document_Open() | |
' Enable this line if you wanto automatically add Barcodes when opening a document: | |
' AddBarcodes | |
' With this the line above commented out, you will have to start the macro "AddBarcodes" manually. | |
End Sub |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Screenshot when using his VBA macro on a document with two pages.
Content of the barcodes is a timestamp and the page number.