C#Interop非可调用成员“Microsoft.Office.Interop.Excel.Range.End”不能像方法一样使用
我正在使用C#互操作从工作表中获取一些值,我得到以下错误:
非可调用成员“Microsoft.Office.Interop.Excel.Range.End”不能像方法一样使用。
这是我的代码:
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; }
我错过了什么吗?
看起来你在C#编译器中发现了一个bug。 该错误实际上是在解决方法中出现的,它不应该由于第一个片段没有的相同原因而编译。 尽pipe很难确定这是一个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一样呱呱叫,所以这可能是一个错误。 让他们通过单击新问题button来了解它。 我怀疑他们会解决这个问题,但是可能会有更多的错误而不是眼前的问题。