【问题标题】:Excel Application.Windows.Count returns 0Excel Application.Windows.Count 返回 0
【发布时间】:2017-03-19 04:56:06
【问题描述】:

我使用 Windows 10、Delphi Berlin 和 Microsoft Office 2007。我尝试获取打开的 Excel 窗口的数量。当我下载 Excel 文件并打开它时,会运行一个单独的 Excel,因此一个 Excel 窗口中只存在一个工作簿。

我导入了 Microsoft Office 12.0 对象库并编写了 2 个程序。 Button1Click 与 tExcelApplication 一起使用,而 Button2Click 与 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;

【问题讨论】:

    标签: excel delphi


    【解决方案1】:

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

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

    这两种方法各有利弊。后期绑定通常可以产生更简单和更简洁的代码。但是当你只在运行时发现你的错误时会以挫折为代价。

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

    【讨论】:

    • 在同样的情况下,两个程序产生不同的返回值。
    • 所以你问题的第二部分是为什么后期绑定代码返回零?还是早期绑定代码返回零?您是否 100% 确定确实有一个窗口并且 excel 给出了错误的值。似乎很难相信。
    • @JOS 试试 GetActiveOleObject,你可能正在启动一个新的 excel 进程。
    • 这是最可能的解释
    • @DavidHeffernan 第二个问题是关于由 CreateOleObject 创建的 _Excel。这已由 GetActiveOleObject 解决。
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2017-06-21
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多