印刷範囲を手で調整するのが面倒くさい
Excelの印刷範囲は改ページプレビューで青線をドラッグすることで変更できますが、1つのブックだけならいいですが、多数のブックの印刷範囲を調整しなければならない場合は結構面倒です。
なお、改ページプレビューでの表示はシートの右下にある、標準、ページレイアウト、改ページプレビューの3つのボタンを押すことで切り替えられます。
この青線の調整ですが、1つのシートを修正するのであれば大した話ではありませんが、多数のブック、シートの印刷範囲を修正するとなると結構うんざりしてきます。
以下では、青線で囲まれた印刷範囲の横位置(列位置)を拡大や縮小するマクロを紹介します。
印刷範囲の自動設定と手動設定の違い
シートの印刷範囲は「自動設定」と「手動設定」の2通りがあります。
通常は「自動設定」扱いでシートに入力されているセル範囲を印刷対象としますが、改ページプレビューの青線の位置をずらすと「手動設定」として扱われます。見た目では「自動設定」なのか「手動設定」なのかは判別できません。
WorksheetオブジェクトのPageSetup.PrintAreaプロパティを参照すると印刷範囲が取得できますが、取得できなかった場合は「自動設定」になっています。
1 2 3 4 5 |
Sub GetPrintArea() Dim s s = ActiveSheet.PageSetup.PrintArea Debug.Print "[" & s & "]" End Sub |
このマクロは印刷範囲をイミディエイトウィンドウに出力しますが、「自動設定」の場合は”[]”と何も出力されず、青線を編集している場合の「手動設定」の場合は”[$A$1:$E$6]”のように印刷範囲が出力されます。
印刷範囲の列の拡大と縮小を行うマクロ
以下のマクロは、印刷範囲の右側の縦の青線を右に移動させることで列の拡大を行い、左に移動させることで列の縮小を行います。
3つ関数がありますが、1つ目が印刷範囲の拡大を行い、2つ目の関数は印刷範囲の縮小を行います。いずれも3つ目の関数を引数付きで呼び出しているだけです。
1つ目と2つ目の関数の引数の1と-1ですが、印刷範囲の列位置を増やすか減らすかを意味しています。1だと増やし、-1だと減らします。
3つ目の関数がメインの処理です。コメントに大体書いていますが、考え方は、現時点の印刷範囲を取得すると[$A$1:$I$77]のような形式で取得できるためそれを編集して印刷範囲を変えています。印刷範囲が「自動設定」の場合は元の印刷範囲としてセルに入力されている範囲を示すUsedRangeを暫定で印刷範囲として採用しています。
処理の先頭でOn Error Resume Nextを入れているのは、主に縮小処理をする場合に印刷範囲が1列分しかないときに縮小を行うと、A列の縮小を行う=そんな列はない、というエラーになるため、その際にはエラーを無視して処理をしないようにしています。
[$A$1:$I$77]形式は、コロン(:)の左右のセル範囲を意味しており、「左上のA1セルから右下のI77セルの範囲」という意味になります。この右下の範囲を示す「I77」の「I」が印刷範囲の右側の列位置を示しているため、「I」を「J」に変えると拡大、「H」に変えると縮小、の状態になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
'//印刷範囲を右に拡大 Sub PrintAreaColumnExpand() Call PrintAreaColumnMove(1) End Sub '//印刷範囲を左に縮小 Sub PrintAreaColumnReduce() Call PrintAreaColumnMove(-1) End Sub Sub PrintAreaColumnMove(a_iAddColumn As Integer) On Error Resume Next Dim sPrintArea As String '// 印刷範囲 Dim sht As Worksheet '// シート Dim vColon As Variant '// 印刷範囲をコロン(:)で分割 Dim vRight As Variant '// 印刷範囲の右側を$で分割 Dim sEditColumn As String '// 印刷範囲の右側の列の編集後の列名 '// アクティブシートを保持 Set sht = ActiveSheet '// 印刷範囲を取得([$A$1:$I$77]形式で取得) sPrintArea = sht.PageSetup.PrintArea '// 印刷範囲が自動設定の場合 If sPrintArea = "" Then '// シートの入力範囲を暫定で印刷範囲とみなす sPrintArea = sht.UsedRange.Address '// [$A$1:$I$77]形式で取得 End If '// 印刷範囲をコロンで分割 vColon = Split(sPrintArea, ":") '// 印刷範囲の右下を$で分割(「$I$77」は、""、"I"、"77"に分割される) vRight = Split(vColon(1), "$") '// 印刷範囲の右側の列を編集("I"は拡大時は"J"になり、縮小時は"H"になる) sEditColumn = Split(Cells(, Range(vRight(1) & ":" & vRight(1)).Column + a_iAddColumn).Address, "$")(1) '// 印刷範囲を編集後の内容で再設定(元が[$A$1:$I$77]→拡大編集後[$A$1:$J$77])I→Jに変更、縮小はI→Hに変更 sPrintArea = vColon(0) & ":" & "$" & sEditColumn & "$" & vRight(2) sht.PageSetup.PrintArea = sPrintArea End Sub |
実行例
元の印刷範囲がこんな感じになっているとします。
拡大のマクロ(PrintAreaColumnExpand)を実行すると、右に拡大されます。
縮小のマクロ(PrintAreaColumnReduce)を実行した場合は、左に縮小されます。