社内用のタックシートラベルを印刷するため、エクセルでマクロを書きました。
プログラムコードの流れは、ほぼ固まっていますが、印刷するとズレが出たな。
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 件のコメント:
コメントを投稿