0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ExcelでDataMatrixを作りたいので、生成処理を外部アプリに任せてみた

0
Posted at

この記事でやること

Excel のセルに入っている文字列から DataMatrix を作り、帳票へ貼り付けたい場面があります。

方法を調べてみると、有料の Excel アドインや帳票ソフトが多く見つかりました。高機能な帳票設計やサポートが必要なら便利そうですが、今回はセルの文字列から DataMatrix 画像を1枚作りたいだけです。

最初は VBA だけで作れないかと考えました。

ただ、DataMatrix の符号化から PNG 画像の生成まで Excel 側で実装するのは、なかなか大変そうです。

そこで、DataMatrix の生成は外部アプリに任せ、Excel は文字列を渡して PNG 画像を受け取るだけの形にしました。

そのために作ったのが barcode-rest です。

全体の流れはこんな感じです。

gopherくん.png

なぜ 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 により画像を取得できるアプリであれば利用でき、リポジトリには PythonHTML のサンプルも用意しています。

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 にまとめています。

ブラウザでURLを開き、DataMatrix画像が表示された画面.png

VBA サンプルを Excel へ読み込む

リポジトリには、すぐに試せる VBAサンプル を用意しています。

Excel ブックをマクロ有効ブック(.xlsm)として保存し、VBE の「ファイル」から「ファイルのインポート」を選んで vba_example.bas を読み込みます。

VBEでvba_example.basをインポートする画面.png

DataMatrix を作る入口は、次のマクロです。

Public Sub PutDataMatrixExample()
    Call PutBarcode( _
        Range("A1"), _
        Range("A2"), _
        150, _
        "datamatrix", _
        "&size=512")
End Sub

この例では、A1 の文字列から DataMatrix を作り、A2 の位置へ幅150ポイントで貼り付けます。

セルの値から DataMatrix を作る

まず A1 に、DataMatrixへ埋め込みたい文字列を入力します。

「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」から「開発」を有効にします。

次に、「開発」タブの「挿入」から、フォームコントロールのボタンをシートへ配置します。

開発-フォームコントロールからボタン挿入.png

ボタンへ割り当てるマクロとして、PutDataMatrixExample を選びます。

ボタンのマクロを選択.png

ボタンの表示名を「DataMatrix作成」に変更して押すと、barcode-rest が DataMatrix の PNG を生成し、A2 セルの位置へ画像オブジェクトとして配置します。

完成したボタンの押下後.png

VBA の中でやっていること

サンプルの PutBarcode では、次の処理を行っています。

  1. セルの文字列を URL エンコードする
  2. MSXML2.XMLHTTP.6.0 で barcode-rest へ GET する
  3. 返ってきた PNG を一時ファイルへ保存する
  4. Shapes.AddPicture でシートへ画像を埋め込む
  5. 貼り付けが終わったら一時ファイルを削除する

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 を帳票へ貼り付けられるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?