【问题标题】:range names not in name manager范围名称不在名称管理器中
【发布时间】:2016-04-12 22:44:51
【问题描述】:

运行 VBA 代码使我能够检测到在工作表中应用过滤器会创建一个未出现在名称管理器中的范围名称(范围名称仅与标题或整个表相关联)。有没有办法知道为什么会发生这种情况和/或防止这种情况发生?这只是 Excel 故障吗?

导致我尝试运行的错误的 vba 代码部分如下:

For Each Rng In ActiveWorkbook.Names
    Set Rng2 = Range(Rng)
    If Not Intersect(Rng2, Range(rng1.Offset(1, 0), rng1.End(xlDown)).EntireRow) Is Nothing Then ActiveWorkbook.Names(Rng.Name).Delete
Next Rng

当我调试时,我注意到我的 Rng(顺便说一下,这是一个名称对象)指向一个我从未创建过的范围(我知道这一点是因为它所在的工作表没有其他范围名称,而我从来没有放任何东西) 我使用此 vba 代码来验证此表中是否存在该名称:

Sub test()

Dim Rng As Name

For Each Rng In Sheets("WindHail Zone 2").Names
    'ActiveWorkbook.Names(Rng.Name).Delete
    MsgBox Rng
Next Rng

End Sub

我从 for 循环的第一行到第二行删除了注释块以将其删除。我删除了该选项卡上的过滤器并将其重新添加,只是遇到了同样的问题。

谢谢!

【问题讨论】:

  • 那...只是不会发生。我们有什么办法可以重现它?什么样的过滤器?什么VBA代码?需要更多信息。
  • 请编辑您的帖子以包含更多详细信息:包括代码 sn-ps、到目前为止您尝试过的内容等。

标签: vba excel


【解决方案1】:

我不太清楚您要达到什么目的,但只要涉及“隐藏”名称和范围交集,您就必须考虑以下内容:

  • 过滤确实会创建隐藏的“名称”

    但它们都以字符串“_FilterDatabase”结尾

  • 如果应用于不属于同一工作表的范围,则范围交集将返回错误

所以这里你应该尝试什么

For Each Rng In ActiveWorkbook.Names
    Set rng2 = Range(Rng)
    If rng2.Parent.Name = rng1.Parent.Name And InStr(Rng.Name, "_FilterDatabase") = 0 Then 'the first check is for ranges belonging to the same worksheet and the second is for rng2 not deriving from any filtering
        ' now you can safely "Intersect"
        If Not Intersect(rng2, Range(rng1.Offset(1, 0), rng1.End(xlDown)).EntireRow) Is Nothing Then ActiveWorkbook.Names(Rng.Name).Delete
    End If
Next Rng

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多