2017-04-10 1 views
2

J'utilise C# Interop pour obtenir des valeurs d'une feuille de calcul et j'obtiens l'erreur suivante:C# Interop Le membre non invocable 'Microsoft.Office.Interop.Excel.Range.End' ne peut pas être utilisé comme une méthode

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

Ceci est mon code:

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; 
} 

La chose est que si je fonctionne est éprouverai comme suit:

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

Suis-je manque s Quelque chose?

Répondre

3

On dirait que vous avez trouvé un bogue dans le compilateur C#. Le bogue est effectivement présent dans la solution de contournement, il devrait de ne pas compiler pour les mêmes raisons que le premier extrait n'a pas. Bien qu'il soit difficile de prétendre définitivement qu'il s'agit d'un bug, la spécification du langage C# ne décrit pas ce qui est acceptable dans ce cas. La propriété Range.End est une propriété indexée . Ces propriétés ne sont pas formellement supportées en C#, le langage permet uniquement à l'indexeur de classe (alias this[]) d'être la seule propriété indexée d'une classe. Mais cette restriction a été levée dans C# version 4, spécifiquement pour faciliter l'interopérabilité avec les serveurs COM. Comme Excel, les propriétés indexées sont très courantes dans les modèles d'objets COM.

Comme l'indexeur normal, vous devez utiliser des crochets. Correction:

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

Et la solution que vous deviez utiliser dans les anciennes versions C# est toujours disponible:

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

difficile à deviner pourquoi il trouve() parenthèses acceptable dans le second extrait. Il ressemble à un bug, nage comme un bug et se transforme en charlatan, c'est donc probablement un bug. Informez-le en cliquant sur le New Issue button. Je doute qu'ils vont le réparer, mais il pourrait y avoir plus de mal que ne le voit l'œil.