【问题标题】:Programmatically determine if a named range is scoped to a workbook以编程方式确定命名范围是否限定为工作簿
【发布时间】:2012-01-29 05:14:12
【问题描述】:

我正在尝试使用我认为是相当简单的 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 在命名范围的 ALL 上计算为 False,我不知道为什么。


查看 VBA 帮助中的 Name 对象,我发现了 ValidWorkbookParameter,它看起来像 WorkbookParameterReadOnly 表亲,但是使用该方法没有任何区别。

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

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

尽管WorkbookParameter 被列为读/写


任何人都可以解释为什么这不能像我预期的那样工作吗?我是否误解了 Name.WorkbookParameter 应该如何工作?有没有人能让它成功运行?

【问题讨论】:

  • 感谢大家提供非常有用的解决方案...我仍然对 VBA 中 Name 对象的 WorkbookParameterValidWorkbookParameter 属性的行为感到好奇。在我看来,这些属性并没有像宣传的那样工作
  • 不确定 WorkbookParameter 到底是什么,但怀疑它用于 Sharepoint 中的 Excel Services 而不是客户端 Excel

标签: vba excel-2007


【解决方案1】:

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

【讨论】:

  • 感谢您的解决方案...我没想过使用Parent 属性。我将此标记为答案,因为它最直接地处理命名范围是属于工作簿还是工作表。
【解决方案2】:

我没有设法使 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

local Named Range 的名称(即仅限工作表的范围)的格式如下:Sheet1!NamedRangeglobal Named Range 的名称格式为:NamedRange.

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

【讨论】:

  • 我喜欢使用Split的创意解决方案
猜你喜欢
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2019-01-29
  • 2015-07-21
  • 2015-10-31
相关资源
最近更新 更多