【问题标题】:Cannot close open workbook object无法关闭打开的工作簿对象
【发布时间】:2016-06-08 09:25:18
【问题描述】:

我有一个宏,它可以打开一个带有测试数据的 Excel 文件,对数据执行一些简单的格式化,然后将数据保存为一个新文件(保持最初打开的文件不变)。我得到了一切工作,直到最后一行,我试图关闭我最初打开的工作簿。在尝试关闭原始工作簿之前有一些代码将不同的工作簿变量设置为第一个,然后打开并关闭它?我对代码在做什么有点困惑,但它会关闭用户刚刚保存的新文件,并让最初打开的原始数据文件保持打开状态。下面是我的代码;有人可以更好地解释保存和关闭工作簿时发生的情况吗?

Sub Main()
'
'

'
'Define variables
Dim wBook As Workbook
Dim sBook As String
Dim ActSheet As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String

'Get workbook filepath
sBook = Application.GetOpenFilename()

If sBook = "False" Then
    End
End If

'Open Workbook
Set wBook = Workbooks.Open(sBook)

'Unrelated formatting occurs

'Save workbook as new file
Application.ScreenUpdating = False    ' Prevents screen refreshing.

CurrentFile = wBook.FullName

NewFileType = "Excel Files 2007 (*.xlsx), *.xlsx,"

NewFile = Application.GetSaveAsFilename( _
    InitialFileName:=NewFileName, _
    fileFilter:=NewFileType)

If NewFile <> "" And NewFile <> "False" Then
    wBook.SaveAs Filename:=NewFile, _
        FileFormat:=xlOpenXMLWorkbook, _
        Password:="", _
        WriteResPassword:="", _
        ReadOnlyRecommended:=False, _
        CreateBackup:=False

    Set ActBook = wBook
    Workbooks.Open CurrentFile
    ActBook.Close
End If

Application.ScreenUpdating = True

wBook.Close

End Sub

【问题讨论】:

  • 您将wBook 设置为Set ActBook = wBook,然后设置ActBook.Close(关闭原始工作簿)。然后打开另一个工作簿:Workbooks.Open CurrentFile。所以这肯定是在你的代码末尾没有关闭的工作簿吗?
  • 我真的不明白怎么做的,但是我用宏打开的原始文件最后仍然打开并且未修改。 Cody G. 在下面提供的解决方案虽然有效。只需使用ActBook 删除这三行,然后打开和关闭...

标签: vba excel macros


【解决方案1】:

当您 .SaveAs 时,wBook 对象成为“新文件”。你可以关闭它并且没问题。如果您想创建一个新对象而保持原始对象不变,您将使用 Workbook.SaveAsCopy 代替。

那么,您的代码中发生了什么:

wBook.SaveAs 

使wBook成为“新文件”,“旧文件自动关闭”

Set ActBook = wBook 

基本上是创建两个“新文件”对象。 然后使用

打开旧文件
Workbooks.Open CurrentFile

然后,

ActBook.Close 

关闭 wBook 和 ActBook。

wBook.Close 

尝试关闭已关闭的工作簿并引发错误。 (因为它和 ActBook 一样。)

我相信您的意图如下:

Sub Main()
'
'

'
'Define variables
Dim wBook As Workbook
Dim sBook As String
Dim ActSheet As Worksheet
Dim ActBook As Workbook
Dim CurrentFile As String
Dim NewFileType As String
Dim NewFile As String

'Get workbook filepath
sBook = Application.GetOpenFilename()

If sBook = "False" Then
    End
End If

'Open Workbook
Set wBook = Workbooks.Open(sBook)

'Unrelated formatting occurs

'Save workbook as new file
Application.ScreenUpdating = False    ' Prevents screen refreshing.

CurrentFile = wBook.FullName

NewFileType = "Excel Files 2007 (*.xlsx), *.xlsx,"

NewFile = Application.GetSaveAsFilename( _
    InitialFileName:=NewFileName, _
    fileFilter:=NewFileType)

If NewFile <> "" And NewFile <> "False" Then
    wBook.SaveAs Filename:=NewFile, _
        FileFormat:=xlOpenXMLWorkbook, _
        Password:="", _
        WriteResPassword:="", _
        ReadOnlyRecommended:=False, _
        CreateBackup:=False
    ' wBook is now the "new file" at this point and the "old file" has been closed. 
End If

Application.ScreenUpdating = True

wBook.Close ' Close the new file.

End Sub

【讨论】:

  • Cody G. 的解决方案奏效了。我不确定我发现的原始代码在 wBook.Close 之前的 3 行中做了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多