2022年12月18日日曜日

印刷領域は、あくまでも目安なので最終的には、マニュアルで微調整が必要だと分かった ー PageSetup(VBAマクロ)

       
社内用のタックシートラベルを印刷するため、エクセルでマクロを書きました。
プログラムコードの流れは、ほぼ固まっていますが、印刷するとズレが出たな。

A4用紙のシートに大型のラベルが三枚で、一枚のラベルは80ミリと大型です。
上下マージンが25ミリ、左右は30ミリと設定しやすく、ラベル間は5ミリなの。

これに、シート上の行高さを大きくして行内部にラベルが入るようにしました。
印字内容もシェイプのテキストボックスで書き出しましたが、骨の折れる作業。

こうして、印刷書式の数値設定で、テキストボックスの設定値も決めたのにな。
なぜかブックを開くたびに、印刷するページの最下行が一つ増えていたりする。

ワークシート表示を、ページレイアウトに変更してみると、確かに一行分余計。
ちゃんとA4用紙縦の長さもポイントで計ったし、設定値を割り出していたのに。

何かがおかしいと思いつつ、シールの入る行高さを、手作業で加減して調整だ。
この試行錯誤に時間が掛かってしまって、ならばと思って再計算を始めました。

先ず、A4用紙はタテが297ミリで、エクセルの設定単位、ポイントに改めます。
ちょこちょこッと、次の通りマクロで計算式を書いてみましたが、以外と便利。

Sub UnitChange()
Dim CM As Double '割り切れない数値なので15桁の倍精度浮動小数点変数
  CM = Application.InputBox("ポイントに変換するセンチを入力", Type:=1)
  MsgBox CM & "cm は" & Application.CentimetersToPoints(センチ) & _
               "ポイント"
End Sub

Sub PageSetting() ’設置したマージン値
With ActiveSheet  ’1行目はコマンドボタン用に8mm=22ポイント設定
  .PageSetup.TopMargin = 51.0236220472441 ’1.8センチ
  .PageSetup.BottomMargin = 73.7007874015748 ’2.6センチ
  .PageSetup.LeftMargin = 90.7086614173228 ’3.2センチ
  .PageSetup.RightMargin = 90.7086614173228 ’3.2センチ
End Sub
※ポイント値を、Application.CentimetersToPoints(センチ値)でも表せます。

すると841.889763779527ポイントと表示されて来て、これが用紙縦の全長。
次に、ワークシート上に設定した値(ポイント)を合算して比べてみたんだな。

ところが、79ポイントも上回っていて、916.9ポイントまで到達してしまった。
およそ2.8センチも超過していた分けで、この理由が分からなくて悩みました。

ならばと、印刷領域からすぐ下にある一行の高さを、わざと大きくする実験だ。
その結果、印刷ページに邪魔に入り込んでいた一行分が、外れていたのですよ。

しかも、実際の印刷では、テキストボックスはシール位置に収まっていました。
つまり、エクセルのプログラムが、設定値を計算しながら調整しているようだ。

もし、ページをまたぐ位置にある行で行高さが大きいと、次ページに回される。
そんな調整らしく、シールの行をどれぐらいの高さで発生するかは実験が必要。

しかも、次ページに回った行は、標準高さ13.5なのに、計ると12.75ポイント。
うーん、誤差みたいな範囲は、自動的に調整すると見て間違いないようです。

というわけで、印刷物とディスプレイ画面が完全に一致するなどありえない話。
以前の投稿でも紹介したように、ワークシートの表示倍率が100%以外では、テキストボックスの位置がずれるなど、エクセル自体にもバグがあるようだし、モニター上の画面が、実際の印刷物と完全互換するなど到底思えませんので、そこは手作業の調整しかないと思うったのでした。



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



0 件のコメント:

コメントを投稿