Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年03月02日] [更新 2013年11月14日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
ブックの保存・形式を指定した保存等
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







エクセルの保存ダイアログを使用


エクセルの保存ダイアログを使用すると,いろいろな形式で保存できます.
Excel 2007 以降のブック形式である xlsx, xlsm 形式でも保存可能です.


リスト1
エクセルの保存ダイアログを表示して保存
procedure TplExcelFormEx2.Button1Click(Sender: TObject);
var
  pIndex : OleVariant;
  AItem  : OleVariant;
begin
  pIndex := xlDialogSaveAs;
  try
    AItem := xlfExcelApp.Dialogs.Item[pIndex];
    AItem.Show;
  except
    //エラー処理
  end;
  //キャプションの表示を変更しておく
  Self.Caption := xlfExcelBook.Name;
end;




[ 保存 ] ボタンでエクセルの保存ダイアログを表示


[保存] ボタンでエクセルの保存ダイアログを表示して保存する場合は,継承フォームのボタンクリックにそのコードを記述します.この時,元のダイアログを表示しないようにします.常にエクセルの保存ダイアログを使用するのであれば,元のエクセル操作フォームEx のコードを書きえてください.


リスト2
エクセルの保存ダイアログを表示して保存
procedure TplExcelFormEx2.btnFileSaveClick(Sender: TObject);
var
  pIndex : OleVariant;
  AItem  : OleVariant;
begin
  //inheritedをコメントアウトする
  //inherited;
  pIndex := xlDialogSaveAs;
  try
    AItem := xlfExcelApp.Dialogs.Item[pIndex];
    AItem.Show;
  except
    //エラー処理
  end;

  //キャプションの表示を変更しておく
  Self.Caption := xlfExcelBook.Name;
end;




上書き保存


上書き保存の機能を,別のボタンクリック等で実行するには,例えば次のようなコードで可能ず.


リスト3
[上書き] 保存の参考コード
procedure TplExcelFormEx2.Button6Click(Sender: TObject);
var
  pType    : OleVariant;
  pID      : OleVariant;
  pTag     : OleVariant;
  pVisible : OleVariant;
begin
  pType    := EmptyParam;
  pID      := 3;
  pTag     := EmptyParam;
  pVisible := EmptyParam;

  try
    xlfExcelApp.CommandBars.FindControl(pType, pID, pTag, pVisible).Execute;
  except
  end;
end;




[上書き] ボタンの機能を変更


[上書き] ボタンの機能をカスタマイズしたい場合も同様に,上のコード,あるいは,本ページのこれ以降のコードを参考にして書き換えることにより可能です.




保存形式を指定して保存


指定のファイル形式で保存するには,以下のように,保存の際にパラメータで指定します.[CSV ファイルへの保存] もこの方法で可能です.


図1
いろいろな保存形式の定数の一部 (VBA のヘルプから)

リスト4
保存形式を指定して保存.HTML 形式で保存する例
procedure TplExcelFormEx2.Button2Click(Sender: TObject);
var
  pFilePath      : OleVariant;
  pFileFormat    : OleVariant;
  pPassword      : OleVariant;
  pWritePassword : OleVariant;
  pReadOnly      : OleVariant;
  pCreateBackup  : OleVariant;
  pAccessMode    : OleVariant;
begin
  pFilePath := ExtractFilePath(Application.ExeName) + 'ExcelTest.html';

  //保存形式の指定(xlHtmlはhtml形式保存)
  pFileFormat    := xlHtml;
  pPassword      := '';
  pWritePassword := '';
  pReadOnly      := False;
  pCreateBackup  := False;
  pAccessMode    := xlNoChange;

  try
    //SaveAsは別の名前で保存するメソッド.引数は省略不可
    xlfExcelBook.SaveAs( pFilePath,      //保存ファイル名
                         pFileFormat,    //保存形式.現在のエクセルのバージョン形式
                         pPassword,      //パスワード
                         pWritePassword, //文書読出しパスワード指定
                         pReadOnly,      //読取り専用推奨表示の有無
                         pCreateBackup,  //バックアップファイル作成
                         pAccessMode,    //アクセスモード
                         EmptyParam,     //ブックが共有の場合のコンフリクトの解決方法
                         EmptyParam,     //最近使用したファイルの一覧をブックに追加
                         EmptyParam,     //TextCodePage
                         EmptyParam,     //TextVisualLayout
                         0);

    //保存したことにする
    xlfExcelBook.Saved[0] := True;
    //キャプションの表示を変更しておく
    Self.Caption := xlfExcelBook.Name;
  except
  end;
end;



図2
HTMLファイル形式で保存の例
  • ExcelTest.html の名前で保存されるが,[ExcelTest.files] というフォルダも作成されて,そこにシート別に保存される
  • スタイルシートも作成される
図3
ブラウザでの表示結果
  • 最下部のタブをクリックすると,エクセルのブックのように表示が切り替わる

TExcelWorkBook を使用した上のコードでは,SaveAs メソッドの引数が省略できません.
TExcelWorkBook を OleVariant 型の変数に置き換えて処理すれば,下のコードのように,引数を省略できます.


リスト5
保存形式を指定して保存.HTML 形式で保存する例.OleVariant 型を使用する場合
procedure TplExcelFormEx2.Button3Click(Sender: TObject);
var
  objExcelSheet : OleVariant;
  pFilePath     : OleVariant;
  pFileFormat   : OleVariant;
begin
  pFilePath := ExtractFilePath(Application.ExeName) + 'ExcelTest.html';

  //xlfExcelBook(TExcelWorkBook)をOleVariant型にして扱うとVBA的な使い方が可能
  objExcelSheet := xlfExcelApp.ActiveWorkbook;

  //保存形式の指定(xlHtmlはhtml形式保存)
  pFileFormat := xlHtml;

  try
    objExcelSheet.SaveAs(pFilePath, pFileFormat);
    //保存したことにする
    xlfExcelBook.Saved[0] := True;
    //キャプションの表示を変更しておく
    Self.Caption := xlfExcelBook.Name;
  except
  end;
end;




エクセル 2007 以降の xlsx 形式で保存


エクセルの保存ダイアログを表示して,保存形式を選択して保存すれば,エクセル 2007 以降のブック形式で保存することができます.また,上の保存形式を指定した保存のコードで保存形式を指定すればエクセル 2007 以降の形式で保存できます.
ただし,エクセル操作フォームEx では,これらの定数変数は使用できません.そこで次のサンプルコードでは,これらの定数値を定義して使用しています.

システムに複数のバージョンのエクセルがインストールされている環境では注意が必要です.システムのカレントバージョンが,エクセル 2007 以上になっていないと保存に失敗します.


リスト6
エクセル 2007 以降のブック形式で保存 (マクロは保存しない)
必要ならば保存ダイアログを表示するようにする
procedure TplExcelFormEx2.Button4Click(Sender: TObject);
const
  xlOpenXMLWorkbook             = 51;
  xlOpenXMLWorkbookMacroEnabled = 52;
var
  objExcelSheet : OleVariant;
  pFilePath     : OleVariant;
  pFileFormat   : OleVariant;
begin
  pFilePath := ExtractFilePath(Application.ExeName) + 'テスト.xlsx';

  //xlfExcelBook(TExcelWorkBook)をOleVariant型にして扱うとVBA的な使い方が可能
  objExcelSheet := xlfExcelApp.ActiveWorkbook;

  //保存形式の指定(xlOpenXMLWorkbookはxlsx形式保存)
  pFileFormat := xlOpenXMLWorkbook;

  try
    objExcelSheet.SaveAs(pFilePath, pFileFormat);
    //保存したことにする
    xlfExcelBook.Saved[0] := True;
    //キャプションの表示を変更しておく
    Self.Caption := xlfExcelBook.Name;
  except
  end;
end;




エクセル 2007 以降の xlsm 形式で保存


エクセル 2007 以降では,マクロも保存可能な形式と,できない形式があります.xlsx はマクロが保存できないファイル形式です.マクロも保存するには,保存形式を xlOpenXMLWorkbookMacroEnabled とし,拡張子を xlsm とします.

システムに複数のバージョンのエクセルがインストールされている環境では注意が必要です.システムのカレントバージョンが,エクセル 2007 以上になっていないと保存に失敗します.


リスト7
エクセル 2007 以降のブック形式で保存 (マクロも保存する場合)
必要ならば保存ダイアログを表示するようにする
procedure TplExcelFormEx2.Button5Click(Sender: TObject);
const
  xlOpenXMLWorkbook             = 51;
  xlOpenXMLWorkbookMacroEnabled = 52;
var
  objExcelSheet : OleVariant;
  pFilePath     : OleVariant;
  pFileFormat   : OleVariant;
begin
  pFilePath := ExtractFilePath(Application.ExeName) + 'テスト.xlsm';

  //xlfExcelBook(TExcelWorkBook)をOleVariant型にして扱うとVBA的な使い方が可能
  objExcelSheet := xlfExcelApp.ActiveWorkbook;

  //保存形式の指定(xlOpenXMLWorkbookはxlsx形式保存)
  pFileFormat := xlOpenXMLWorkbookMacroEnabled;

  try
    objExcelSheet.SaveAs(pFilePath, pFileFormat);
    //保存したことにする
    xlfExcelBook.Saved[0] := True;
    //キャプションの表示を変更しておく
    Self.Caption := xlfExcelBook.Name;
  except
  end;
end;