Microsoft Office WordでCode 128のバーコードを表示するVBAコードを書く
やりたいこと
WordでCode 128のバーコードを表示するためのVBAコードを実装したい
ChatGPTにサンプルコードを聞いてみた
手始めにChatGPTでサンプルコードをいくつか生成してもらってどの方法にするか検討することにした。
使った質問としては
wordファイル内のテキストボックスにcode 128の1次元バーコードを入力するexcel vbaのコードを教えてください
"Code 128"のフォントを使って表示する方法
別途、Code 128のフォントをインストールする必要がある。
Sub InsertCode128BarcodeToWordTextbox()
'Wordオブジェクトモデルの設定
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
'Wordファイルのパスとファイル名を指定
Dim strDocPath As String
strDocPath = "C:\Sample.docx"
'Wordファイルを開く
Dim objDoc As Object
Set objDoc = objWord.Documents.Open(strDocPath)
'テキストボックスを選択
Dim objTextbox As Object
Set objTextbox = objDoc.Shapes("TextBox 1").TextFrame.TextRange
'バーコードを挿入
objTextbox.Select
objWord.Selection.Font.Name = "Code 128"
objWord.Selection.Font.Size = 12
objWord.Selection.TypeText "1234567890"
'Wordファイルを保存して閉じる
objDoc.Save
objDoc.Close
'Wordオブジェクトを終了
objWord.Quit
Set objWord = Nothing
End Sub
"Microsoft Barcode Control 16.0" を利用する方法
別途、「Microsoft Barcode Control 16.0」というActiveXコントロールを参照する必要がある。
VBAエディタのツールメニューから「参照設定」を選択し、「Microsoft Barcode Control 16.0」を有効にする。
※Mac OSではActiveXコントロールを利用することができないので、MacのWord環境では動かない。
Sub InsertBarcodeInTextBox()
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Dim wdTextBox As Word.Shape
Dim bcBarcode As MSForms.Barcode
Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents.Open("C:\MyDocument.docx") ' ファイル名を指定
Set wdTextBox = wdDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, 50, 50, 100, 50)
Set bcBarcode = wdDoc.BarcodeControl1.Barcode
' バーコードに変換する文字列を設定
bcBarcode.Value = "1234567890"
bcBarcode.Symbology = 3 ' Code 128
bcBarcode.BarcodeWidth = 2
' バーコードをテキストボックスに挿入
wdTextBox.Select
bcBarcode.RenderSelection wdTextBox.TextFrame.TextRange
wdDoc.Save
wdDoc.Close
wdApp.Quit
End Sub
業務で使う予定もあり、他の人への配布を考えると "Microsoft Barcode Control 16.0" を利用する方法を選んだ。
(補足)
調べていく中で"Microsoft Barcode Control"を使わないほうがよいという記事がありました。
Excel VBAでQRコードを生成するライブラリが紹介されていました。
これらを使う方法もありかもしれません。(が、セキュリティー面から少し慎重に検討したい)
「Microsoft Barcode Control 16.0」の参照設定
VBAエディタのメニューから「ツール>参照設定」から「Microsoft Barcode Control 16.0」を探しても見つからなかった。
Microsoft Barcode Control 16.0はMicrosoft Access に付属しているようで、使っていたPCにはAccessがインストールされていなかった。
Accessのランタイムだけインストールすることができるようなので、Microsoftのダウンロードページからダウンロードしてインストールしてみました。
インストールが完了すると「Microsoft Access BarCode Control 16.0」を参照設定できるようになりました。
まずはGUIでバーコードを生成する
「開発」タブ>コントロールの中にある「コントロールの選択」をクリック>「Microsoft Barcode Control 16.0」を選択
正常にインストールできていると以下のようにサンプルのバーコードが表示されます
VBAでバーコードを生成する(失敗パターン)
まずはChatGPTで生成したコードを実行してみる。
Sub InsertBarcodeInTextBox()
Dim wdDoc As Word.Document
Dim wdTextBox As Word.Shape
Dim bcBarcode ' As MSForms.Barcode <- 参照できなかったので可変型にした
Set wdDoc = ThisDocument
Set wdTextBox = wdDoc.Shapes.AddTextbox(msoTextOrientationHorizontal, 50, 50, 100, 50)
Set bcBarcode = wdDoc.BarcodeControl1.Barcode
' バーコードに変換する文字列を設定
bcBarcode.Value = "1234567890"
bcBarcode.Symbology = 3 ' Code 128
bcBarcode.BarcodeWidth = 2
' バーコードをテキストボックスに挿入
wdTextBox.Select
bcBarcode.RenderSelection wdTextBox.TextFrame.TextRange
wdDoc.Save
wdDoc.Close
End Sub
すると、以下の部分でプロパティを参照できないエラーになった。
Set bcBarcode = wdDoc.BarcodeControl1.Barcode
そもそもドキュメント中にBarcodeControl1
というオブジェクトを生成していないためである。
やはり、ChatGPTで生成したコードを鵜呑みにしてはならぬ。
VBAでバーコードを挿入して、選択している箇所に挿入するコード(成功)
以下の例では、文書中で選択している位置にCode 128のバーコードを作成して挿入するコードです。
Sub InsertBarcodeAtSelection()
Dim wdDoc As Word.Document
Dim inlineShape As Word.InlineShape
Dim objBarcode As Object
Set wdDoc = ThisDocument
' 選択している位置にバーコードを挿入する
Set insertPosition = Selection.Range
Set inlineShape = wdDoc.InlineShapes.AddOLEControl(ClassType:="BARCODE.BarCodeCtrl.1", Range:=insertPosition) ' バーコードを作成してinsertPositionの位置に挿入する
Set objBarcode = inlineShape.OLEFormat.Object ' 生成したBarCodeオブジェクトを取得
objBarcode.Style = 7 ' バーコードのスタイルを"Code 128"に設定
objBarcode.Value = "1234567890" ' バーコードが表す値を設定
End Sub
解説
今回は文字列に並べて(段落中に)バーコードを挿入するようにしました。
InlineShapes
オブジェクトのAddOLEControl
メソッドを使うことでバーコードのオブジェクトを作成して挿入できます。
Set inlineShape = wdDoc.InlineShapes.AddOLEControl(ClassType:="BARCODE.BarCodeCtrl.1", Range:=insertPosition)
そして、作成したBarCodeCtrl
オブジェクトはinlineShape.OLEFormat.Object
によって取得できます。
BarCodeCtrl
オブジェクトの各プロパティの説明はプロパティウィンドウにある「ヘルプ」から確認することができます。(ネット上では見つからず...。)
右下のヘルプをクリックすると、リファレンスを参照できます。
このコードで設定している値はバーコードのスタイルと値です
objBarcode.Style = 7 ' バーコードのスタイルを"Code 128"に設定
objBarcode.Value = "1234567890" ' バーコードが表す値を設定
<<barcode>>
という文字列の箇所にバーコードを挿入する
応用:文書中にあるInlineShapes.AddOLEControl
メソッドでRange
パラメータを指定すれば任意の箇所にバーコードを挿入できるので、文書中にある<<barcode>>
という文字列を置換する形式でバーコードを挿入する。
Sub InsertBarcodeInDocument()
Dim wdDoc As Word.Document
Dim inlineShape As Word.InlineShape
Dim objBarcode As Object
Set wdDoc = ThisDocument
' <<barcode>> という文字列を検索してその位置にバーコードを挿入する
Set insertPosition = wdDoc.Content
insertPosition.Find.Execute FindText:="<<barcode>>", ReplaceWith:="" ' 文字列<<barcode>>を空文字で置き換えて、その位置を選択状態にする
If insertPosition.Find.Found = True Then
Set inlineShape = wdDoc.InlineShapes.AddOLEControl(ClassType:="BARCODE.BarCodeCtrl.1", Range:=insertPosition) ' 文字列があった箇所にバーコードを挿入する
Set objBarcode = inlineShape.OLEFormat.Object ' 生成したBarCodeオブジェクトを取得
' バーコードに変換する文字列を設定
objBarcode.Style = 7 'Code 128 を指定
objBarcode.Value = "1234567890"
End If
End Sub
例えば以下のような文章がある場合
コードを実行するとバーコードに置き換わります。
また、フッターにバーコードを挿入したい場合もフッターのRange
を指定すれば良いだけなので、
Set insertPosition = wdDoc.Sections(1).Footers(wdHeaderFooterPrimary).Range
と指定してあげれば、フッターに挿入できます。
バーコードの高さ、幅を指定する
それぞれHeight
, Width
を設定すればOK。
objBarcode.Height = 30 'バーコードの高さを設定
objBarcode.Width = 100 'バーコードの幅を設定
プロパティウィンドウにあるパラメータを変更可能。