Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


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

DelphiアプリケーションでExcelを操作する便利な方法を
全7回に分けてご紹介してまいります。

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

 

※第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;

 

プリンタの設定(プリンタを指定して印刷)

印刷時にプリンタを指定したい場合、
以下のようにActivePrinterパラメータを指定するとプリンタ名を指定することが可能です。

※以下の例ではプリンタ名に「PrinterName」を使用

  // プリンタを指定して印刷
  WSheet.PrintOut(ActivePrinter:='PrinterName');

 

ActivePrinterを指定していないとExcelのアクティブプリンタで出力されますが、
(初期値は通常使うプリンタ)
事前にレジストリ等からプリンタのポート名を取得しておけば
事前にActivePrinterを指定しておくことも可能です。

「プリンタ名 on プリンタのポート名」という書式になっています)

レジストリHKEY_CURRENT_USERのキー『Software\Microsoft\Windows NT\CurrentVersion\Devices』に格納されている
例:ActivePrinter『PrinterName on Ne02』の設定例
※レジストリを使用するため、uses節に『Registry』または『System.Win.Registry』を追加

procedure TForm1.Button2Click(Sender: TObject);
var
  reg: TRegistry;
  slVAL: TStringList;
  i: Integer;
  s: String;
begin
  reg   := TRegistry.Create;
  slVAL := TStringList.Create;
  try
    Memo1.Lines.Clear;

    reg.RootKey := HKEY_CURRENT_USER;
    reg.OpenKeyReadOnly('Software\Microsoft\Windows NT\CurrentVersion\Devices');
    reg.GetValueNames(slVAL);             // キーから値の一覧を取得
    for i := 0 to (slVAL.Count - 1) do
    begin
      s := reg.GetDataAsString(slVAL[i]); // 値のデータを取得
      s := StringReplace(s, 'winspool,', '', [rfReplaceAll]); // 余剰部分を除去
      Memo1.Lines.Add(slVAL[i] + ' on ' + s);
    end;

  finally
    FreeAndNil(slVAL);
    FreeAndNil(reg);
  end;
end;

この例ではレジストリから取得したプリンタ名とポート名をTMemoに出力しています。
この方法で取得したプリンタ名とポート名を
MsExcel.ActivePrinter := ‘OneNote for Windows 10 on Ne11:’;
といった書式でセットすることが可能です。

 

 


(本記事は、以下の資料をもとに最新情報を含めた再構成をしております。)

  • ミガロ.情報マガジン「MIGARO News!!」
    • Vol.116 2010年7月号より(印刷指示)
    • Vol.117 2010年8月号より(改ページなどの設定)
    • Vol.118 2010年9月号より(印刷ダイアログの設定)
    • 新規追記(プリンタの設定)