適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

ExcelでQRコードを簡単に作成!!のはずが・・・PowerShellでQRコードを作成するはめになった話

ExcelでサクッとQRコードを作る

仕事でQRコードが必要になったので、ExcelでサクッとQRコードを生成。

Access 2013以降が入ったPCなら下記の方法でExcelで簡単にQRコードを作成でできます(確か)。

ActiveXコントロールの工具マークをクリック

f:id:shinmai_papa:20200729222200p:plain

Microsoft Barcode Control ~ をクリック f:id:shinmai_papa:20200729222155p:plain

シートの任意の位置でクリック。するとバーコードが出てくる

f:id:shinmai_papa:20200729222204p:plain

バーコードを右クリックして「Microsoft Barcode Control ~ オブジェクト」の「プロパティ」をクリック

f:id:shinmai_papa:20200729222207p:plain

11 - QRコードをクリック

f:id:shinmai_papa:20200729222217p:plain

QRコードになった!!

f:id:shinmai_papa:20200729222210p:plain

QRコードを右クリックして「プロパティ」をクリック

f:id:shinmai_papa:20200729222214p:plain

Valueにコード化したい文字を入力する

f:id:shinmai_papa:20200729222221p:plain

っと、ここまではググれば出て来る情報ですな。

問題はここから。

おい、全角!!

上記の方法でマルチバイト(以下、ややこしいので全角という呼び方で統一)文字を含むQRコードを作ろうとしたら・・・

空白になりおった!!

f:id:shinmai_papa:20200729222224p:plain

オブジェクトがアクティブだから、かろうじて四角い枠で、ここに何かあることがわかるが・・・

これは、きっと賢い人にしか見えないQRコードか何かかな?

いや、確かに空白になってしまいました。

全角文字は対応していない!?

QRコードの仕様自体が全角文字には対応していないのでしょうか?

ノンノン、そんなことはありません。

しっかり対応しているようです。

QRコードに使用できる文字/よくあるご質問

じゃあどうして?

ネットの海を調べていたら、こんなやり取りを発見しました。

エクセルでQRコードで漢字が反応しない - マイクロソフト コミュニティ

質問者tsuyoshiyamamoto

Access 2013 Runtimeの無料ダウンロードをして"Microsoft Barcode Control 15.0"をExcel 2013のシートの中にドラッグして体裁よいラベルのドラフトが作成できました。指定したセルを参照してそのQRコードに化けるもので、英数字は問題なくできました。 しかし漢字などは反応しないようです(真っ白になる)。所詮無料、もともと英数字のみの対応で致し方なしと理解してよいでしょうか。

同じ状況のようです。「所詮無料」と、こき下ろしていますが・・・。

回答者津森 美緒 (Microsoft エージェント | モデレーター | 記事執筆者)

マイクロソフト コミュニティへの投稿、ありがとうございます。

漢字の QR コードを作成したいのですね。

行っている操作は、Excel 2013 の [開発] タブの [挿入] → [Controlの選択] から「Microsoft Barcode Control 15.0」で指定したセルを参照した QR コードを作成しているということで良いですか?

私の手元のパソコンで試してみても、漢字では真っ白になりました。

他にもいろいろ試してみたところ、Excel 2013 ではひらがなと全角カタカナは真っ白で英数字と半角カタカナは QR コードになりました。

漢字などの QR コードを作成することができないかを調べてみたところ、Access についての内容なのですが、次のスレッドが見つかりました。

◇Access2013のQRコードで全角文字が表示されない

サポートに問い合わせてみた結果、残念ながら全角文字は対応していないということだったそうです。

そのため、漢字を使用したい場合は、他のソフトなどを探す必要があるかもしれませんね。

「残念ながら全角文字は対応していないということだったそうです。」

「残念ながら全角文字は対応していないということだったそうです。」

「残念ながら全角文字は対応していないということだったそうです。」

「他のソフトなどを探す必要があるかもしれませんね。」

「他のソフトなどを探す必要があるかもしれませんね。」

「他のソフトなどを探す必要があるかもしれませんね。」

つ、つ、津森さーーーーーーん、そりゃぁないよ!!!!!

さらっと他のソフト探すしかないとか言わないで―!!

まぁ津森さんに罪はありません。

