为什么此代码停止工作?
我已经使用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”在活动工作表上,而当然,如果Range()符合正确的Sheet()对象,则代码可以正常工作。“ SNAP_Backup”在活动工作表上没有。
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()对象。我希望有一些我无意间更改的东西,可以恢复到正常状态。我是否缺少图书馆,或者也许我有两个相互冲突的图书馆?如何获得此功能? BTW,https://docs.microsoft.com/en-us/office/vba/excel/concepts/cells-and-ranges/refer-to-named-ranges确认Range()应该与在工作簿级别范围内的命名范围一起工作。谁能告诉我为什么以前没有Sheet()对象限定符的代码可以工作吗?
ActiveWorkbook中查找范围,而该范围不一定是您期望的工作簿。
我创建了一个包含2个工作表的工作簿,其中包含三个命名范围:MyGlobalRange
是在Workbook
级别上声明的范围,指向工作表1。MyLocalRange1
是在[[Worksheet级别上声明的范围,指向工作表1。MyLocalRange2
是在[[工作表级别上声明的范围,指向工作表2。以下代码显示了在哪种情况下可以访问哪个范围。首先,sheet1
是活动的,其次是sheet2
,最后我创建一个新的工作簿,该工作簿获取Active Workbook。 Sub 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
-命令来解决该问题。始终限制您拥有的所有资产,永远不要依赖Activesheet
或ActiveWorkbook
。