Excel Application.Windows.Count返回0

Excel Application.Windows.Count返回0,excel,delphi,Excel,Delphi,我使用Windows10、Delphi Berlin和MicrosoftOffice2007。我尝试获取打开的Excel窗口的数量。当我下载Excel文件并打开它时,一个单独的Excel会运行,所以一个Excel窗口中只存在一个工作簿 我导入了MicrosoftOffice12.0对象库并编写了2个过程。Button1Click适用于tExcelApplication,Button1Click适用于CreateOleObject('excel.application')。运行Excel后,前者工

我使用Windows10、Delphi Berlin和MicrosoftOffice2007。我尝试获取打开的Excel窗口的数量。当我下载Excel文件并打开它时,一个单独的Excel会运行,所以一个Excel窗口中只存在一个工作簿

我导入了MicrosoftOffice12.0对象库并编写了2个过程。Button1Click适用于tExcelApplication,Button1Click适用于CreateOleObject('excel.application')。运行Excel后,前者工作正常,但Count仅在编辑器中被识别为错误,而后者返回0

我如何才能删除恼人的错误消息或使Excel正常工作

type
  TForm1 = class(TForm)
    ExcelApplication1: TExcelApplication;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Caption := IntToStr(ExcelApplication1.Windows.Count);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  _Excel: Variant;
begin
  _Excel := CreateOleObject('excel.application');

  Button2.Caption := _Excel.windows.count;
end;

IDE中的消息是因为您正在使用后期绑定的COM。方法调用在运行时被调度,只有在运行时您才能发现该方法是否存在。因此,编译器无法检查代码的有效性。您的代码可以正常运行,因为它执行正确,但后期绑定COM的性质意味着IDE认为您的代码包含语法错误。在使用后期绑定COM时,您只需忽略它

您可以切换到早期绑定的COM,让编译器能够检查代码的语法

这两种方法都有利弊。后期绑定通常可以生成更简单、更简洁的代码。但是,当你只在运行时发现自己的错误时,你会感到沮丧


如果返回的值为零,那么我想显而易见的结论是没有窗口。后期绑定的代码正在创建Excel的新实例,但早期绑定的代码正在附加到现有实例。若要获取现有实例,请使用
GetActiveOleObject

在相同的情况下,这两个过程产生不同的返回值。因此,问题的第二部分是为什么后期绑定代码返回零?还是早期绑定代码返回零?您是否100%确定确实存在一个窗口,并且excel给出了错误的值。似乎很难相信。@JOS尝试GetActiveOleObject,您可能正在启动一个新的excel进程。这是最有可能的explanation@DavidHeffernan第二个问题是关于由CreateOleObject创建的_Excel。这是通过GetActiveOleObject解决的。