1

COM 経由で Excel にアクセスするために、レイト バインディング (C# で、リフレクションなどを使用) を使用しています。つまり、Excel.Application オブジェクトを取得することから始めます。

Type excelType = Type.GetTypeFromProgId("Excel.Application");
object excelApplication = Activator.CreateInstance(excelType);

(実際には、それはそれよりも一般的ですが、それはアイデアを与えます).

StackOverflow で多くの人が指摘しているように、Office への COM インターフェイスの使用方法を確認する 1 つの良い方法は、Excel でマクロを記録し、VBA コードを見て、どのクラス メンバーを呼び出すかを確認することです。

これを行うと、アクティブ セル (Excel.Application オブジェクトの ActiveCell プロパティから取得) への参照がある場合、VBA は ActiveCell.Offset(x,y) を参照して、その ActiveCell に関連するセルを参照することがわかります。 (x と y は行と列のインデックスです)。ただし、遅延バインディングで Cell の Offset メソッドにアクセスしようとすると、InvokeMember メソッドは「メンバーが見つかりません」という例外で失敗します。

Visual Studio Object Browser を使用して Microsoft.Office.Interop.Excel 名前空間と ApplicationClass クラス (上記の C# コードで取得した COM インターフェイスを ProgId 経由で取得するとよくわかると思います) を調べると、次のように表示されます。その ApplicationClass には、Microsoft.Office.Interop.Excel.Range 型の ActiveCell プロパティがあります。そして、そのクラスを調べると、実際には「オフセット」という名前のメンバーがないため、呼び出そうとすると「メンバーが見つかりません」と表示されます。

これは、VBA マクロが、COM 経由で公開されているものとは異なる Excel のオブジェクト モデルを使用していることを意味しているようです。そうですか、それとも何か不足していますか? その場合、COM で遅延バインディングを介して同じ VBA オブジェクト モデルを取得するにはどうすればよいでしょうか。

または、Offset 以外のメソッドを使用して、ActiveCell を次の行の先頭に移動できるようにする方法はありますか?

4

2 に答える 2

0

これを試すことができます:

dim i as integer

i = ActiveCell.Row + 1

Excel.ActiveSheet.Cells(i,1).value = "Whatever your value is."
于 2012-12-27T20:08:42.787 に答える
0

答えは、いつものように、方法がわかれば簡単です。

私の質問のサンプルから少し下にある私のコードは、次のように見えました。

object activeCell;
object result;
// in here code to get the correct value into activeCell
if(activeCell.GetType().GetProperty("Offset") == null){
  result = activeCell.GetType().InvokeMember("Offset", BindingFlags.InvokeMethod, null, activeCell, new object[] {1, 0});
}

「メンバーが見つかりません」というメッセージで例外をスローしたのは、その InvokeMember でした。

パラメータを InvokeMember に変更すると、次のようになります。

result = activeCell.GetType().InvokeMember("Offset", BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, activeCell, new object[] {1, 0});

それからそれは働いた。

なぜそれが機能するのかはまだ謎ですが、答えれば誰かの評判が上がると確信しています.

于 2012-12-28T11:45:14.320 に答える