One feature that Microsoft Word has, but Microsoft Access does not have, is the ability to choose a starting label. However, moving your ActiveX barcoding application to Word complicates matters because Word does not support Data Binding. This means that there is no control source property, and you cannot simply bind the control a field in your Access Database.
There are 2 solutions to this problem. Both require some VBA Code. The first and easiest solution is to follow the steps in this Microsoft Knowledge Base article: Q95806. This allows you to remain in Access, but also to choose your starting label (and/or create duplicate labels). If you are more confident with VBA or would rather use Word as your labelling tool, we have developed some sample code for Microsoft Word that will loop through all of the records in an Access table and create barcodes on a label document in Word.
To use the code below:
- Download the Word 97/2000 Template that will allow you to install this macro and others and jump to step 6 or Copy the Sub Main() Routine to the clipboard by highlighting it and pressing Ctrl + C.
- In Microsoft Word, Open the Visual Basic Editor by pressing Alt + F11
- Insert a new Module, by clicking on Insert|Module
- Paste the code into the module
- You must create a reference to Microsoft DAO. Included below is a Macro that can try to create the reference for you. Copy the AddReference macro to your module and run it. If you prefer, you can manually add the reference by going to the Tools Menu in the visual Basic Editor and click on References. Find Microsoft DAO on the list and check the box beside it.
- Change a few details in the code to have the macro open the correct database, table and field and also to the create the correct Labels for your application. (The green comments below indicate where you should make your changes.)
Sub Main() ' This is an example of a fairly simple Word macro that will loop ' through all the records a table in MSAccess, taking the data ' from a field and converting it to barcodes on a MS Word Label ' document ' NB - you must create a reference to Microsoft DAO for this macro ' to work. If you installed this macro using the Install Wizard ' that came with the other ActiveX macros then the reference has ' already been created. ' Last updated April 2001. ' --------------------------------------------------------------- Dim Db, RS, DBName As String, DBTable As String Dim i As Long, j As Long, Rcount As Long, nRow, nCol ' Name with full path of database to open DBName = "C:\Program files\Microsoft Office\Office\" _ & "SamplesNorthwind.mdb" AXMyPath$ = "C:\Temp\" ' folder must exist On Error Resume Next MkDIR AXMyPath$
' Name of table in Database DBTable = "Shippers" ' open database (Must create Reference to Microsoft DAO) Set Db = OpenDatabase(Name:=DBName) ' open Shippers Table Set RS = Db.OpenRecordset(Name:=DBTable) ' Get Record count (for number of labels) Rcount = RS.RecordCount - 1 ' loop through each record in the table For i = 0 To Rcount ' Take the value of the first field and pass it to activex ' You may use the name of the field or its index number: ' e.g. frmMain.TALBarCd1.Message = RS.Fields("fieldname").Value frmMain.TALBarCd1.Message = RS.Fields(1).Value ' save barcode with record number frmMain.TALBarCd1.SaveBarCode AXMyPath$ & "Barcode" & i & ".wmf" ' move to next record RS.MoveNext Next 'I ' close table, then close Database RS.Close Db.Close ' Create new empty labels document - change the Name:= attribute ' to reflect the type of labels you wish to generate Application.MailingLabel.CreateNewDocument Name:="8463", Address:="", _ AutoText:="", LaserTray:=wdPrinterManualFeed SetRow: ' Set starting column and Row nRow = InputBox("Please indicate which Row you would like to start on") nCol = InputBox("Please indicate which Column you would like to start on") ' Check validity of choices If Selection.Information(wdMaximumNumberOfRows) < Val(nRow) Or _ Selection.Information(wdMaximumNumberOfColumns) < Val(nCol) Or _ Val(nRow) <= 0 Or Val(nCol) <= 0 Then If MsgBox("Row must be between 1 and" + Str(Selection.Information(wdMaximumNumberOfRows))_ + ". Column must be between 1 and" + Str(Selection.Information(wdMaximumNumberOfColumns))_ + ". Try again?", vbRetryCancel) = 4 Then GoTo SetRow Else GoTo bye End If End If ' move to requested label While Selection.Information(wdStartOfRangeRowNumber) < Val(nRow) Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdMove Wend While Selection.Information(wdStartOfRangeColumnNumber) < Val(nCol) Selection.MoveRight Unit:=wdCell, Count:=1 Wend For j = 0 To Rcount ' If current cell is padder then move to the next cell If Selection.Information(wdWithInTable) = True Then Do While PointsToInches(Selection.Cells.Width) < 1 Selection.MoveRight Unit:=wdCell Loop End If ' Insert Barcode Selection.InlineShapes.AddPicture FileName:=AXMyPath$ & "barcode" & j & ".wmf", LinkToFile:= _ False, SaveWithDocument:=True ' Move to next cell Selection.MoveRight Unit:=wdCell On Error Resume Next ' Delete last barcode Kill AXMyPath$ & "barcode" & j & ".wmf" On Error GoTo 0 Next 'j bye: End Sub
The Following macro adds the Reference to Microsoft DAO:
Sub AddReference() Dim j, FoundDAORef ' Check/AddReferences: FoundDAORef = False With Documents(ThisDocument.Name).VBProject For j = 1 To .References.Count If .References(j).Guid = "{00025E01-0000-0000-C000-000000000046}" Then FoundDAORef = True End If Next 'j If FoundDAORef = False Then 'add reference to DAO 3.5 or later .References.AddFromGuid "{00025E01-0000-0000-C000-000000000046}", 3, 5 End If End With End Sub
The following macro removes the reference to DAO:
Sub RemoveReference() Dim j, FoundDAORef, RefObj FoundDAORef = False With Documents(ThisDocument.Name).VBProject For j = 1 To .References.Count If .References(j).Guid = "{00025E01-0000-0000-C000-000000000046}" Then FoundDAORef = True End If Next 'j If FoundDAORef = True Then 'remove reference to DAO 3.5 or later Set RefObj = .References("DAO") .References.Remove (RefObj) End If End With set RefObj = Nothing End Sub