我想删除工作簿中的所有全局命名范围。 我有这段代码:
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
If InStr(xName.Name, "!") = 0 Then xName.Delete
Next
即使我更改代码以删除所有命名范围,我仍然会得到相同的错误。
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
xName.Delete
Next
当我运行它时,只删除第一个命名范围,然后抛出400错误。它不会继续下一个。
是否存在我缺少的某种附加设置或设置?这段代码看起来很简单,但是我无法让它工作。
答案 0 :(得分:0)
好的,经过长时间的聊天和一些反复试验,我发现了问题。 它实际上是双重的。
这段代码不起作用的原因似乎是因为它找到的第一个命名范围是Excel内置范围,显然无法删除。 两个代码片段都是这种情况
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
xName.Delete
Next
和
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
If InStr(xName.Name, "!") = 0 Then xName.Delete
Next
因为这两个都找到了内置的命名范围" _xlfn.CONCAT"并尝试删除它。
我终于听从了@ QHarr的建议,并使用了不同的限定词。幸运的是,工作簿范围内的所有命名范围都包含了#34; Master"在名字中,所以很容易。
所以,最终解决方案:
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
If InStr(xName.Name, "Master") > 0 Then xName.Delete
Next
Thanx家伙!
答案 1 :(得分:0)
简单的解决方案是检查指定范围的第一个字符。特殊范围以" _"开头。 (下划线)。
我解决这个问题的方法是一个简单的检查。并向后工作。
Dim xName As Name
Dim xNum as Long
For XNum = Application.ActiveWorkbook.Names.Count To 1 Step -1
Set XName = Application.ActiveWorkbook.Names(XNum)
If InStr(xName.Name, "!") = 0 And Left(XName.Name <> "_", 1) Then xName.Delete
Next
在我的情况下,我删除了所有名称,因此不需要InStr(xName.Name, "!") = 0 And
,但这非常相似。