NDW

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

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, 実装技術

関連記事

VULTRでRHEL8をインストール(2/2)

VULTRのVPSにRHEL8.3をインストールする手順を説明します。 概要 ここでは、VULTRにRHEL用のVPSを構築した状態から、RHELをインストールする手順を説明します。 VULTRにRH …

mybatis-generatorプラグインの実装方法

mybatis-generatorを使うことで、各テーブルを操作するためのクラス群を容易に準備することができます。しかしながら、mybatis-generatorが提供する機能では、システム開発で求め …

JIS X 0208, Shift_JIS, Windows-31Jの歴史と違い

文字コードの話は難しそうなイメージがあり、必要になったタイミングでその都度、最小限の知識を習得して対応してきました…が、効率が悪く踏み込んだ話になった時に困る場合もあるので、ここで真面目に …

OfficeアプリのコントロールはPowerShellかVBAか?

Windowsサーバの監視のお仕事での話です。 月次で各サーバのパフォーマンスモニタのログファイル(.blg)が送られてきます。このデータ群から、各種のグラフや表を作成して、PowerPointでそれ …

リモートからのwarデプロイの自動化

JavaEEベースのツールを公開しているが、デプロイの都度、warファイルをサーバにコピーしてwildflyにデプロイするのが面倒なので、mavenで自動化しました。 前提 mavenのプラグインと後 …