私はExcelでOleAutomationを使用しています:= CreateOleObject('Excel.Application'); 関数Excel.ReplaceおよびExcel.SaveAsを使用します。これらの関数は私の問題に不可欠であり、除外することはできません。一方、OnCloseEvent を持たないOleVariant型を使用する必要があります。今私の問題が始まります:
最初に簡単な概要:
**procedure OpenExcel begins**
Excel := CreateOleObject('Excel.Application');
//Excel opens a template and replaces placeholders
**procedure OpenExcel end**;
これで、すべてのプレースホルダーが置き換えられた状態で Excel が開きます。この手順の後、クライアントは自分のシートを変更したり、間違いを修正したりできます.. 進行中、彼は Excel を閉じるか、ワークブックを保存したいと考えています。
そして、ここから私の問題が始まります。クライアントが Excel を閉じる瞬間を捉えたいのです。彼のドキュメントが保存されると、OleObject が破棄される前に、すべてのデータ (オブジェクトに配置されたパスや色などの文字列や ID などの整数) が ELO (ドキュメント アーカイブ) という名前の別のプログラムにコミットされます。しかし、OleObjects は終了などを認識できません。
この問題を解決する回避策はありますか? おそらく、オブジェクトを OleObject またはプロセス自体にリンクして、Excel がクライアントによって閉じられたタイミングを判断しますか?
\Ocx\Servers\excel200.pas によって提供される方法があるかどうか調べましたが、何も見つかりませんでした。私の同僚は、オフィス フォルダを調べて、Excel の .tlb ファイルを検索するように勧めましたが、存在しません。
上記の問題が解決できない場合
これが不可能な場合、OnClose イベントを持つオブジェクトでExcel.ReplaceとExcel.SaveAsを使用する方法を知っている人はいますか?
交換用の私の現在のコードは次のとおりです。
//for all sheets in the workbook
for iSheet := 1 to Excel.Worksheets.Count do
begin
//activate the sheet
Excel.Worksheets[iSheet].Activate;
// this will be..
sWhat := %First String%;
//..replaced by..
sReplacement := %Second String%;
// warnings off (override message or if excel didn't find a sWhat)
Excel.Application.DisplayAlerts := False;
Excel.Cells.Replace(
What := sWhat,
Replacement := sReplacement,
LookAt := xlWhole,
SearchOrder := xlByRows,
MatchCase := False,
SearchFormat := False,
ReplaceFormat := False
);
//warnings on
Excel.Application.DisplayAlerts := True;
end;
SaveAs メソッドも同様です。Excel.Cells.Replaceのように、Excel 自体が処理できるコマンドを送信するだけです。
私の問題の説明が十分に明確であることを願っています.私の英語は私が望むほど上手ではありません..
前もって感謝します!