おことわり
この投稿は、書いた後で、VBAの挙動が思わしくありませんでした。
ですが、失敗事例で参考にアップしますので、斜め読みでもしてください。
エクセル内で、テキストボックスを設けて、タックシールを印刷する工夫です。
VBAでコードを書き込んで、ブックを開いたら各シェイプの位置を再設定する。
何かの拍子でシェイプを選択して、誤って動かして位置がずれるとも限らない。
だから、念には念を入れて、コードからシートを保護する設定もしてみました。
実際、シェイプにデータを書込む時は、一旦、保護を解除する工夫も加えます。
こうして、万全の対策を施したのに、微妙に位置が動いているような気がする。
どうしてなのかと思っていたら、シートを印刷するページの行数が変化します。
理由は分からないが、ジャスト1ページ分に収められる行数は計算したつもり。
ところが、行幅はスタンダードの高さにして、ブックを開いた時も再設定した。
この時、書いたコードは簡単なものですが、デフォルトの設定に戻すとき便利。
Sub ActvShtRwHght()
Rows("1:70").RowHeight = ActiveSheet.StandardHeight
Columns("A:Z").ColumnWidth = ActiveSheet.StandardWidth
End Sub
一方、用紙のサイズから、上下の印刷余白を除いた領域が、行を表示できます。
ここで、行の標準高さは13.5ポイントですが、1インチ72ポイントのスケール。
1ポイントは約0.35mmですが、若干の端数が出て、割り切れない数値なんだ。
他方、印刷余白はセンチで指定しますが、マクロの記録で設定を取ると面白い。
With ActiveSheet.PageSetup
.TopMargin = Application.InchesToPoints(0.748031496062992)
.BottomMargin = Application.InchesToPoints(0.748031496062992)
End With
上部の印刷余白を、センチ指定ならインチで表すと、小数点以下が半端ないな。
なので、このような端数を累積すると、結果的に一行はみ出すようになるのか。
そんな気もして、だったら、印刷領域は三行だけにして微調整して表示させる。
次にブックを開いた後、印刷領域の印刷ページ数が増えていたら再設定し直し。
Sub RwHght()
Dim i As Single, j As Single
ActiveSheet.PageSetup.PrintArea = Range("A1:H3").Address
j = WorksheetFunction.RoundUp((Rows(1).RowHeight + _
Rows(2).RowHeight + Rows(3).RowHeight) / 3, 1)
If ActiveSheet.PageSetup.Pages.Count > 1 Then
For i = j To 100 Step -0.1
If ActiveSheet.PageSetup.Pages.Count = 1 Then
Rows("1:3").RowHeight = i
Exit Sub
End If
Next i
End If
End Sub
このプロシージャは、"Private Sub Workbook_Open"で、自動起動させます。
行の高さを0.1刻みで減らしながら、印刷領域の三行に割り当てて設定します。
この印刷領域の設定が、印刷ページ数が1になったらプロシージャを抜けます。
これがサンプルプログラムなんだけれど、もう一つ、忘れたことがありました。
それは、シェイプは、既定値が”セルに合わせて移動やサイズ変更をする”設定。
これを、”セルに合わせて移動やサイズ変更をしない”ようにしないとズレるな。
Sub DntMveShps()
ActiveSheet.Shapes.SelectAll
Selection.Placement = xlFreeFloating
End Sub
なので、これもブック立ち上げ時に、プロパーティ設定をするようにしました。
というわけで、VBAでコードを書けば、知らないことがたくさん出てきました。
シートを印刷用紙に見立てる時は印刷レイアウトで表示させて、どのようにタックシール上に印刷されるのか確認していますが、思った以上にシェイプがずれたりして、以上のどちらか効果的なのかは、これからチェックだなと思ったのでした。
0 件のコメント:
コメントを投稿