2017-04-10 125 views
2

我使用C#Interop從工作表中獲取一些值,並且出現以下錯誤:C#Interop非激活成員'Microsoft.Office.Interop.Excel.Range.End'不能像方法一樣使用

Non-invocable member 'Microsoft.Office.Interop.Excel.Range.End' cannot be used like a method.

這是我的代碼:

var wb = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; 
var wsEvars = wb.Sheets["Evars"]; 
var wsProps = wb.Sheets["Props"]; 
var wsEvents = wb.Sheets["Events"]; 
var wsListVars = wb.Sheets["List Vars"]; 

var sheetList = new Excel.Worksheet[] { wsEvars, wsProps, wsEvents, wsListVars }; 

for (var i = 0; i < sheetList.Length; i++) 
{ 
    // I get the error on the line below 
    var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count].End(Excel.XlDirection.xlUp).Row; 
} 

的事情是工作,如果我嘗試如下:

for (var i = 0; i < sheetList.Length; i++) 
{ 
    var rowLast = wsEvars .Range["I" + wsEvars .Rows.Count].End(Excel.XlDirection.xlUp).Row; 
} 

我失去了小號omething?

回答

3

看起來您在C#編譯器中發現了一個錯誤。該錯誤實際上是在解決方法中出現的,它應該由於第一個片段沒有的相同原因而不能編譯。儘管很難確定這是一個bug,但C#語言規範並沒有描述在這種情況下可以接受的東西。

Range.End財產是一個索引財產。這些屬性在C#中沒有正式支持,該語言只允許類索引器(又名this[])成爲類的唯一索引屬性。但是這個限制在C#版本4中得到了解決,特別是爲了與COM服務器進行互操作更容易。像Excel一樣,索引屬性在COM對象模型中非常常見。

和普通的索引器一樣,你必須使用方括號。修復:

var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count] 
           .End[Excel.XlDirection.xlUp].Row; 

,你不得不在舊的C#版本使用的解決辦法仍然是可用的:

var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count] 
           .get_End(Excel.XlDirection.xlUp).Row; 

很難猜測爲什麼它發現()括號中的第二片段可以接受的。它看起來像一個bug,像一個bug一樣遊動,像一個bug一樣呱呱叫,所以它可能是一個bug。通過單擊New Issue button讓他們知道。我懷疑他們會解決這個問題,但可能會有更多的錯誤而不是滿足目光。