2011-12-28 54 views
10

我正在尝试我认为会是相当简单的vba语句来测试命名范围是否作用于工作簿或特定工作表。Progammatically确定命名范围是否作用于工作簿


作为测试,我创建了一个新的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所有的命名范围,我不知道为什么。


通过我碰到ValidWorkbookParameter它看起来像只读表妹WorkbookParameter传来VBA帮助Name对象看,但是使用方法不作任何区别。

我也试图明确设置ThisWorkbook.Names(i).WorkbookParameter = True,但是这将导致一个错误:

"Invalid procedure call or argument"

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


任何人都了解任何事情为什么这不起作用,因为我也期待它呢?我误解了Name.WorkbookParameter应该如何工作?任何人都可以得到这个成功运行?

+0

感谢非常有用的解决方案家伙......我仍然好奇VBA中'Name'对象的'WorkbookParameter'和'ValidWorkbookParameter'属性的行为。在我看来,这些属性不像*所宣称的那样工作*。 – 2011-12-28 15:32:17

+0

不确定WorkbookParameter是什么,但怀疑它是用于Sharepoint中的Excel Services而不是客户端Excel – 2011-12-29 00:21:50

回答

19

可以使用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 
+0

不错。感谢您的提示 – JMax 2011-12-28 15:07:40

+0

感谢您的解决方案......我没有想过使用'Parent'属性。我将其标记为答案,因为它最直接地处理了命名范围是属于工作簿还是工作表。 – 2011-12-28 15:30:17

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

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

+0

我喜欢使用“Split”的创意解决方案 – 2011-12-28 15:28:28

相关问题