2022年10月17日月曜日

ワードで文章枠のフレームはよく使いますが、エクセルのシートにあるテキストボックスもVBAではテキストフレームで制御します ー TextFrame(VBA)

       
エクセルを使って、A4用紙のタックシールに印刷するプログラムを作成中です。
この用紙には複数枚数のシールを剥がせるデザインで、ここへ印字させる分け。

最初は、位置をシールの寸法に合わせて、セルにデータを書き込んでいました。
このため、メーカーのサイトからシールに関する情報を仕入れたりもしたんだ。

だけど、セルの幅とか行の高さを調整するのが、意外に面倒だと分かりました。
ワークシート上では、使われる単位がポイントになっていますが、ややこしい。

だって、1ポイントが1/72インチで、1インチが約25.4mmと単位が違います。
試しに、1ポイントを25.4mm÷72で計算すると、約0.3528mmと半端な数値。

普通、シートの一行は13.50ポイントですが、厄介でも計算すると約4.76mm。
シートの表示単位をセンチメートル系に変更もできますが、誤差も出るだろう。

なので、セル幅や行高さに注意して必要な値を計算しても、ぴったりしません。
だから、シートにデータ表示はせず、テキストボックスに流し込むことにした。

まあ、このテキストボックスは、枠をクリックすれば簡単自在に移動ができる。
だから、テキストボックスを、一つずつ印字位置の微調整ができるので便利だ。

後は印字内容の流し込みですが、VBAでは”Shape”オブジェクトで定義される。
しかも、このシェイプを制御するオブジェクトもあり、それが”TextFrame”だ。

ここら辺の話は、ネットで探すと、サンプルが見つかるので何とかなりますな。
面白いのは、テキストボックス内で改行するには、Chr(10) のコードを用いる。

例えば、”abc" & Chr(10) & "def" & Chr(10) & "ghi"と書くと三行が表示する。
アイデア次第ですが、郵便番号、住所、氏名を三行で表示するようなものです。

Sub Sample() '三行表示の例
ActiveSheet.Shapes("TextBox 1").TextFrame.Characters.Text = _
”abc" & Chr(10) & "def" & Chr(10) & "ghi"
End Sub

Sub Prtct01() 'ワークシートの保護(マクロでも一部の機能は操作不可)
  ActiveSheet.Protect
End Sub

Sub Prtct02() 'ワークシートの保護(マクロで操作が可能)
  ActiveSheet.Protect UserInterfaceOnly:=True
End Sub

Sub Unprtct()'ワークシートの保護解除
  ActiveSheet.Unprotect
End Sub

      
一方、テキストボックスは、マウスのクリックで簡単に選択できてしまいます。
だから、選択されないように、シートを保護すればよいのですが、問題もある。

それは、シンプルな保護では、マクロの操作に一部制約を受けてしまうらしい。
なので、この制約を受けずにオブジェクトを操作するには、おまじないが必要。

それが、上述の”UserInterfaceOnly:=True”なのですが、これも少し厄介です。
このまま保護して保存終了した後に、このブックを改めて開くと、完全保護だ。

つまり、マクロによる操作も保護する状態で、保存されてしまうということだ。
なので、開いたら、このおまじないのプロシージャを起動させねばならないな。

というわけで、VBA記述が複雑になると、理由が分からぬままエラーが出たり。
このままでは、らちも明かなくなってしまうので、このおまじないを使うのを諦めて、テキストボックスやセルに値を流し込む時は、先頭でシートの保護を解除して、それが終われば、また保護を掛けるという、手間でも単純な操作にしてしまった自分なのでした。



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



0 件のコメント:

コメントを投稿