Excel VBA:Workbooks.Open返回错误的对象

kef*_*a95 3 excel vba excel-vba

在Excel 2016中(不记得它在早期版本中发生过),我开始遇到Workbooks.Open命令无法返回正确的Workbook对象的问题。例如:

Dim wbkHelper as Workbook
Set wbkHelper = Workbooks.Open(filePath, ReadOnly:=true)
Run Code Online (Sandbox Code Playgroud)

“打开”命令可以正常运行-像预期的那样打开“ filePath”文件-但是wbkHelper最终指向完全错误的文件,通常是ThisWorkbook对象。在此之后,永远不会将wbkHelper对象重新分配给代码,因此它不是代码正在执行的操作。这仅在某些情况下发生,并且可能难以重现,但在发生时会破坏整个宏。

我可以想到多种解决方法,但这不是必须的吗?这是一直使用的核心VBA功能,您希望它可以正常工作。

小智 6

我已经看到了用VB6编写的旧应用程序,该应用程序已经使用了多年,并且升级到Excel 2016的用户开始报告问题。就我而言,这似乎一直在发生(似乎返回对.xla插件之一的引用)。由于该程序打开了多个Excel文件,并且用户还可能打开了其他文件,因此每次打开新工作簿时都关闭并重新打开Excel是不切实际的解决方案。

直到Microsoft承认这是Excel中的错误,或者有人可以弄清楚是什么情况导致该问题发生,我才绝对建议您忽略Workbooks.Open方法的返回值,而使用文件名来获取Workbook对象。之后从Workbooks集合中引用。

Dim wbkHelper as Workbook
Set wbkHelper = Workbooks.Open(filePath, ReadOnly:=true)
Set wbkHelper = Workbooks(filename) ' note filename needs to be filepath without the path
Run Code Online (Sandbox Code Playgroud)


小智 -1

我今天遇到了同样的问题,并通过关闭所有工作簿并重新启动 Excel 解决了该问题。

在 Office 365 上使用 Excel 2016。

Dim curWS As Worksheet
Dim usrWB As Workbook
Dim usrWS As Worksheet

Set curWS = ActiveWorkbook.ActiveSheet
Set usrWB = Workbooks.Open("C:\Temp\user.xlsx")
Set usrWS = usrWB.Sheets("Users")
Run Code Online (Sandbox Code Playgroud)

收到运行时错误“9”:设置 usrWS 行的下 标超出范围。

我发现 usrWB 没有引用 user.xlsx 文件,而是引用 curWS 行中的工作簿,该行没有名为“Users”的工作表解释 RTE。我发现了这个问题,并尝试先重新启动 Excel,然后再尝试重新启动,问题就消失了。