使用范围名称在工作簿级别的范围对象,Excel对象出现Excel VBA错误1004

问题描述 投票:0回答:1

为什么此代码停止工作?

我已经使用VBA中范围为[[decades的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
我理解为什么使用sheets()限定符会使代码起作用。例如,如果范围名称的作用域为工作表,则需要Sheets()限定符。但是,当range_name的作用域范围为工作簿级别时,我不想更改所有的VBA代码(我有很多)来用Sheet()对象限定Range()对象。我希望有一些我无意间更改的东西,可以恢复到正常状态。

谁能告诉我为什么以前没有Sheet()对象限定符的代码可以工作吗?

我是否缺少图书馆,或者也许我有两个相互冲突的图书馆?如何获得此功能? BTW,https://docs.microsoft.com/en-us/office/vba/excel/concepts/cells-and-ranges/refer-to-named-ranges确认Range()应该与在工作簿级别范围内的命名范围一起工作。
excel vba named-ranges
1个回答
1
投票
如果在工作簿级别定义了命名范围,则无需使用工作表对其进行限定。如果您使用表格来限定它,则它必须是范围指向的表格。但是,如果您不符合要求,Excel会在

ActiveWorkbook中查找范围,而该范围不一定是您期望的工作簿。

我创建了一个包含2个工作表的工作簿,其中包含三个命名范围:MyGlobalRange是在

Workbook

级别上声明的范围,指向工作表1。MyLocalRange1是在[[Worksheet级别上声明的范围,指向工作表1。MyLocalRange2是在[[工作表级别上声明的范围,指向工作表2。以下代码显示了在哪种情况下可以访问哪个范围。首先,sheet1是活动的,其次是sheet2,最后我创建一个新的工作簿,该工作簿获取Active WorkbookSub testSub() ThisWorkbook.Activate ThisWorkbook.Sheets(1).Activate DumpNamedRanges "Sheet 1" ThisWorkbook.Sheets(2).Activate DumpNamedRanges "Sheet 2" Dim newWB As Workbook Set newWB = Workbooks.Add DumpNamedRanges "new Workbook" newWB.Close False End Sub Sub DumpNamedRanges(msg As String) On Error Resume Next Debug.Print msg, "G unqual :", Range("MyGlobalRange").Value Debug.Print msg, "G sheet 1:", ThisWorkbook.Sheets(1).Range("MyGlobalRange").Value Debug.Print msg, "G sheet 2:", ThisWorkbook.Sheets(2).Range("MyGlobalRange").Value Debug.Print msg, "L1 unqual:", Range("MyLocalRange1").Value Debug.Print msg, "L1 qual :", ThisWorkbook.Sheets(1).Range("MyLocalRange1").Value Debug.Print msg, "L2 unqual:", Range("MyLocalRange2").Value Debug.Print msg, "L2 qual :", ThisWorkbook.Sheets(2).Range("MyLocalRange2").Value On Error Goto 0 End Sub

这是结果。 On Error Resume Next

跳过无效的行Sheet 1 G unqual : I am global Sheet 1 G sheet 1: I am global Sheet 1 L1 unqual: I am local sheet 1 Sheet 1 L1 qual : I am local sheet 1 Sheet 1 L2 qual : I am local sheet 2 Sheet 2 G unqual : I am global Sheet 2 G sheet 1: I am global Sheet 2 L1 qual : I am local sheet 1 Sheet 2 L2 unqual: I am local sheet 2 Sheet 2 L2 qual : I am local sheet 2 new Workbook G sheet 1: I am global new Workbook L1 qual : I am local sheet 1 new Workbook L2 qual : I am local sheet 2
只要工作簿处于活动状态,您就可以访问在工作簿级别上声明的不合格范围。合格后,必须使用正确的纸张。当工作表本身处于活动状态时,可以无限制地访问在工作表级别上声明的范围。但是,当另一本工作簿处于活动状态时,所有范围都只能通过合格访问。

不用说,解决方案不应是使用Activate-命令来解决该问题。始终限制您拥有的所有资产,永远不要依赖ActivesheetActiveWorkbook

© www.soinside.com 2019 - 2024. All rights reserved.