Excel互操作:从特定工作簿获取命名表(范围)

本文关键字:范围 获取 工作簿 互操作 Excel | 更新日期: 2023-09-27 18:07:01

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

我使用这个来获取Excel应用程序对象

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

我知道我可以通过

得到指定表的范围
_application.Range["MyTableName"];

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

Excel应用程序是唯一的,所以我不能简单地尝试基于窗口标题或类似的东西来获取过程。我可以根据它的标题获得工作簿对象:

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

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

如果有任何关于这方面的指导,我将不胜感激。

谢谢,

Excel互操作:从特定工作簿获取命名表(范围)

我能想到的最简单/最直接的方法是遍历Names集合,检查父元素,然后继续。

E。g:

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