【发布时间】:2020-09-04 11:18:55
【问题描述】:
为什么这段代码停止工作了?
几十年,我在 VBA 中使用范围为工作簿级别的 Excel 范围名称,而在大多数情况下,不必使用它们的 Sheets() 对象父对象来限定 Range() 对象。最近,如果命名范围不在活动工作表上,这将停止工作,现在会引发 1004 错误。
曾经有效的代码
If Range("SNAP_Current").Value = Range("SNAP_Backup").Value Then
debug.print "True"
else
debug.print "False"
End If
在这种情况下,“SNAP_Current”在活动工作表上,“SNAP_Backup”不在活动工作表上。 当然,如果 Range() 使用正确的 Sheet() 对象进行限定,代码就可以工作。
If Range("SNAP_Current").Value = **Sheets("Backup Copy").**Range("SNAP_Backup").Value Then
debug.print "True"
else
debug.print "False"
End If
我明白为什么使用 sheet() 限定符可以使代码正常工作。例如,如果范围名称限定为工作表,则需要 Sheets() 限定符。但是,当 range_name 范围限定为工作簿级别时,我不想更改我的所有 VBA 代码(我有很多)以使用 Sheet() 对象限定 Range() 对象。我希望有一些我无意中更改的内容可以撤消以恢复功能。
谁能告诉我为什么以前的代码在没有 Sheet() 对象限定符的情况下也能正常工作? 我是否缺少图书馆,或者我是否有两个冲突的图书馆? 我怎样才能恢复这个功能?
顺便说一句,https://docs.microsoft.com/en-us/office/vba/excel/concepts/cells-and-ranges/refer-to-named-ranges 确认 Range() 应该适用于工作簿级别的命名范围。
【问题讨论】:
-
根据我的经验,这里的大多数 VBA 人员会建议您使用
Workbook/Worksheet完全限定任何Range调用。 -
Range()适用于工作簿级别的命名范围,但适用于当前活动的工作簿。这是你的问题吗?我永远不会使用不合格的 Excel 对象(工作表、范围、单元格、形状...) -
我相信如果没有工作表限定符,excel 将尝试使用
Activesheet创建范围引用。正如您所提到的,这两个 NamedRanges 位于不同的工作表上,因此不能都在 activesheet 上。 -
你能验证你的命名范围确实是工作簿级别的吗?是否已更改为工作表范围?
-
无论活动工作表如何,我都可以访问工作簿范围内的命名范围。
标签: excel vba named-ranges