Excel Interop:从特定工作簿中获取命名表(Range)

时间:2015-08-08 01:47:16

标签: c# excel-interop

我正在尝试使用Excel对象库v.15创建一个与Excel交互的WinForms应用程序。

我正在使用它来获取Excel应用程序对象

(Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

我知道我可以使用

获取我想要的命名表的范围
_application.Range["MyTableName"];

现在,我遇到的问题是,如果我同时打开了两个工作簿,并且每个工作簿都有一个同名的命名表,我不知道将返回哪个范围。

Excel应用程序是唯一的,因此我不能简单地尝试基于窗口标题或类似的东西获取进程。 我可以根据标题得到Workbook对象:

_application.Workbooks.Cast<Workbook>().FirstOrDefault(w.Name.Equals(title))

但是我无法访问特定工作簿的范围。 我知道我可以遍历工作簿元素的表格,试图找到表格,但我想知道是否还有另一种“更清洁”的方式。

我很感激任何指导方针。

谢谢,

  • 威尔

1 个答案:

答案 0 :(得分:0)

我能想到的最简单/最直接的方法是遍历Names collection,检查父级,继续前进。

例如:

For Each NamedRange as Range in MyApplication.Names
    Dim Check as Object = TryCast(NamedRange.Parent, Workbook)
    If Check Is Nothing Then 
        Check = TryCast(NamedRange.Parent, Worksheet)
        Check = TryCast(Check.Parent, Workbook) 
    End If

    If Not Check Is Nothing AndAlso Check.Name = "MyWorkbook" Then 
        'Do something
    End If
Next