エクセルのシートをコピーしたら印刷が1枚に収まらない問題の考察

シートを別のブックへコピーしたら、印刷レイアウトで1枚に収まっていたはずが、収まらなくなる。残念なあるあるである。
困っている人は多いのではないか。

解決できた一例を書いてみるが、これが全てかどうかはわからない。
結論時に見えたのは「1シート目を最初にコピーする」こと。

まず、見積書のような例で「表紙」のシート「明細」のシートがあるとする。
どちらも1枚に収まるように作ってある。

最初にダメな例だが、作業の都合上、2シート目の「明細」をコピーすると問題発生し、困ったなーと思っていた。

もともと1枚に収まっている状態。

これを新規ブックへコピーすると、

縦が方向が収まらなくなってしまった。
画面操作で実施しても、下記VBAでも結果は同じだった。
Sheets(“明細”).Copy
このコマンドで新規ブックが作成され、シートが先頭にコピーされる。

一方、1シート目をコピーすると問題が発生しないことに気がついた。

収まっている1シート目を新規ブックへコピーすると、

ちゃんと収まる。
VBAでは
Sheets(“表紙”).Copy

本来やりたかったことは、シートをコピーしつつ、左右のシートを入れ替えることであった。
つまり、2シート名の「明細」をコピーしてから、1シート目の「表示」をコピーすることをやってみる。

VBAでは下記。

Dim newWB As Workbook
' 新しいブックを生成してコピー
Sheets("明細").Copy
' 作成したブックが現在はアクティブ
Set newWB = ActiveWorkbook
newNM_str = newWB.Name
' アクティブをもとに戻す
Windows("見積書縮小データ.xls").Activate
Sheets("表紙").Copy after:=Workbooks(newNM_str).Sheets(1)


そうすると、下記のようにどちらのシートもはみ出てしまい、レイアウトが崩れる。

1シート目の「表紙」だけをコピーしたときは崩れなかったのに。
この状況から推理を働かせると、

  • 新しいブックへ最初にコピーするシートが重要なのではないか?
  • 新しいブックを作成するときに必要な、印刷レイアウトの性質を決める「何かしらの情報」は、1シート目に入っているのではないか?
  • 2シート目を最初にコピーしてしまうと、その「何かしらの情報」が新しいブックへ引き継がれないのではないか?

こんな考えに至った。

シートの左右を入れ替えたかったから、2シート目 → 1シート目の順番でコピーしたが、コピー順を1シート目 → 2シート目に変更してみる。
VBAでは下記。

Dim newWB As Workbook
' 新しいブックを生成してコピー
Sheets("表紙").Copy
' 作成したブックが現在はアクティブ
Set newWB = ActiveWorkbook
newNM_str = newWB.Name
' アクティブをもとに戻す
Windows("見積書縮小データ.xls").Activate
Sheets("明細").Copy before:=Workbooks(newNM_str).Sheets(1)

after:= を付けてコピーしていたところを before:= でコピーへ変更し、左右を入れ替えることを実現。

さて、結果的には、

どちらのシートもはみ出ることなく、希望通りのシートの並び順でコピーができた。

1シート目が要らない場合には、1シート目をコピー → 2シート目をコピー → 1シート目を削除
みたいに、ダミーっぽいコピーをしなければならないかも。

ちなみに、今回はコピー前のデータは事情があって古い .xls 形式。これが更に問題を複雑にしたかもしれない。

そして、オプションで既定のフォントをMS Pゴシックに変えてある。

もともとはこれもコピー時の印刷レイアウトずれ対策だった。

過去に別の事案で印刷レイアウト崩れ対策としてやって効果があったことは、ブックのテーマを古い形式に変える。
新しいブックを distBook としたとき。

Dim defaultFont As String
defaultFont = "C:\Program Files\Microsoft Office\root\Document Themes 16\Theme Fonts\Office 2007 - 2010.xml"
distBook.Theme.ThemeFontScheme.Load (defaultFont)

OfficeのバージョンやOSのビットによって参照する .xml を変えたりして。

defaultFont = "C:\Program Files (x86)\Microsoft Office\root\Document Themes 16\Theme Fonts\Office 2007 - 2010.xml"
や
defaultFont = "C:\Program Files\Microsoft Office 15\root\Document Themes 15\Theme Fonts\Office 2007 - 2010.xml"

他には、コピーした後で、ページ設定も個別にコピーするとか。

コピー元のシートを sourceSheet、コピー先のシートを copiedSheet としたとき、

With copiedSheet.PageSetup
    .PrintArea = sourceSheet.PageSetup.PrintArea
    .Orientation = sourceSheet.PageSetup.Orientation
    .PaperSize = sourceSheet.PageSetup.PaperSize
    .FitToPagesWide = sourceSheet.PageSetup.FitToPagesWide
    .FitToPagesTall = sourceSheet.PageSetup.FitToPagesTall
    .Zoom = sourceSheet.PageSetup.Zoom

効果があったり、なかったりで確証がない方法だった。