Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2011年05月07日] [更新 2018年03月27日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
エクセルが起動中かを調査
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Excel 2010







エクセルが起動中かを調査


次のコードのように,エクセルのウインドウハンドルを取得して調べることができます.


図1
エクセルが起動中かを調査

リスト1
エクセルが起動されているかを,ウィンドウハンドルで調べる
procedure TForm1.Button1Click(Sender: TObject);
begin
  //エクセルが起動中かをウィンドウハンドルの値で判定
  if FindWindow('XLMAIN', nil) <> 0 then begin
    MessageBox(Handle, 'エクセル起動中', '情報' , MB_ICONINFORMATION);
  end else begin
    MessageBox(Handle, 'エクセルは起動していません', '情報' , MB_ICONINFORMATION);
  end;
end;


エクセルが起動中かどうかは,GetActiveOleObject 関数でも調べることができます.
CreateOleObject の引数で指定する COM オブジェクトのインスタンスは,1 つだけしか生成できません.したがって,GetActiveOleObject は,どちらかと言えば,自アプリで CreateOleObject で生成したオブジェクトのインスタンスの存在を調べることに利用されます.
この関数は,管理者権限で実行すると取得に失敗して,エクセルのインスタンスがまだ生成されていないことになります.デバッグ中,つまり IDE から実行するということは管理者権限で実行していることになります.


リスト2
エクセルのインスタンスが生成されているかを,GetActiveOleObject で調べる
//=============================================================================
//  エクセルが起動中かを調べる
//  実行中のアプリケーションのインスタンス取得はGetActiveOleObjectを使用する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  objExcel : OleVariant;
  IsOpen   : Boolean;
begin
  try
    objExcel := GetActiveOleObject('Excel.Application');
    IsOpen   := True;
  except
    on E: EOleSysError do begin
      IsOpen := False;
    end;
  end;

  if IsOpen then begin
    MessageBox(Handle, 'エクセルは起動しています', '情報', MB_ICONINFORMATION);
  end else begin
    MessageBox(Handle, 'エクセルは起動していません', '情報', MB_ICONINFORMATION);
  end;
end;




RPC サーバーを利用できません - 起動中のプロセスを調べる


エクセルを操作するアプリケーションが例外等で終了した場合,エクセルのプロセスが残ってしまうことがあります.その状態でエクセルの操作コードを実行すると「RPC サーバーを利用できません」等のエラーが発生し,処理が継続できなくなることがあります.
残っているプロセスが使用しているエクセルのブックは,読出し専用でないと開けません.



[備考]
RPC は Remote Procedure Call (リモートプロシージャコール) の略です.エクセルやワードを操作する場合,エクセルやワードを COM サーバとしてそのサーバに接続して操作します.
何らかの原因でそのサーバに接続するプログラムが異常終了すると,COM サーバが終了しないでそのプロセスがメモリ上に生成されたままになることがあります.そのような状態では COM サーバに接続できなくなります.



図2
RPC サーバーを利用できません

エクセルのプロセスが生成されているかを調べる方法については,以下のリンクの記事とサンプルも参考にしてください.



エクセル操作フォームEx に添付の ExcelKill.exe は,起動中のプロセスを調べて,エクセルのプロセスを強制的に終了させるプログラムです.



図3
エクセルのプロセスが生成されている
  • プロセスのイメージ名は EXCEL.EXE
  • *32 は 32 ビットのプロセス
  • EXCEL.EXE を選択して [プロセスの終了] をクリックするとプロセスを強制終了できる
図4
添付の ExcelKill.exe を実行
  • メモリ上に残っているエクセルのプロセスを強制終了できる
  • ただし,Windows NT では機能しない




エクセルのバージョン


エクセル操作フォームEx が起動中であれば,エクセル操作フォームEx にもバージョン取得のプロパティがありますが,エクセルのオブジェクトの Version プロパティでも取得できます.


図5
エクセルのバージョン


リスト3
エクセルのバージョン
//=============================================================================
//  エクセルのバージョン番号
//=============================================================================
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
begin
  MessageBox(Handle, PChar(xlfExcelApp.Version[0]), 'バージョン', MB_ICONINFORMATION);
end;