簡體   English   中英

使用后期綁定到Excel,如何從活動單元格移動到下一行的第一個單元格?

[英]Using late binding to Excel, how do I move from the active cell to the first cell in the next row?

我正在使用后期綁定(在C#中,使用反射等)通過COM訪問Excel。 換句話說,我首先使用以下方法獲取Excel.Application對象

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

(實際上,它比這更通用,但這給出了想法)。

正如許多人在StackOverflow中所指出的那樣,查看如何使用COM到Office的一種好方法是在Excel中記錄一個宏,然后查看VBA代碼以查看要調用的類成員。

這樣做時,我看到如果您有一個對活動單元格的引用(從Excel.Application對象的ActiveCell屬性獲得),則VBA會引用ActiveCell.Offset(x,y)來引用相對於該ActiveCell的單元格(x和y是行和列的索引)。 但是,如果我嘗試使用較晚的綁定訪問單元的Offset方法,則InvokeMember方法將失敗,並顯示“找不到成員”的異常。

如果我使用Visual Studio對象瀏覽器檢查Microsoft.Office.Interop.Excel命名空間和ApplicationClass類(我認為它可以很好地查看上述C#代碼通過ProgId獲取的COM接口),則顯示該ApplicationClass具有類型為Microsoft.Office.Interop.Excel.Range的ActiveCell屬性。 檢查該類表明它確實沒有名為“ Offset”的成員,因此當我嘗試調用它時,該成員沒有“找不到成員”。

這似乎意味着VBA宏為Excel使用的對象模型與通過COM公開的對象模型不同! 是這樣嗎,還是我想念什么? 如果是這種情況,如何通過COM中的后期綁定獲得相同的VBA對象模型?

或者,是否可以使用Offset以外的方法,將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引發了異常消息“找不到成員”。

當我將參數更改為InvokeMember時,內容如下:

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

然后它起作用了。

只是它為什么起作用仍然是一個謎,我相信如果有人回答,它將贏得一些聲譽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM