2016-11-05 7 views
2

私はWindows 10、Delphi Berlin、およびMicrosoft Office 2007を使用します。開いているExcelウィンドウの数を取得しようとします。 Excelファイルをダウンロードして開くと別のExcelが実行されるため、1つのExcelウィンドウに1つのブックしか存在しません。Excel Application.Windows.Countは0を返します

Microsoft Office 12.0 Object Libraryをインポートして2つの手順を書きました。 Button1ClickはtExcelApplicationで動作し、Button2ClickはCreateOleObject( 'excel.application')で動作します。私がExcelを実行した後、前者はうまく機能しますが、Countはエディタだけでエラーとして認識され、後者は0を返します。

どのように迷惑なエラーメッセージを取り除くことができますか?あなたが遅延バインディングCOMを使用しているため

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; 

enter image description here

答えて

3

IDEでのメッセージです。メソッド呼び出しは実行時にディスパッチされ、実行時にのみメソッドが存在するかどうかがわかります。そのため、コンパイラはコードの妥当性をチェックできません。あなたのコードは正常に実行されるため、コードは正常ですが、遅いCOMの性質は、コードに構文エラーが含まれているとIDEが判断したことを意味します。最近バインドされたCOMを使用している場合は、無視するだけです。

初期バインドされたCOMに切り替えて、コンパイラがコードの構文をチェックできるようにすることができます。

両方のアプローチの長所と短所があります。遅延バインドは、しばしば、より単純でより簡潔なコードを生成します。しかし、実行時に間違いを見つけただけでは欲求不満を犠牲にしています。

戻り値がゼロの場合、明らかな結論はウィンドウがないことです。遅延バインドコードはExcelの新しいインスタンスを作成していますが、初期のバインドコードは既存のインスタンスに関連付けられています。既存のインスタンスを取得する場合は、GetActiveOleObjectを使用します。

+0

同じ状況では、2つのプロシージャは異なる戻り値を生成します。 –

+0

質問の2番目の部分は、なぜ後期バインドコードがゼロを返すのかです。それとも、初期バインドコードがゼロを返すのでしょうか?あなたは本当にウインドウがあることを100%確信していますか?エクセルは間違った価値を与えますか?信じがたい。 –

+2

@JOS GetActiveOleObjectを試してみると、新しいExcelプロセスを起動している可能性があります。 –

関連する問題