背景:
我正在尝试并且无法保存和修改具有“无代码”格式代码的文件。我一直在尝试,可以打开.xlsm中已经存在的文件,它可以按预期工作。该脚本继续运行,我可以从第一个文件的脚本中修改并关闭第二个文件:
Sub testExistingWorkbook()
Dim wbkName As String
wbkName = "WorkWithWorkbookTest.xlsx"
Workbooks.Open (wbkName)
'~~>...code to modify goes here
Workbooks(wbkName).Close
End Sub
但是,如果我保存了第一个没有宏的文件的副本,然后打开并修改了该无宏文件,那么当打开无代码文件时,有代码的文件就会关闭。尽管代码看起来像是在尝试做同样的事情,但它没有像第一个示例那样正常工作。
我尝试了许多不同的配置,但是在每种情况下,脚本都停止运行第二个,我打开下一个文件。例如,下面的示例代码在“ Workbooks.Open(wbkName)”之后停止。在那一刻,它同时关闭了.xlsm,这是我的代码似乎没有要求的操作(但是我认为必须在代码中隐式包含)。最初,我已对其进行编码以创建一个打开的对象:“设置wbk2 = Workbooks.Open(wbkName)”,但我发现这在两种情况下均不起作用。然后我以为这可能是“工作簿”的功能,它是所有 open 工作簿的集合,因此,如果我打开了一个尚未打开的文件,则实际上会从集合中剔除另一个工作簿(傻,我知道)。但是上面的示例代码消除了这种可能性。有一时间我以为可能是因为名称相同,并且在.xlsx和.xlsm之间没有区别,但是下面的代码使用了不同的名称并导致相同的问题,因此这不是一个因素。 / p>
Sub testSaveAsWorkbook()
Dim wbkName As String
wbkName = "SuperSecretWorbookTest.xlsx"
ThisWorkbook.SaveAs Filename:=wbkName, FileFormat:=61
Workbooks.Open (wbkName)
'~~>Code would go here, but the original file has closed and only
' the new SuperSecretWorkbookTest.xlsx is open
Workbooks(wbkName).Close
End Sub
问题:
在思考和编写此问题时,我意识到问题实际上是在我执行“ ThisWorkbook.SaveAs Filename:= wbkName,FileFormat:= 61”时开始的,因为那是第一个工作簿关闭时,新工作簿将采用地点。 IDE尚不知道,因此即使逐步执行代码,它也只会在尝试执行下一行代码时才意识到.xlsm文件不再处于活动状态。
所以我的问题是,为什么'Workbooks.SaveAs'这样关闭第一个文件?更重要的是,我该怎么做才能保持文件打开并完成脚本?
答案 0 :(得分:3)
如果要手动执行此操作,请转到文件> 另存为,将 xlsm 保存为 xlsx ,然后单击“是”以继续保存为无宏工作簿,您会看到 xlsm 已“不再打开”,只有新的 xlsx 。确实如此,您已经保存了它。 Workbooks.Open
调用不会关闭原始的 xlsm ;它已经不见了。
换句话说,根据您的观察:
在思考和编写此问题时,我意识到问题实际上是在我执行
ThisWorkbook.SaveAs Filename:=wbkName, FileFormat:=61
的那一刻开始的,因为那是在第一个工作簿关闭时,而新的工作簿将取代它。
SaveAs
就是这样。
Workbook.SaveCopyAs
“不修改内存中打开的工作簿。”也许您可以先保存一个副本,打开该副本,然后最后另存为 xlsx 并删除 xlsm 副本。
Sub testSaveAsWorkbook1()
Dim wbkName As String, wbkExtension As String
wbkName = "SuperSecretWorbookTest"
wbkExtension = ".xlsm"
ThisWorkbook.SaveCopyAs Filename:=wbkName & wbkExtension
Dim copyWbk As Workbook
Set copyWbk = Workbooks.Open(wbkName)
' Do whatever you want with the copy
copyWbk.SaveAs Filename:=wbkName, FileFormat:=61
Kill copyWbk.Path & "\" & wbkName & wbkExtension
copyWbk.Close SaveChanges:=False
End Sub