[英]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.