Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 以编程方式确定命名范围是否限定为工作簿的范围_Vba_Excel 2007 - Fatal编程技术网

Vba 以编程方式确定命名范围是否限定为工作簿的范围

Vba 以编程方式确定命名范围是否限定为工作簿的范围,vba,excel-2007,Vba,Excel 2007,我试图用一个相当简单的vba语句来测试一个命名范围是限定在工作簿还是特定工作表的范围内 作为测试,我创建了一个新的Excel文档,并添加了6个命名范围。以下是它们在名称管理器中的布局: 我希望跑步: For i = 1 To ThisWorkbook.Names.Count If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name Next i 将导致记录三个工作簿作

我试图用一个相当简单的vba语句来测试一个命名范围是限定在工作簿还是特定工作表的范围内


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


我希望跑步:

For i = 1 To ThisWorkbook.Names.Count
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name
Next i
将导致记录三个
工作簿
作用域命名范围,但不会发生任何情况。没有错误。
.Names(i).WorkbookParameter
所有指定范围上计算为
False
,我不确定原因


查看VBA帮助中的
Name
对象时,我遇到了
ValidWorkbookParameter
,它看起来像
WorkbookParameter
的只读表亲,但是使用该方法没有任何区别

我还尝试显式设置
此工作簿.Names(I).WorkbookParameter=True
,但这会导致错误:

“无效的过程调用或参数”

尽管
WorkbookParameter
被列为正在读/写



有人能解释一下为什么这不能像我期待的那样起作用吗?我是否误解了
Name.WorkbookParameter
的工作原理?是否有人能够成功运行此功能?

您可以使用父属性:

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


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

我喜欢使用
拆分的创造性解决方案
感谢您提供的解决方案。。。我没有想到要使用
Parent
属性。我将这一个标记为答案,因为它最直接地处理命名范围是属于工作簿还是工作表。感谢非常有用的解决方案。。。我仍然对VBA中
Name
对象的
WorkbookParameter
ValidWorkbookParameter
属性的行为感到好奇。在我看来,这些属性并没有像广告中所说的那样工作。不确定WorkbookParameter到底是什么,但怀疑它是用于Sharepoint中的Excel Services,而不是用于客户端Excel
For i = 1 To ThisWorkbook.Names.Count
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name
Next i