gpt4 book ai didi

excel - 将 xlsm 保存为 xlsx 后,为什么打开新文件会关闭旧文件?

转载 作者:行者123 更新时间:2023-12-03 02:19:05 28 4
gpt4 key购买 nike

背景:
我正在尝试保存和修改包含“无代码”格式代码的文件,但失败。我一直在试验,我可以打开 .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,这是我的代码似乎没有请求的操作(但我认为必须隐含在代码中)。最初,我对其进行编码以在打开时创建一个对象:“Set wbk2 = Workbooks.Open(wbkName)”,但我发现这在两种情况下都不起作用。然后我想这可能是“工作簿”的一个功能,它是所有打开工作簿的集合,因此,如果我打开一个尚未打开的文件,它实际上会将另一个工作簿从集合中删除(愚蠢,我知道)。但上面的示例代码消除了这种可能性。有一段时间我想也许是因为名称相同并且在某种程度上没有区分 .xlsx 和 .xlsm,但下面的代码使用不同的名称并导致相同的问题,所以这不是一个因素。

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”会像这样关闭第一个文件?更重要的是,我该怎么做才能保持文件打开并完成脚本?

最佳答案

如果您要手动执行此操作,请转到文件> 另存为xlsm另存为xlsx>,然后单击"is"继续另存为无宏工作簿,您会看到 xlsm“不再打开” - 只有新的 xlsx 。这是应该的,你已经保存了它。 Workbooks.Open 调用不会关闭原始的 xlsm;它已经消失了。

换句话说,根据您的观察:

In thinking about and writing this question, I realized that the problem really starts at the moment I execute ThisWorkbook.SaveAs Filename:=wbkName, FileFormat:=61 because that is when the first workbook is closed, and the new workbook takes its place.

这正是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

关于excel - 将 xlsm 保存为 xlsx 后,为什么打开新文件会关闭旧文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54642447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com