この記事でやること
Excel のセルに入っている文字列から DataMatrix を作り、帳票へ貼り付けたい場面があります。
方法を調べてみると、有料の Excel アドインや帳票ソフトが多く見つかりました。高機能な帳票設計やサポートが必要なら便利そうですが、今回はセルの文字列から DataMatrix 画像を1枚作りたいだけです。
最初は VBA だけで作れないかと考えました。
ただ、DataMatrix の符号化から PNG 画像の生成まで Excel 側で実装するのは、なかなか大変そうです。
そこで、DataMatrix の生成は外部アプリに任せ、Excel は文字列を渡して PNG 画像を受け取るだけの形にしました。
そのために作ったのが barcode-rest です。
全体の流れはこんな感じです。
なぜ Excel だけで DataMatrix を作らないのか
Excel は帳票を作るには便利ですが、DataMatrix の生成処理まで持たせると、VBA 側の仕事が一気に増えます。
- DataMatrix の符号化処理が必要になる
- 誤り訂正や配置規則を扱う必要がある
- 生成結果を画像として作る必要がある
- Excel の環境ごとの差も気にする必要がある
帳票へ DataMatrix を貼りたいだけなのに、生成部分の実装と保守が大仕事になります。
そこで、生成処理は外部アプリへ切り出しました。
Excel 側はセルの文字列を HTTP GET で渡し、返ってきた PNG を貼り付けるだけです。
全体構成
barcode-rest は、受け取った文字列から DataMatrix を生成して PNG で返します。
Excel VBA は、セルの値を読み取り、barcode-rest を呼び出して、返ってきた PNG をシートへ貼り付けます。
REST API を使うことが目的ではなく、Excel と外部アプリの受け渡しに HTTP が扱いやすかった、という順番です。
この記事では Excel VBA から使いますが、barcode-rest 自体は Excel 専用ではありません。同じ PC 上で HTTP GET により画像を取得できるアプリであれば利用でき、リポジトリには Python と HTML のサンプルも用意しています。
barcode-rest を起動する
Releases から barcode-rest.exe をダウンロードして起動します。
.\barcode-rest.exe
barcode-rest は 127.0.0.1:8787 で待ち受けます。
ブラウザで次の URL を開くと、ABC123 を埋め込んだ DataMatrix の PNG が表示されます。
http://127.0.0.1:8787/datamatrix?text=ABC123&size=512
text が埋め込む文字列、size が出力画像の一辺のサイズです。
周囲の余白は quiet で調整でき、省略した場合は4モジュール分の余白が付きます。ほかのパラメータは README にまとめています。
VBA サンプルを Excel へ読み込む
リポジトリには、すぐに試せる VBAサンプル を用意しています。
Excel ブックをマクロ有効ブック(.xlsm)として保存し、VBE の「ファイル」から「ファイルのインポート」を選んで vba_example.bas を読み込みます。
DataMatrix を作る入口は、次のマクロです。
Public Sub PutDataMatrixExample()
Call PutBarcode( _
Range("A1"), _
Range("A2"), _
150, _
"datamatrix", _
"&size=512")
End Sub
この例では、A1 の文字列から DataMatrix を作り、A2 の位置へ幅150ポイントで貼り付けます。
セルの値から DataMatrix を作る
まず A1 に、DataMatrixへ埋め込みたい文字列を入力します。
「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」から「開発」を有効にします。
次に、「開発」タブの「挿入」から、フォームコントロールのボタンをシートへ配置します。
ボタンへ割り当てるマクロとして、PutDataMatrixExample を選びます。
ボタンの表示名を「DataMatrix作成」に変更して押すと、barcode-rest が DataMatrix の PNG を生成し、A2 セルの位置へ画像オブジェクトとして配置します。
VBA の中でやっていること
サンプルの PutBarcode では、次の処理を行っています。
- セルの文字列を URL エンコードする
-
MSXML2.XMLHTTP.6.0で barcode-rest へ GET する - 返ってきた PNG を一時ファイルへ保存する
-
Shapes.AddPictureでシートへ画像を埋め込む - 貼り付けが終わったら一時ファイルを削除する
Excel 側では DataMatrix の生成方法を知らなくても、PNG を受け取って貼り付けられればよい形になっています。
この構成でうれしいこと
- DataMatrix の生成処理を VBA に書かなくてよい
- Excel 側の処理を、文字列の送信と画像の貼り付けに絞れる
- DLL の登録や Excel アドインの導入がいらない
- 外部サービスへ文字列を送らず、ローカル PC の中だけで完結する
- 出荷票や現品票など、既存の Excel 帳票へ組み込みやすい
- Excel 以外のアプリからも HTTP GET で利用できる
ほかのバーコードも生成できる
今回は DataMatrix の生成のために作りましたが、その後、QR コードや Code128、JAN コードなどにも対応を広げました。
ただし、この記事では DataMatrix の生成に絞ります。対応形式やパラメータは README にまとめています。
注意点
- Windows 版 Excel と VBA からの利用を想定している
- barcode-rest を起動してからマクロを実行する必要がある
- マクロを使うため、ブックは
.xlsm形式で保存する - 印刷する場合は、実際のプリンターとスキャナーで読み取りを確認する
- DataMatrix の周囲に必要な余白を確保し、画像を無理に引き伸ばさない
barcode-rest はローカル帳票の補助用として、127.0.0.1 だけで待ち受けるようにしています。
まとめ
Excel 帳票に DataMatrix を貼りたいだけなら、生成処理まで VBA で抱える必要はありません。
DataMatrix の生成は barcode-rest に任せ、Excel はセルの文字列を渡して PNG を受け取る。この形にすると、Excel 側の処理をかなりシンプルにできます。
実際に、セルへ文字列を入力してマクロを実行するだけで、DataMatrix を帳票へ貼り付けられるようになりました。





