C# Interop 不可调用成员 'Microsoft.Office.Interop.Excel.Range.End' 不能像方法一样使用
C# Interop Non-invocable member 'Microsoft.Office.Interop.Excel.Range.End' cannot be used like a method
我正在使用 C# Interop 从工作表中获取一些值,但出现以下错误:
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;
}
我是不是漏掉了什么?
您似乎在 C# 编译器中发现了错误。该错误实际上存在于解决方法中,它 应该 不能编译,原因与第一个代码段没有编译的原因相同。尽管很难确定这是一个错误,但 C# 语言规范并未描述在这种情况下可接受的内容。
Range.End
属性 是一个 索引 属性。 C# 不正式支持此类属性,该语言仅允许 class 索引器(又名 this[]
)成为 class 的唯一索引 属性。但在 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;
很难猜出为什么它在第二个代码段中发现 () 括号是可接受的。它长得像虫子,游起来像虫子,叫声也像虫子,所以它很可能是虫子。单击 New Issue button 让他们知道。我怀疑他们会修复它,但问题可能比看起来更多。
我正在使用 C# Interop 从工作表中获取一些值,但出现以下错误:
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;
}
我是不是漏掉了什么?
您似乎在 C# 编译器中发现了错误。该错误实际上存在于解决方法中,它 应该 不能编译,原因与第一个代码段没有编译的原因相同。尽管很难确定这是一个错误,但 C# 语言规范并未描述在这种情况下可接受的内容。
Range.End
属性 是一个 索引 属性。 C# 不正式支持此类属性,该语言仅允许 class 索引器(又名 this[]
)成为 class 的唯一索引 属性。但在 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;
很难猜出为什么它在第二个代码段中发现 () 括号是可接受的。它长得像虫子,游起来像虫子,叫声也像虫子,所以它很可能是虫子。单击 New Issue button 让他们知道。我怀疑他们会修复它,但问题可能比看起来更多。