2022年11月26日土曜日

貼り付けたQRコードも、何だかズレているような気がしていたら、やっぱりズレることのあるのが分かったお話 - OLEObjects(VBAマクロ)

      
以前、エクセルワークシート上でシェイプ位置が微妙にずれると投稿しました。
この件が不思議でしたので、考え付くだけのVBAコードを書いて対応した分け。

結果は概ね良好で問題はないと思っていましたが、一つだけ気がかりが残った。
それは、テキストボックス等は、このVBAコードでバッチリコントロールする。

つまり、オートシェイプは、フォームコントロールの配下なので制御可能です。
ところが、QRコードはOLEオブジェクトで、コントロールできるのかどうかだ。

それで、ググって調べてみたら、ActiveXのコントロール下なので別物でした。
しかも、”OLEObjects 位置ずれ”と別にググると、上のサイトがトップに出る。

これは、シート表示画面が100%以外では、設定値と違って微妙にずれるお話。
サイトでは、再現方法を具体的に説明していますが、理由は明かさないままだ。

というより、位置を指定しても微妙にずれて表示されるのは、仕方ないみたい。
だって、Excelでは単位のポイントが、1インチ=72ポイントで割り切れません。

按分すると、1ポイントが”0.0138888888888889”インチと、16桁にもなった。
逆に、1ポイントをセンチ単位で換算したら、同じく小数点以下が16桁表示だ。

だから、こんな割り切れない単位では、位置指定でも微妙にずれることになる。
ただ、このズレをできるだけ防ぐため、シート画面を100%にして設定する事。

Sub CreateQRCode() 'QRコード(ActiveX)の名前を指定して削除 
Dim ws As Worksheet, xOleObjct As OLEObject, Str As String
ActiveWindow.Zoom = 100 'シート表示の倍率100%に設定
  Str = "GURIGURIMOMONGA"
    Set ws = Worksheets("Sheet1")   'QRコード作成のシート指定
Set xOleObjct = ws.OLEObjects.Add("BARCODE.BarCodeCtrl.1") 
 'OLEObjectオブジェクト作成
    With xOleObjct  'OLEObjectオブジェクトをQRコード化
        .Object.Style = 11 'QRコード(=11)を指定
        .Object.Value = Str    'データを指定
        .Height = 36   'QRコードのサイズ、位置、名前を指定
        .Width = 36  '縦と横のサイズ
        .Top = 30 'TopPosition '位置
        .Left = 10
        .Name = ”QR1” '名前を指定、後で削除しやすくするため
    End With
  Set xOleObjct = Nothing      '後片付け
    Set ws = Nothing 'メモリの解放
  ActiveWindow.Zoom = 70 '本来のシート表示の倍率に戻す
End Sub

Sub QRcodeDelete() 'QRコードの名前を指定して削除
ActiveSheet.Shapes("QR1").Delete
End Sub

     
この場合、”Microsoft Access 2013 Runtime”をインストールする必要がある。
インストールをしたら、VBエディターからVBAプロジェクトで、参照設定だな。

これで、”Microsoft Barcode Control 15.0”が使えるので、コードを書き出す。
サンプルコードでは位置を指定していますが、ミソはシート表示倍率の100%。

この指定を、念のためにコードの書き出しに一行を書き足しておくと良いかも。
というわけで、本来のシート表示倍率に戻すなら、コード末尾に書き加えます。

こういったQRコード作成のサンプルコードは、縦横の大きさ、ワークシート上の表示位置まで設定できますので、これをヒントに改変しながらドンドン使ってみてもらいたいと思うのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