以编程方式确定命名范围是否作用于工作簿

Har*_*don 12 vba excel-2007

我正在尝试我认为是一个相当简单的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
Run Code Online (Sandbox Code Playgroud)

我希望运行:

For i = 1 To ThisWorkbook.Names.Count
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name
Next i
Run Code Online (Sandbox Code Playgroud)

会导致Workbook记录三个范围的命名范围,但是没有任何反应.没有错误.该.Names(i).WorkbookParameter到求值False所有指定的范围,我不知道为什么.


通过查看NameVBA帮助中的对象我ValidWorkbookParameter看起来像ReadOnly的堂兄WorkbookParameter,但是使用该方法没有任何区别.

我也试过明确设置ThisWorkbook.Names(i).WorkbookParameter = True,但这会导致错误:

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

尽管WorkbookParameter被列为读/写的事实


任何人都可以解释为什么这不起作用,因为我也期待它?我误解了Name.WorkbookParameter应该如何工作?有人能够成功运行吗?

Cha*_*ams 24

您可以使用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
Run Code Online (Sandbox Code Playgroud)


JMa*_*Max 5

我没有设法使 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
Run Code Online (Sandbox Code Playgroud)

本地命名范围的名称(即仅限工作表的范围)的格式如下:而全局Sheet1!NamedRange命名范围的名称格式为:。NamedRange

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