VBA用户窗体关闭已打开工作簿时出现错误

6
在子程序中,我想要打开一个工作簿,从中读取一些内容,然后关闭它。
由于某种原因,我遇到了一个错误:
Run-time error '1004':

Method 'Close' of object _Workbook failed

我已经找到了最简代码片段来复现问题。
创建一个全新的Excel文件,在其中创建一个用户窗体。在该窗体上,创建一个命令按钮,并添加以下单击事件代码:

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)
    ' File operations would occur here
    opened_workbook.Close    ' Exception thrown here

    MsgBox "If you got here, it worked!"
    Unload Me
End Sub

让我困惑的是当命令按钮不在用户窗体上时(直接在工作表上放置一个普通按钮)使用相同的代码并不会出现这个错误。

除了 StackOverflow 之外,我甚至不知道还能报告什么或查找解释此行为的地方!我正在使用 Excel for Mac 2011 编写 VBA,并且如果有所区别,可以切换到 Windows Excel 2010。


就此而言,你的代码在我的Windows Excel 2010上使用用户表单(以及简单代码)似乎可以工作。 - stephan
糟糕:( 我想现在我应该自己在Windows上测试它。虽然我很希望看到一个适用于Windows和Mac的解决方案。 - Prashant Kumar
2个回答

7

是的,在Excel 2011中,这是一个错误(未记录 - 我还没有找到相关的文档)。您需要稍微修改代码。尝试这个:

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)

    Unload Me

    opened_workbook.Close    

    MsgBox "If you got here, it worked!"
End Sub

多么愚蠢的错误。将“Unload Me”移至“Dim”语句下方,它就起作用了。谢谢!(我还添加了一些ScreenUpdating = False/True行来使其更加平滑)。 - Prashant Kumar

1
在Mac上的Excel 11中遇到了这个确切的问题(Windows上的Excel 2013正常工作),只是错误发生在从UserForm调用的模块子程序中。如果有人(像我一样)试图从不在UserForm本身内部的模块子程序(或另一个位置)中使用workbook.close方法,则不能使用“Me”。'Me'仅可在UserForm代码本身中使用。请使用卸载函数和您的UserForm名称,而不是“Unload Me”。
Unload UserFormName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接