我正在尝试我认为是一个相当简单的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
,它看起来像WorkbookParameter
的 ReadOnly 表兄弟,但是使用该方法不有所作为。
我也尝试过明确设置ThisWorkbook.Names(i).WorkbookParameter = True
,但这会导致错误:
“无效的过程调用或参数”
尽管WorkbookParameter
被列为读/写
任何人都可以解释为什么这不起作用,因为我也期待它吗?我误解了Name.WorkbookParameter
应该如何运作?有人能够成功运行吗?
答案 0 :(得分:23)
您可以使用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
答案 1 :(得分:3)
我没有设法使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
。
因此,您可以拆分!
并检查数组的长度。