Vba 以编程方式确定命名范围是否限定为工作簿的范围
我试图用一个相当简单的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 将导致记录三个工作簿作
作为测试,我创建了一个新的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