Open9

Microsoft Office WordでCode 128のバーコードを表示するVBAコードを書く

Yuma ItoYuma Ito

やりたいこと

WordでCode 128のバーコードを表示するためのVBAコードを実装したい

Yuma ItoYuma Ito

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" を利用する方法を選んだ。

Yuma ItoYuma Ito

(補足)
調べていく中で"Microsoft Barcode Control"を使わないほうがよいという記事がありました。

https://qiita.com/Umazular/items/9d879e0530629211d8d4

Excel VBAでQRコードを生成するライブラリが紹介されていました。

https://qiita.com/santarou6/items/d623417ea8ba33756108

https://github.com/yas78/QRCodeLibVBA

これらを使う方法もありかもしれません。(が、セキュリティー面から少し慎重に検討したい)

Yuma ItoYuma Ito

「Microsoft Barcode Control 16.0」の参照設定

VBAエディタのメニューから「ツール>参照設定」から「Microsoft Barcode Control 16.0」を探しても見つからなかった。

Microsoft Barcode Control 16.0はMicrosoft Access に付属しているようで、使っていたPCにはAccessがインストールされていなかった。
Accessのランタイムだけインストールすることができるようなので、Microsoftのダウンロードページからダウンロードしてインストールしてみました。

https://support.microsoft.com/ja-jp/office/microsoft-365-access-runtime-をダウンロードしてインストールする-185c5a32-8ba9-491e-ac76-91cbe3ea09c9

インストールが完了すると「Microsoft Access BarCode Control 16.0」を参照設定できるようになりました。

Yuma ItoYuma Ito

まずはGUIでバーコードを生成する

「開発」タブ>コントロールの中にある「コントロールの選択」をクリック>「Microsoft Barcode Control 16.0」を選択

正常にインストールできていると以下のようにサンプルのバーコードが表示されます

Yuma ItoYuma Ito

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

https://learn.microsoft.com/ja-jp/office/vba/Language/Reference/User-Interface-Help/object-doesn-t-support-this-property-or-method-error-438

そもそもドキュメント中にBarcodeControl1というオブジェクトを生成していないためである。

やはり、ChatGPTで生成したコードを鵜呑みにしてはならぬ。

Yuma ItoYuma Ito

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)

https://learn.microsoft.com/ja-jp/office/vba/api/word.inlineshapes.addolecontrol

そして、作成したBarCodeCtrlオブジェクトはinlineShape.OLEFormat.Objectによって取得できます。

BarCodeCtrlオブジェクトの各プロパティの説明はプロパティウィンドウにある「ヘルプ」から確認することができます。(ネット上では見つからず...。)


右下のヘルプをクリックすると、リファレンスを参照できます。

このコードで設定している値はバーコードのスタイルと値です

objBarcode.Style = 7 ' バーコードのスタイルを"Code 128"に設定
objBarcode.Value = "1234567890" ' バーコードが表す値を設定
Yuma ItoYuma Ito

応用:文書中にある<<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

と指定してあげれば、フッターに挿入できます。

Yuma ItoYuma Ito

バーコードの高さ、幅を指定する

それぞれHeight, Widthを設定すればOK。

objBarcode.Height = 30 'バーコードの高さを設定
objBarcode.Width = 100 'バーコードの幅を設定

プロパティウィンドウにあるパラメータを変更可能。