Delphi OLEのExcel操作術 第2回:印刷編

今回は印刷やプレビューを行う方法についてご説明します。

 

※第1回でも使用した以下の変数は、今回も引き続き使用します。

uses節には「System.Win.ComObj」を追加しておいて下さい。
(Delphi XE以前では「ComObj」)

var // 「OLEのExcel操作術」各Tips共通で使用する変数宣言
  MsExcel: OleVariant;       // ExcelのOLE変数
  MsApplication: OleVariant; // アプリケーションのOLE変数
  WBook: OleVariant;         // ブックのOLE変数
  WSheet: OleVariant;        // シートのOLE変数

 


印刷やプレビューを行う方法

印刷・プレビューは印刷対象のシートを指定し、メソッドを呼び出します。

下記のコードは対象となるExcelアプリケーションなどの各変数が設定されていることが前提です。
(プログラムではExcelファイルが開かれるコードを実行した状態になります)

では実際のコーディングです。

 

【印刷・プレビュー】
現在選択中のシートであれば、BookのActiveSheetで指定します。

  // 現在のSheet
  WSheet := WBook.ActiveSheet;

  // 印刷
  WSheet.PrintOut;

  // プレビューであれば次のメソッドです
  WSheet.PrintPreview;

印刷対象の指定は次のようなものも可能です。

プレビューの場合は、上記のように
「PrintOut」の代わりに「PrintPreview」を呼び出します。

 

【Sheetを指定(単数)】
シート名を指定して行うには次のようになります。

  // Sheet指定
  WBook.Sheets['Sheet2'].Select;
  WSheet := WBook.ActiveSheet;

  // 印刷
  WSheet.PrintOut;

 

【Sheetを指定(複数)】
シート名を複数指定して行うにはVarArrayOfを使用します。

  // Sheet指定
  WSheets := VarArrayOf(['Sheet1', 'Sheet2']);
  WBook.Sheets[WSheets].Select;

  // 印刷
  MsApplication.ActiveWindow.SelectedSheets.PrintOut;

 

【Book全体を印刷】
現在選択中のBookをすべて印刷するには次のようになります。

  // ブック全体を印刷
  MsApplication.ActiveWorkbook.Worksheets.PrintOut;

 


Excel印刷での便利なページ設定方法

ここからは、印刷やプレビューを行う際の印刷設定方法についてご説明します。

印刷やプレビューを行うには印刷対象のシートを指定し、
メソッドを呼び出すと先ほどお伝えしましたが、その前に印刷設定を行うことができます。
シートのPageSetupから指定します。

このとき、Excel側で決められた定数をconstで宣言しておくとわかりやすくなります。
(※uses節に「Excel2000」を追加しておくと今回使用する名前の定数が全て含まれているため、const宣言不要になります)

 

改ページの挿入

次のように位置をRangeを使って指定し、
PageBreakプロパティに手動改行の値を指定します。

const
  xlPageBreakManual    = -4135; // 手動ページ
  xlPageBreakAutomatic = -4105; // 自動改ページ(※参考:今回使用しない)
  xlPageBreakNone      = -4142; // 改ページ無し(※参考:今回使用しない)
・・・
  // Sheetの選択
  WBook.Sheets['Sheet1'].Select;
  WSheet := WBook.ActiveSheet;
  // 51行目の上(正確にはA51セルの左上)で改ページ
  WSheet.Range['A51', 'A51'].PageBreak  := xlPageBreakManual;

 

用紙方向

用紙方向はOrientationプロパティに1または2の値を設定します。

const
  xlPortrait  = 1;   // 縦
  xlLandscape = 2;   // 横
・・・
  // Sheetの選択
  WBook.Sheets['Sheet1'].Select;
  WSheet :=WBook.ActiveSheet;
  // 用紙方向設定
  WSheet.PageSetup.Orientation := xlPortrait;

 

用紙サイズ

用紙サイズはPaperSizeに設定します。

const
  xlPaperA3 = 8;
  xlPaperA4 = 9;
  xlPaperA5 = 11;
  xlPaperB4 = 12;
  xlPaperB5 = 13;
・・・
  WSheet.PageSetup.PaperSize := xlPaperA3;

 

ページ数の指定

縦と横それぞれ印刷するページ数を指定できます。
それにより縮小して印刷することができます。
すべて1ページに収めるときには次のように指定します。

  WSheet.PageSetup.Zoom := False;
  WSheet.PageSetup.FitToPagesWide := 1;
  WSheet.PageSetup.FitToPagesTall := 1;

また、縦方向のページは無制限で横幅は1ページに収めたいときには
次のようになります。

  WSheet.PageSetup.Zoom := False;
  WSheet.PageSetup.FitToPagesWide := 1;
  WSheet.PageSetup.FitToPagesTall := False;

 


Excel印刷での便利な印刷設定方法

ここからは印刷やプレビューで利用できる便利な方法をご紹介していきましょう。

 

印刷ダイアログの表示

今までは直接PrintOutやPrintPreviewメソッドから印刷やプレビュー処理を行ってきました。
しかしExcelの標準印刷ダイアログを表示させることも可能ですので、
プリンタ装置や部数などをここから指定させるようにすることもできます。

コーディングは次のようになります。
ここでも、引き渡すパラメータ値をconstで宣言しておくと、コードが見やすくなります。
(※ここでも、uses節に「Excel2000」を追加しておくと同様にconst宣言不要になります)

const
  xlDialogPrint = 8;
・・・
  // プリントダイアログの表示
  MsExcel.Dialogs.Item[xlDialogPrint].Show;

 

印刷の設定

印刷ダイアログから指定する内容をコードから設定できます。
PrintOutメソッドにパラメータを
PrintOut(開始ページ,終了ページ,プレビュー指定,部数)
という書式で付加します。

【印刷開始ページ/終了ページ】
  // 2〜3ページ印刷
  WBook.Sheets['Sheet1'].PrintOut(2, 3);

【印刷部数】
  // 3部印刷
  WBook.Sheets['Sheet1'].PrintOut(null, null, 3);

【プレビュー指定】
  // プレビュー(Trueならプレビュー、Falseならプリンタへ印刷)
  WBook.Sheets['Sheet1'].PrintOut(null, null, null, True);

 

印刷する部分を指定

Rangeを使ってセルの範囲を指定し、印刷を実行することで印刷する部分を指定できます。
(※ソースコード上にエラーインサイトが表示される場合がありますが、処理は正常に実行できます)

  // Sheet2のセル[B3からE4]を印刷
  WBook.Sheets['Sheet2'].Range['B3:E4'].PrintOut;

 

ページ数を取得

シートには縦・横それぞれの改ページ数をプロパティから取得できます。
これはページ数でなく改ページ数になるため、1ページであれば値は0となるため、
ページ数 = 改ページ数+1 となります。

総ページ数であれば、縦ページ数×横ページ数で求められますので、次のようなコードになります。

var
  VPcnt : Integer;
  HPcnt : Integer;
begin
  VPcnt := WBook.Sheets['Sheet1'].VPageBreaks.Count+1;
  HPcnt := WBook.Sheets['Sheet1'].HPageBreaks.Count+1;
  ShowMessage('総ページ数は'+ IntToStr(VPcnt*HPcnt)+'です');
end;