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 を次の行の先頭に移動できるようにする方法はありますか?