运行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循环的第一行删除到第二行以删除它。我删除了该选项卡上的过滤器并将其重新打开,只是为了解决同样的问题。
谢谢!
答案 0 :(得分: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