我试图从Win32 Delphi应用程序中自动化Excel。我不得不在代码中放入numetric Sleep(),以便Excel(更有可能)为下一个自动化命令做好准备。通常在打开文件后,但在许多其他情况下也是如此。当然,这并不理想,所以我正在寻找一种方法来检查Excel是否准备好了。
我找到了属性Application.Ready,但在我的用例中它从来没有返回false。也许是Application.Ready只在Excel等待用户处理av messagebox时返回false,以及类似的情况?
是否有其他方法可以使用自动化来确定Excel是否准备好了?
代码示例:
procedure CopyFromExcelSheet;
var
ExcelApp: OleVariant;
WorkSheet: OleVariant;
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := False;
ExcelApp.Workbooks.Open(<Filename>);
GiveExcelSomeTime(ExcelApp, 600);
WorkSheet := ExcelApp.Workbooks[1].Sheets[1];
WorkSheet.Activate;
GiveExcelSomeTime(ExcelApp, 300);
WorkSheet.UsedRange.Copy;
etc.
end;
procedure GiveExcelSomeTime(AApp: OleVariant; ATime: Integer);
var
LMillisec: Integer;
begin
LMillisec := 0;
while not AApp.Ready do
begin
Sleep(100);
LMillisec := LMillisec + 100;
if LMillisec > ATime * 2 then
Break;
end;
//This one I have never seen:
if LMillisec > 0 then
ShowMessage('Waited '+IntToStr(LMillisec)+' for Excel');
if LMillisec = 0 then
Sleep(ATime);
end;
字符串
1条答案
按热度按时间4szc88ey1#
看起来你可以从实现Ole消息过滤器中受益。我曾经遇到过同样的问题,我发现了这个链接。
How to extend existing interface IMessageFilter with TInterfacedObject?
然后我实现了下面的单元,在执行自动化操作时调用IOleMessageFilter.RegisterFilter,完成后调用IOleMessageFilter.RevokeFilter。
字符串