2017-03-09 51 views
1

我使用C#互操作,以获得从Excel工作表取决于传递给函数的参数的值存在,我收到以下错误:C#互操作的名称未在当前的背景下

the name 'sheet' does not exist in the current context

这是我的代码:

public void getIndexes(int num) 
{ 
    var wb = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; 
    var wsEvars = wb.Sheets["Evars"]; 
    var wsEvents = wb.Sheets["Events"]; 

    if (num == 0) 
    { 
     var sheet = wsEvars; 
    } 
    if (num == 2) 
    { 
     var sheet = wsEvents; 
    } 

    if (num != 2) 
    { 
     var rng = (Excel.Range)sheet.Range[sheet.Cells[3, 2], sheet.Cells[3, 25]]; 
    } 
} 

我假设sheet变量应该第一if语句之前被初始化...但它应该是这个变量,因为它是一个COM对象的类型?

enter image description here

+3

这只是一个'Excel.Worksheet'在这两种情况下。所以'Excel.Worksheet sheet = null;'在你说的第一个'if'之前。 – Equalsk

+0

如果某人传递了不是“0”或“2”的int值,该怎么办?听起来你可能想要一个'enum'来代替。 – Equalsk

+0

这些值从另一个函数传递,它们可以只有0和2 – Valip

回答

1

你要找的类型是Excel.Worksheet

正如您正确猜测,您可以在第一个if声明之前声明它。

public void getIndexes(int num) 
{ 
    var wb = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; 
    var wsEvars = wb.Sheets["Evars"]; 
    var wsEvents = wb.Sheets["Events"]; 

    Excel.Worksheet sheet = null; // Declared here 

    if (num == 0) 
    { 
     sheet = wsEvars; 
     // Rest of code 
     ... 

仅供参考,你可以将鼠标悬停在关键字var和工具提示告诉你它将编译的类型。

enter image description here

+0

还有一个问题......你是否也知道如何从我的代码中获取指定范围内的值? 我尝试了'var wsValues = rng.Value();'但不起作用 – Valip

+1

@Valip关闭我的头顶我认为它是'var values = rng.Cells.Value;'(它可能是'Value2' ),然后'values'包含这些值的数组。尽管没有一个互操作项目来测试。 – Equalsk

+0

它使用'var values = rng.Cells.Value;',谢谢! – Valip

0

如果你有设置对Excel互操作的参考反正然后宣布他们像这样:

Excel.Worksheet sheet = null; 
Excel.Workbook wb = Globals.ThisAddIn.Application.ActiveWorkbook; 
Excel.Worksheet wsEvars = wb.Sheets["Evars"]; 
Excel.Worksheet wsEvents = wb.Sheets["Events"]; 
相关问题