概要
さまざまなサービスで利用されるQRコードはとても便利ですよね。みなさんはどのように生成しているでしょうか。WEBサービスや有償無償のソフトウェアなどさまざまな手段があります。Google Charts InfographicsAPIがとても便利ですが、いつ終了するのかわからないのが残念です。
そこでQRコードについて調べ、Power Automate for desktopとExcelを利用して画像を作成する方法を考えました。多少機能は限定されますがMS製品のみで作成でき、用等によっては十分かなと思いました。
環境
- Windows 10 21H2
- Microsoft 365 開発者プログラム
注意事項
- ActiveXコントロールを使用します。
- 何かに使えるかもしれないくらいのネタとして考えてください。
- Microsoft Access 2016 Runtimeが必要になる場合があります。
- 今回の方法では半角英数記号のみ利用可能です。
- QRコードの仕様等については各自お調べください。
- 自己責任でお願いいたします。
仕組み
Microsoft BarCode Control16.0をExcelワークシート上に呼び出してQRコードを作成し、クリップボード経由でPNG画像を生成します。
Excelはセル内容をデータとしてコピーと、セルやオブジェクトを画像データとしてコピーができます。
VBSスクリプトからQRコードを生成し、図としてコピーします。その時オプションにBitmapを指定することでクリップボードを経由してPowerShellでその内容をPNG画像として保存します。フローは次のようになります。
-
特別なフォルダーを取得
-
ファイルからテキストを読み取ります。 QRコードを作成する文字のリストをテキストファイルから読み取ります。Microsoft BarCode Control16.0では半角英数記号のみとなります。今回のフローでは文字列をそのままファイル名に使用しているので、¥や\などの記号は使えません。デスクトップにQRコードフォルダーを作りList.txtを作成しています。
-
Excelの起動
-
For each テキストのリストを反復処理に使っています。
-
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
-
PowerShellスクリプト実行 クリップボードの中身をPNGとして保存します。
$Image = Get-Clipboard -Format Image
$Image.Save("%SpecialFolderPath%\QRコード\%CurrentItem%.png")
-
End
-
Excelを閉じる
まとめ
良い点
- MS製品のみで構成できる。
- 半角英数記号で足りる用途なら十分
いまいちな点
-
あまり速度が速くない (100枚生成で90秒程度(Core i7 3770k))
-
クリップボードから出力したファイルサイズが大きめ(PowerShellを使用して201X201で出力した場合3.5k~4kバイト、Imagemagickで出力した場合500バイト)
-
条件はわかりませんが、空白ファイルがつくられるときもありました。
-
日本語を埋め込めない。
以上の点から別の方法も模索しました。PythonのライブラリのPillowとqrcodeを利用するのが簡単で個人的にはしっくりきました。しかし、いろいろインストールできない環境では今回のフローもアリかなあと思います。とりあえずやってみないとわからないとうことで。💦
余談ですがGoogle ChormeはURLのQRコード画像を生成できるんですね。
参考
- QRコード®とは
- VBScript
- OLEObject.CopyPicture method (Excel)
- XlCopyPictureFormat enumeration (Excel)
- Get-Clipboard
- 第137回.ActiveXコントロール
その他
何に使えるかわかりませんが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