VBAだけでQRコードを生成する(外部APIやランタイム不要)

ExcelVBA

TeamsやZoomの会議のログインには、招待URLをQR画像にして表示、スマホやタブレットにかざして、さっと入室するのが便利ですよね。特にOutlook上、招待された会議スケジュールを選択した状態でボタンに登録したOutlookマクロを実行、自動で会議スケジュール本文内の招待URLをQR画像に変換してシームレスに表示するマクロを作成し、おお、これはよい!と思っていたところ、一つの懸念が・・・。

QR生成にGoogleなど外部APIを使用したら、社外に会議URLが駄々洩れになってしまうではないか。

したがいまして、社内セキュアなサーバーにURL文字列をリクエストするとQR画像(というか画像のBASE64文字列)を返すAPIを実装して、それを使用していたのですが、どうも納得がいかない、釈然としない。VBAプログラム歴30年の私としては(外部や内部)APIなどに頼らず、自力VBAだけでQRコードを生成したいではありませんか!Outlookで動作させたいので、ExcelやAccessのランタイムも使用せず、純粋かつピュアな自作モジュール一つで実現しようではありませんか!

調べてみると、本当にごくわずか、先人達の事例がありました。https://github.com/yas78/QRCodeLibVBA
いや、これは素晴らしそうなのですが、モジュールがたくさんあってコードも大量、いやいや多機能は不要で、シンプルなモジュール一つで実装したいのです。

さらに調査を進めたらこちら
https://qiita.com/santarou6/items/d623417ea8ba33756108
とてもよさそう!
でも文字数に限界があるようで、超長いテキストだと作成されず、ExcelVBAでセルの背景色でQRを表現しているので、OutookVBAでそのまま利用するのは難しいかなと。
(一方で、セルドット方式かつ条件付き書式でワークシート上にQR画像を表現されていることに感銘を覚えました)

ということで、自作しかない!と思い立ち、以下のコンセプトで作り始めたのが、もうかれこれ2年前。
・他言語含む既存コードの移植ではなくゼロから実装しVBAの威力を最大化させる
・バージョンは最大の40まで対応し、長文テキストにも対応
・画像はWin32APIのGDI+で高速に作成

さらに、outlookVBAのモジュール一つに収めたく、ソースコードを簡素化するため、実用性を確保しつつ最小限のコードで実装する以下のアプローチをとりました。
・「日本語+英数字」を安全確実に扱うため汎用性の高いバイナリUTF-8に特化(Shift-JIS必須なKanji モードは非採用)
・マスクパターンは0で固定
・誤り訂正レベルはM(復元15%)で固定、文字数によりL(復元7%)に自動移行し格納文字数を最大化(これにより日本語全角984文字、半角英数字2953文字まで達成!)

まあ、レベルMでも、全角777文字まで行けますし、会議URLが2953文字になることはないので、復元レベルはM固定でエスカレーションしなくてもよい気もしますが、このあたりはVBAエンジニア魂といいましょうか、ソースコードが複雑にならない範囲で、出来る限り実装したわけです。

ここに至るまでは長い紆余曲折がありました。書いては実行、書いては実行、正常なQRが作成されない日々、いったいどこが悪いのか、核となる生成多項式が誤っているのか、はたまた画像作成GDI+でこけているのか、いやいやそもそもQRの仕様理解が足りていないのか、ChatGPTに聞いても一向に解決する兆しなし・・・2年に及ぶプログラミングバトルの結果、ついに完成したoutlookVBA(というか全Office共通VBA)コード、公開します!

このコードは例によって著作権フリーです。自由に利用いただき、outlookでのWeb会議ログイン業務の効率化や、OfficeVBAでQRコードを生成するアプリケーション作成にお役立てください。

コメント

タイトルとURLをコピーしました