Power Automate for desktop 「QRコードの画像を作成保存してみる」

概要

さまざまなサービスで利用されるQRコードはとても便利ですよね。みなさんはどのように生成しているでしょうか。WEBサービスや有償無償のソフトウェアなどさまざまな手段があります。Google Charts InfographicsAPIがとても便利ですが、いつ終了するのかわからないのが残念です。

そこでQRコードについて調べ、Power Automate for desktopとExcelを利用して画像を作成する方法を考えました。多少機能は限定されますがMS製品のみで作成でき、用等によっては十分かなと思いました。

Q1

Q2

環境

  • Windows 10 21H2
  • Microsoft 365 開発者プログラム

注意事項

  • ActiveXコントロールを使用します。
  • 何かに使えるかもしれないくらいのネタとして考えてください。
  • Microsoft Access 2016 Runtimeが必要になる場合があります。
  • 今回の方法では半角英数記号のみ利用可能です。
  • QRコードの仕様等については各自お調べください。
  • 自己責任でお願いいたします。

仕組み

Microsoft BarCode Control16.0をExcelワークシート上に呼び出してQRコードを作成し、クリップボード経由でPNG画像を生成します。

Excelはセル内容をデータとしてコピーと、セルやオブジェクトを画像データとしてコピーができます。

VBSスクリプトからQRコードを生成し、図としてコピーします。その時オプションにBitmapを指定することでクリップボードを経由してPowerShellでその内容をPNG画像として保存します。フローは次のようになります。

  1. 特別なフォルダーを取得

  2. ファイルからテキストを読み取ります。 QRコードを作成する文字のリストをテキストファイルから読み取ります。Microsoft BarCode Control16.0では半角英数記号のみとなります。今回のフローでは文字列をそのままファイル名に使用しているので、¥や\などの記号は使えません。デスクトップにQRコードフォルダーを作りList.txtを作成しています。

  3. Excelの起動

  4. For each テキストのリストを反復処理に使っています。

  5. VBScriptの実行 変数を宣言し、ワークシートにBarCodeCtrlを呼び出したあとプロパティを設定しQRコードを作成します。.CopyPictureのオプションを指定してBitmapとしてコピーします。その後オブジェクトを破棄します。

Option Explicit
Dim XlApp
Dim XlSheet
Dim OleObject
Dim BarcodeObject

Set XlApp = GetObject("Book1").Application
Set XlSheet = XlApp.Worksheets(1)

Set OleObject = XlSheet.OLEObjects.Add("BARCODE.BarCodeCtrl.1")
Set BarcodeObject = OleObject.Object
With BarcodeObject
	.Style =11
	.Height = 150
	.Width = 150
	.Validation = 1
	.Value = "%CurrentItem%"
	.Refresh
End With

BarcodeObject.CopyPicture 1,2

OLEObject.Delete
Set XlApp = Nothing
Set XlSheet = Nothing
Set OleObject = Nothing
Set BarcodeObject = Nothing
  1. PowerShellスクリプト実行 クリップボードの中身をPNGとして保存します。

$Image = Get-Clipboard -Format Image
$Image.Save("%SpecialFolderPath%\QRコード\%CurrentItem%.png")
  1. End

  2. Excelを閉じる

まとめ

良い点

  • MS製品のみで構成できる。
  • 半角英数記号で足りる用途なら十分

いまいちな点

  • あまり速度が速くない (100枚生成で90秒程度(Core i7 3770k))

  • クリップボードから出力したファイルサイズが大きめ(PowerShellを使用して201X201で出力した場合3.5k~4kバイト、Imagemagickで出力した場合500バイト)

  • 条件はわかりませんが、空白ファイルがつくられるときもありました。

  • 日本語を埋め込めない。

以上の点から別の方法も模索しました。PythonのライブラリのPillowとqrcodeを利用するのが簡単で個人的にはしっくりきました。しかし、いろいろインストールできない環境では今回のフローもアリかなあと思います。とりあえずやってみないとわからないとうことで。💦

余談ですがGoogle ChormeはURLのQRコード画像を生成できるんですね。

Chorome

QRinfoGraphics

参考

その他

何に使えるかわかりませんがExcelのセルを画像としてコピーしたい場合は次のようなVBScriptの実行アクションで可能です。

Option Explicit
Dim XlApp
Dim XlSheet
Dim XlCells

Set XlApp = GetObject("Book1").Application
Set XlSheet = XlApp.Worksheets(1)

Set XlCells = XlSheet.Cells(1,"A")
XlCells.CopyPicture 1,2

Set XlApp = Nothing
Set XlSheet = Nothing
Set XlCellst = Nothing