そんな津森さんに言われてしまっては仕方がありません。

不遇な全角文字、これはMicrosoft様の迅速なご対応を待つしかありませんね。

しかし私はいつ来るかわからないメシアの登場を指を咥えてぼーっと待っているわけにはいきません。

仕事は待ってくれませんから。

Excelでできないからといってあきらめることはありません。

VBAでサクッと作る方法はないものかと探しましたが、どうも手軽な方法がなかったので、

ここはPowerShell先生のお力を借りることにいたしました。

PowerShellでサクッと作る

PowerShell先生が偉大だからといって、今日(2020/8)現在、.NETにはQRコードを生成する機能はなさそうです。

やはりそのような状況のため、サードパーティー製の.NET用ライブラリがいくつか公開されています。

その中のひとつ、スパイシーソフトさん作のQRImageの力をお借りしてサクッと作っていこうと思います。

ダウンロードサイト:QRImageの詳細情報 : Vector ソフトを探す!

ダウンロードしたzipファイルの中のQR_Encode.dllを使わせていただきます。

詳しい、詳しすぎる使い方は同zipに含まれている、QR_Encodeクラスの使用方法.txtにございます。

使い方を参考に、PowerShellのコードに落とし込んでみました。

PowerShellのコード

####################################################################
## Create-QR.ps1
##
## QRコードディレクトリにgif形式でQRコードを出力する
##
## 例:
##PS >Create-QR.ps1 "hogehoge" "ほげほげ"
##
####################################################################


#QRコードのライブラリを読み込む
function setQR(){
   [void][System.Reflection.assembly]::LoadFile((join-path $cd "QR_Encode.dll"))
   $QRcode = new-object QR_Encode_Class.QR_Encode
   [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
   $QRcode.BackColor = [System.Drawing.Color]::White
   $QRcode.ForeColor = [System.Drawing.Color]::Black
   return $QRcode
}

#QRコードを作成する
function createQR($qr,$sSource,$lpsOutFilePath){
   #誤り訂正レベル(0→L(7%)1→M(15%)2→Q(25%)3→H30%)
   $nLevel=2
   #型番(0→自動 1→40)
   $nVersion=0
   #自動拡張(型番が0以外のとき有効)false:自動拡張なし/true:自動拡張あり
   $bAutoExtent=$false
   #マスク番号(自動:-1/0-7)
   $nMaskingNo=-1
   #表示倍率(1以上)
   $nScale= 8
   $ret = $qr.EncodeData($nLevel,$nVersion,$bAutoExtent,$nMaskingNo,$nScale,$sSource,$lpsOutFilePath,$false,255,255)
   return $ret
}

##スクリプトのエントリポイント

#カレントディレクトリを設定
$cd=$PSScriptRoot

#QR作成準備
$qr=setQR

#qrフォルダ作成
$qrPath=Join-Path $cd "QRコード"
if(!(Test-Path $qrPath)){
   New-Item -ItemType Directory -Path $qrPath|Out-Null
}

$cnt=0
foreach ($_ in $args){
   #改行コードを変換する
   $string=($_.Replace(",","").replace("`r`n",""))
   $destination=Join-Path $qrPath ($string+".gif")
   if ((createQR $qr $string $destination) -eq 0){
      $cnt++
   }
}
"{0}件を作成しました。" -f $cnt

注意!!

・QR_Encode.dllは32ビット環境でコンパイルされているので、PowerShellも32ビット版(x86)を使う必要があります。

・Create-QR.ps1と同じフォルダにQR_Encode.dllを置いておきます。

・誤り訂正レベルはこの記事執筆時点で50%が復元可能なレベルSが策定されているようですが、このライブラリでは30%までの復元までしか対応していません。

・その他細かい設定はcreateQR関数内の数値をいじってくださいな。

終わりに

なんとかスパイシーソフトさん及びPowerShell先生のおかげで、QRコードを作成することができました!!

めでたしめでたし。

早く.NETの標準l機能でQRコードが作れればいいのにな。

というか実は作れるんですかね・・・?

ということで、最初はExcelでサクッとQRコードを作るはずが、

PowerShell先生、そしてサードパーティー製のライブラリまで引っ張り出して作るはめになってしまったお話でした。

ここまでお読みいただき、ありがとうございました。