パソコンで検索していたページをスマホでも見たいときって有りますよね。URLをスマホで打ち直したり、ページにたどり着いた検索キーワードを思い出して、スマホで再検索することもできますが少々面倒くさい。。。
そんなとき、こんな感じでURLをQRコードに変換できたら…
だいぶ作業が捗るのではないでしょうか?
今回は今までの記事に比べて少し複雑になりますが、ExcelマクロでQRコードを生成する方法を紹介します。
QRコードを表示するフォームを作成する
今回のExcelマクロではQRコードを生成するためにMicrosoft BarCode Controlというコントロールを使用します。
このコントロールは初期状態では使用できない(ツールボックスに表示されていない)ので、まずはツールボックスに表示されるように設定を変更します。
Microsoft BarCode Controlを追加する。
プロジェクトにUserFormを追加したら、以下の手順でツールボックスにBarCode Controlを貼り付けます。
ツールボックス上で右クリックをして、「その他のコントロール」をクリックします。
コントロールの追加ダイアログで「Microsoft BarCode Control」探しチェックしたら、OKを押してダイアログを閉じます。
ツールボックスにバーコードのアイコンが追加されていればOKです。
BarCode Controlをユーザーフォームに配置する
バーコードのアイコンをクリックして、ユーザーフォームに貼り付けます。
このコントロールは標準のコントロールと同様に、画面上で様々なパラメータの設定変更ができるのですが、本筋から外れるので詳細な説明は省きます。
見た目がバーコードですが、次の章でQRコードに変更します。
また、画面上で変更した設定はVBAのコードとして顕れてこないので、プログラム修正などのメンテナンス性を考えた場合、設定変更はVBAのコードとして書いた方がベターです。
クリップボードのURL(文字列)をQRコードに変換する
ユーザーフォームの準備が整ったら、いよいよ「クリップボードにコピーした文字列をQRコードに変換するマクロを書いていきます。
まずは、VBAでクリップボード使う方法から
クリップボードの状態を判定する(ClipboardFormatsプロパティ)
Excelマクロでクリップボードを操作するには、以下のようにClipboardFormatsプロパティを使います。
ClipboardFormatsプロパティは、現在クリップボードにあるオブジェクトで使用できる形式を、数値の配列として返します。値の取得のみ可能です。バリアント型 (Variant) の値を使用します。
次の例では、クリップボードの状態を判定し、中身が空であればメッセージを表示し、中身が文字列であれば処理を抜けます。
Dim CF As Variant CF = Application.ClipboardFormats If CF(1) = True Then MsgBox "クリップボードは空です。", vbExclamation Exit Sub End If Dim fmt As Variant For Each fmt In CF 'クリップボードの中身が文字列の場合はループを抜ける If fmt = xlClipboardFormatText Then Exit For End If Next fmt
クリップボードの中身を取り出す(GetFromClipboardとGetTextメソッド)
クリップボードの中身を取り出すには、MSForms.DataObjectオブジェクトの変数を用意し、GetFromClipboardメソッドを使用します。
更にDataObjectオブジェクトからデータを取得するにはGetTextメソッドを使用します。
次の例では、クリップボードの中身を取り出し、更に文字列を取得してBarCodeControlのValueに設定しています。
BarCodeControlはユーザーフォームを表示する前にStyleを設定し、表示形式をバーコードからQRコードに変更しています。
Dim cbData As MSForms.DataObject Set cbData = New MSForms.DataObject cbData.GetFromClipboard With UserForm1.BarCodeCtrl1 'BarCode Controlの表示形式をQRコードにする .Style = 11 'クリップボードから文字列を取り出して、BarCode Controlに渡す .Value = cbData.GetText End With UserForm1.Show Set cbData = Nothing
マクロを完成させる
以上を踏まえて、クリップボードのURL(文字列)をQRコードに変換するマクロを完成させます。
Sub ClipbordToQRCode() Dim CF As Variant CF = Application.ClipboardFormats If CF(1) = True Then MsgBox "クリップボードは空です。", vbExclamation Exit Sub End If Dim cbData As MSForms.DataObject Set cbData = New MSForms.DataObject cbData.GetFromClipboard Dim fmt As Variant For Each fmt In CF 'クリップボードの中身が文字列の場合はループを抜ける If fmt = xlClipboardFormatText Then With UserForm1.BarCodeCtrl1 'BarCode Controlの表示形式をQRコードにする .Style = 11 'クリップボードから文字列を取り出して、BarCode Controlに渡す .Value = cbData.GetText End With UserForm1.Show Exit For End If Next fmt Set cbData = Nothing End Sub
QRコード生成マクロの実行結果
実行結果は以下のとおりです。
※このブログのトップページのURL(https://morelearn.work/)をクリップボードにコピーした状態。
表示されたQRコードは、[Alt]+[PrintScreen]でユーザーフォームごとコピーできます。
作成したマクロは、こちらの記事の手順でリボンに登録しておくと便利ですね。
また、BarCode Controlに渡す文字列に全角文字が含まれていると、QRコードに変換できません。改造案として、文字列のチェック関数を追加したり、QRコードやフォームの大きさを調整したり、QRコードのみをクリップボードにコピーする機能を追加すれば更に実用的になりますが、今回はこのへんで終わります。
コメント