アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング bat_vbs 実装技術

WindowsでQRコードを生成(VBScript)

投稿日:


概要

  • Windows環境でVBScriptを使用してQRコードを生成する方法を紹介します。
  • このVBScriptは、Excelを起動し、バーコードコントロールを使ってQRコードを生成しています。
  • 動作確認で使用した環境は次の通りです。
    • Windows 10(64ビット)
    • Microsoft Office Home and Business(Microsoft Excel 2019 MSO 64ビット)
    • Microsoft Access Runtime 2016
      (バーコードコントロールはAccessに付属するもので、AccessまたはAccess Runtimeが必要になります。)
  • Excel VBAでQRコードを作成したい場合は別のサイトをご覧ください。
  • より高度なことを行う場合、開発効率が良いExcel VBAや.NET等のプログラミング言語での実装をお薦めします。

サンプルコード

サンプルコードは次の通りです。
こちらからダウンロードできます。

'======================================================================
' QRコード画像生成スクリプト
'
' - ExcelからAccessのBarcodeControlを使用してQRコードを生成します。
' - 実行には"Microsoft Office Access"、または"Access Runtime"が必要です。
'======================================================================

' 定数定義 ------------------------------------------------------------

'QRコードの縦・横幅
const QR_WIDTH = 300

'画像出力時の画像サイズ調整用の比率
'(作成される画像ファイルが上記の縦・横幅と異なる場合の調整用)
const SIZE_WEIGHT = 0.5

'処理途中の画像コピー&ペースト処理の失敗を抑制するための待機時間
const COPY_PASTE_INTERVAL = 1000 '[s]

'QRコード化する対象データ
const ENCODE_VALUE = "https://www.yahoo.co.jp"


' メイン処理 ----------------------------------------------------------

'Excelアプリを起動
Set App = CreateObject("Excel.Application")

'作業用のブック・シートを作成
Set TargetBook = app.Workbooks.Add
Set TargetSheet = TargetBook.Sheets(1)

'ワークシートにバーコードコントロールを追加
'(後のプロパティ設定でリサイズされてしまうので適当なサイズを指定)
Set OleObject = TargetSheet.OLEObjects.Add( _
	"BARCODE.BarCodeCtrl.1", "", 1, 0, 0, 100, 100)
Set BarcodeObject = OleObject.Object

'プロパティ設定する前に非表示
'(QRコードがレンダリングされない問題の回避)
BarcodeObject.Visible = False

'QRコードの設定と表示
With BarcodeObject
	.AutoLoad = True
	.Style = 11
	.Substyle = 0
	.Validation = 1
	.LineWeight = 3
	.Direction = 0
	.ShowData = 1
	.ForeColor = 0
	.BackColor = &H00FFFFFF
	.Value = ENCODE_VALUE
	.Refresh
End With
OleObject.Visible = True

'QRコードをコピー
WScript.Sleep COPY_PASTE_INTERVAL
BarcodeObject.CopyPicture

'画像をエクスポートするためのチャートを作成
'(チャートの挿入場所は適当な場所を指定)
WScript.Sleep COPY_PASTE_INTERVAL
TmpChartWidth = QR_WIDTH * SIZE_WEIGHT
Set TmpChart = TargetSheet.ChartObjects.Add( _
	300, 0, TmpChartWidth, TmpChartWidth)
'チャートの枠線の出力を抑制
TmpChart.Chart.ChartArea.Format.Line.Visible = False

'QRコードをチャートに張り付け
TmpChart.Chart.Paste

'Excel上での上記処理結果を確認したい場合は有効化
'MsgBox "pause for debugging..."

'QRコードをファイルにエクスポート
ScriptPath = WScript.ScriptFullName
WorkFolder = Left(ScriptPath, InStrRev(ScriptPath, "\"))
'拡張子でエクスポートファイル形式を自動判別、上書き保存
TmpChart.Chart.Export WorkFolder & "qrcode-output.png"

'Excel終了(作成したブックは不要なので保存しない)
TargetBook.Close False
App.Quit

  • バーコードコントロールを追加し、各種プロパティを指定してQRコードを生成します。
    コントロールの説明やプロパティ・メソッドは次のサイトやヘルプファイル(CHM形式)をご覧ください。
    1. Microsoft バーコード ActiveX コントロール | Microsoft Docs
    2. Download Microsoft バーコード コントロール 9.0 リファレンス from Official Microsoft Download Center
  • バーコードコントロールを表示状態でプロパティを設定しても、QRコードの画像が生成されません。この状態でコピーしても、やはりQRコードの画像を取得できません。
    バーコードコントロールを非表示の状態(Visible=False)でプロパティを設定する必要があるようです。(結構ハマりました…)
  • バーコードコントロールのQRコードを画像ファイルとして保存するためにチャート(Chart.Export)を使用しています。
  • タイミング?によってコピペが失敗する場合があり、その調整を行うためにコピペ処理前後に待機時間を設けています。環境に応じてCOPY_PASTE_INTERVALの値を変更してください。

実行結果の例

前述のサンプルでファイルにエクスポートしたQRコード(300x300px)を次に示します。
(画像の切れ目が分かるよう枠線を入れていますが、画像に枠線は含まれません。)



(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, bat_vbs, 実装技術

執筆者:

関連記事

slf4jとlog4j2を使たデバッグログの出力方法

Webアプリやスタンドアロンアプリの開発でデバッグログやトレースログを出したい場合があります。 とりあえず、ロガーのログレベルをdebugやtraceに下げればいいや、と設定してもログが出力されない場 …

JavaEE7のJSF, Facelets, JSPの関係

JavaEEを使ったアプリ開発の際に、いつも気になるが後回しにしていたこと… HTML5への対応方法の調査等、今後の理解促進のために、調べてみた。 FaceletsとJSFとの関係は? J …

保守運用

運用 と 保守 の 違い

若い頃は 運用 と 保守 の違いを調べても良くわからなかった… この辺を使い分けられる人をほとんど見たことない… ある事項が運用なのか保守なのかの話をすると認識が合わない&#8 …

wildflyへのwarデプロイの自動化

更新したWebアプリをWildflyにデプロイするのが面倒なのでスクリプトを作成してみました。 前提 実行環境はCentOS Linux 7です。 JavaEEのWebアプリの配布形式であるwarファ …

ASP.NET Core: ファイルアップロードの考察

ASP.Net Core(3.1)を使ったファイルアップロードに関する考察です。 元ネタはマイクロソフトのサイトですが、記載内容が私には難しかったり、業務で使用するために悩む部分があったので独自に纏め …