以编程方式确定命名区域是否限定在工作簿的范围内



我正在尝试我认为将是一个相当简单的vba语句来测试是否命名的范围是工作簿或特定的工作表。


作为测试,我创建了一个新的Excel文档,并添加了6个命名范围。下面是它们在名称管理器:

中的布局
 Name         |   Refers To          |   Scope
 -------------+----------------------+-----------
 rng_Local01  |   =Sheet1!$A$2:$A$16 |   Sheet1
 rng_Local02  |   =Sheet1!$C$2:$C$16 |   Sheet1
 rng_Local03  |   =Sheet1!$E$2:$E$16 |   Sheet1
 rng_Global01 |   =Sheet1!$B$2:$B$16 |   Workbook
 rng_Global02 |   =Sheet1!$D$2:$D$16 |   Workbook
 rng_Global03 |   =Sheet1!$F$2:$F$16 |   Workbook

我希望运行:

For i = 1 To ThisWorkbook.Names.Count
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name
Next i

将导致记录三个Workbook作用域的命名范围,但是什么也没有发生。没有错误。.Names(i).WorkbookParameter所有的命名范围上评估为False,我不确定为什么。


在VBA帮助中查看Name对象,我遇到了ValidWorkbookParameter,它看起来像WorkbookParameterReadOnly表兄弟,但是使用该方法不会产生任何差异。

我也尝试显式设置ThisWorkbook.Names(i).WorkbookParameter = True,但是这会导致错误:

"无效的过程调用或参数"

尽管WorkbookParameter被列为Read/Write


有没有人能解释一下为什么我也在期待它呢?我是否误解了Name.WorkbookParameter应该如何工作?有人能让它成功运行吗?

可以使用Parent属性:

Sub Global_Local_names()
    Dim oNm As Name
    For Each oNm In Names
        If TypeOf oNm.Parent Is Worksheet Then
            Debug.Print oNm.Name & " is local to " & oNm.Parent.Name
        Else
            Debug.Print oNm.Name & " is global to " & oNm.Parent.Name
        End If
    Next
End Sub

我没有设法使WorkbookParameter工作,但我找到了一个解决方案:

For i = 1 To ThisWorkbook.Names.Count
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name
Next i

局部命名范围的名称(即仅作用于一个表)的格式为:Sheet1!NamedRange,而全局命名范围的名称格式为:NamedRange

因此,您可以分割!并检查数组的长度。

最新更新