印刷 | Excel作業をVBAで効率化 https://vbabeginner.net いつものExcel作業はVBAを使えば数秒で終わるかもしれませんよ Sat, 09 Nov 2024 13:29:45 +0000 ja hourly 1 https://wordpress.org/?v=6.6.2 https://vbabeginner.net/wp-content/uploads/2019/02/favicon-150x150.png 印刷 | Excel作業をVBAで効率化 https://vbabeginner.net 32 32 VBAで印刷範囲の列の拡大と縮小を行う https://vbabeginner.net/printarea-expand-reduce/ Tue, 21 Feb 2023 17:35:14 +0000 https://vbabeginner.net/?p=6619 印刷範囲を手で調整するのが面倒くさい

Excelの印刷範囲は改ページプレビューで青線をドラッグすることで変更できますが、1つのブックだけならいいですが、多数のブックの印刷範囲を調整しなければならない場合は結構面倒です。

なお、改ページプレビューでの表示はシートの右下にある、標準、ページレイアウト、改ページプレビューの3つのボタンを押すことで切り替えられます。

この青線の調整ですが、1つのシートを修正するのであれば大した話ではありませんが、多数のブック、シートの印刷範囲を修正するとなると結構うんざりしてきます。

以下では、青線で囲まれた印刷範囲の横位置(列位置)を拡大や縮小するマクロを紹介します。

印刷範囲の自動設定と手動設定の違い

シートの印刷範囲は「自動設定」と「手動設定」の2通りがあります。

通常は「自動設定」扱いでシートに入力されているセル範囲を印刷対象としますが、改ページプレビューの青線の位置をずらすと「手動設定」として扱われます。見た目では「自動設定」なのか「手動設定」なのかは判別できません。

WorksheetオブジェクトのPageSetup.PrintAreaプロパティを参照すると印刷範囲が取得できますが、取得できなかった場合は「自動設定」になっています。

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」に変えると縮小、の状態になります。

'//印刷範囲を右に拡大
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)を実行した場合は、左に縮小されます。

]]>
VBAでシートの印刷を行う(PrintOut) https://vbabeginner.net/printout/ Tue, 09 Jul 2019 16:07:07 +0000 https://vbabeginner.net/?p=4377 シートの印刷を行うには

VBAではワークシートやグラフシートなどの印刷を行うためにPrintOutメソッドが用意されています。

PrintOutメソッドは引数無しで実行すると全てのシートを印刷します。それとは逆に複数の引数を設定して細かい設定での印刷も可能です。

一般的には印刷したブックの印刷の設定は微調整などを経て1度決まるとそれ以降はほとんど変わることはありません。次に印刷する場合も前回と同じ設定で印刷することが大多数です。

そこで印刷が多いブックには印刷用の設定を事前に用意した関数を用意しておくと設定をいちいち触る必要がなくなります。

PrintOutメソッドの構文

親オブジェクト.PrintOut([From], [To], [Copies], [Preview], [ActivePrinter], [PrintToFile], [Collate], [PrToFileName], [IgnorePrintAreas])

引数は全て省略可能です。

親オブジェクト PrintOutメソッドの親オブジェクトにはChart、Charts、Range、Sheets、Window、Workbook、Worksheet、Worksheetsの8つのオブジェクトが指定できます。

ただ、実際に使うことが多いのはWorkbook、Worksheet、Worksheetsの3つでしょう。

From
(省略可)
印刷を開始するページ番号を指定します。最初のページは1になります。省略した場合は最初のページから印刷を開始します。
To
(省略可)
印刷を終了するページ番号を指定します。省略した場合は最後のページまで印刷します。
Copies
(省略可)
印刷する部数を指定します。最小部数は1になります。省略した場合は1部印刷します。
Preview
(省略可)
印刷プレビューを表示する場合はTrue、表示しない場合はFalseを指定します。省略した場合はFalseになります。
ActivePrinter
(省略可)
印刷先のプリンターの名前を指定します。省略した場合は現在使っているプリンター名が指定されます。
PrintToFile
(省略可)
印刷する内容をファイルに出力する場合はTrueを指定します。Trueを指定した場合は引数PrToFileNameで指定されたファイル名でファイル出力します。省略した場合はFalseになりファイル出力されません。
Collate
(省略可)
複数ページを2部以上印刷する場合に、部単位で印刷する場合はTrueを指定します。ページ単位で印刷する場合はFalseを指定します。省略した場合はFalseになります。
PrToFileName
(省略可)
引数PrintToFileがTrueの場合に出力先のファイル名を指定します。省略した場合はダイアログボックスが表示されファイル名欄に入力した名前をファイル名とします。引数PrintToFileがFalseの場合はダイアログボックスは表示されません。
IgnorePrintAreas
(省略可)
印刷範囲を無視して印刷する場合はTrueを指定します。印刷範囲を有効にする場合はFalseを指定します。省略した場合はFalseになります。親オブジェクトがSheets、Workbook、Worksheet、Worksheetsの4つのいずれかの場合のみ指定可能です。

引数を全て省略した場合

PrintOutメソッドは全ての引数を省略することが出来ます。

ActiveWorkbook.PrintOut

この1行だけでブックの全てのシートを印刷します。印刷に関する設定は事前に設定されている内容に依存します。また、印刷先がXPS Document Writerなどのように紙ではなく電子ファイル出力する場合は保存先とファイル名を確認するダイアログが表示されます。

現在使用しているプリンターを調べるには

PrintOutメソッドのActivePrinter引数に設定するプリンター名ですが、デバイスとプリンターなどで表示されている名前がプリンター名になります。ただ、それは正確なプリンター名ではありません。

正確なプリンター名を取得したい場合はVBA画面のイミディエイトウィンドウで「? Application.ActivePrinter」と入力してEnterキーを押すと以下のように出力されます。

Microsoft XPS Document Writer on Ne00:

これが正確なプリンター名になります。[ on Ne00:]の部分もプリンター名に含めます。

何も入力していないシート

ワークシートを追加しただけで何も入力していない場合は、印刷しようとしても「印刷できるものがありません」とメッセージが表示されます。

この状態でPrintOutメソッドを実行すると、上記のメッセージは表示されず、白紙ページが印刷されます。

サンプルコード

単純にブック全体を印刷する場合は引数を省略して以下のようなコードで印刷可能です。

Sub PrintOutTest()
    ActiveWorkbook.PrintOut
End Sub

ただ、実際にVBAで自動印刷させたいときに必要な引数は、From(開始ページ)、To(終了ページ)、Copies(印刷部数)、Collate(部単位・ページ単位指定)=True(部単位)の4つがメインになると思います。

その場合は以下のようなコードになります。

Sub PrintOutTest2()
    ActiveWorkbook.PrintOut From:=1, To:=2, Copies:=4, Collate:=True
End Sub

]]>