使用到Excel的后期绑定,如何从活动单元格移动到下一行的第一个单元格?

使用到Excel的后期绑定,如何从活动单元格移动到下一行的第一个单元格?,excel,com,vba,Excel,Com,Vba,我正在使用后期绑定(在C#中,使用反射等)通过COM访问Excel。换句话说,我首先使用 Type excelType = Type.GetTypeFromProgId("Excel.Application"); object excelApplication = Activator.CreateInstance(excelType); (事实上,它比这更通用,但这给出了想法) 正如许多人在StackOverflow中指出的那样,了解如何使用Office的COM接口的一个好方法是在Excel中

我正在使用后期绑定(在C#中,使用反射等)通过COM访问Excel。换句话说,我首先使用

Type excelType = Type.GetTypeFromProgId("Excel.Application");
object excelApplication = Activator.CreateInstance(excelType);
(事实上,它比这更通用,但这给出了想法)

正如许多人在StackOverflow中指出的那样,了解如何使用Office的COM接口的一个好方法是在Excel中记录一个宏,然后查看VBA代码以查看要调用的类成员

当我这样做时,我看到如果您有一个对活动单元格的引用(从Excel.Application对象的ActiveCell属性获得),那么VBA引用ActiveCell.Offset(x,y)来引用相对于该ActiveCell的单元格(x和y是行和列索引)。但是,如果我尝试访问具有后期绑定的单元格的Offset方法,InvokeMember方法将失败,并显示一个异常“Member not found”

如果我使用Visual Studio对象浏览器来检查Microsoft.Office.Interop.Excel命名空间和ApplicationClass类(我认为它可以很好地查看由上述C代码通过ProgId获取的COM接口),它显示ApplicationClass具有类型为Microsoft.Office.Interop.Excel.Range的ActiveCell属性。检查该类表明,它确实没有名为“Offset”的成员,因此在我尝试调用它时“membernotfound”

这似乎意味着VBA宏使用的Excel对象模型与通过COM公开的对象模型不同!是这样,还是我遗漏了什么?如果是这样,我如何通过COM中的后期绑定获得相同的VBA对象模型

或者,是否有某种方法,使用偏移量以外的方法,可以将ActiveCell移动到下一行的开头,这正是我想要的?

您可以尝试以下方法:

dim i as integer

i = ActiveCell.Row + 1

Excel.ActiveSheet.Cells(i,1).value = "Whatever your value is."

答案是,像往常一样,只要你知道怎么做就很容易了

我的代码比我的问题中的示例稍微低一点,看起来有点像这样:

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引发了一个异常,消息为“Member not found”

当我将参数改为InvokeMember时,如下所示:

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

它为什么有效仍然是一个谜,我相信如果有人回答这个问题,他们会赢得一些声誉