excel 尝试删除命名范围时出现VBA 400错误

yyyllmsg  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(180)

我要删除工作簿中的所有全局命名范围。我有这个代码:

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错误。它不会转移到下一个。
是否有某种附加功能或设置我错过了?这段代码看起来很简单,但我无法让它工作。

dffbzjpn

dffbzjpn1#

好的,经过长时间的交谈和一些尝试和错误,我找到了问题所在。实际上是双重的。
这段代码不起作用的原因,似乎是因为它找到的第一个命名范围是一个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的建议,使用了不同的限定词。幸运的是,我在工作簿范围中的所有命名范围的名称中都有“Master”,所以很容易。

因此,最终解决方案:

Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
    If InStr(xName.Name, "Master") > 0 Then xName.Delete
Next

Thanx伙计们!

wz3gfoph

wz3gfoph2#

简单的解决方案是检查命名范围的第一个字符。特殊范围以“_”(下划线)开头。
我解决这个问题的方法是一个简单的检查。倒着工作。

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,但这是非常相似的。

相关问题