【问题标题】:Saving Excel Sheet with code as xlsm looses the code将带有代码的 Excel 工作表保存为 xlsm 会丢失代码
【发布时间】:2020-07-02 02:11:42
【问题描述】:

我正在动态创建表格,效果很好。创建的表格之一确实包含使用 VBA 插入的 VBA (Worksheet_Activate),也可以正常工作。

现在我正在尝试保存创建的文件,while 循环用于强制保存 我试过了:

While Not workbookUsed.Saved


Dim filePath As String

filePath = Application.GetSaveAsFilename(fileFilter:="Excel File mit Makro (*.xlsm), *.xlsm")


    If VarType(filePath) = vbString Then

   workbookUsed.SaveAs _
            FileName:=filePath, _
            FileFormat:=52
  End If

Wend

End Sub

我尝试使用

Application.FileDialog(msoFileDialogSaveAs)

方法。

两者都工作并创建一个 .xlsm 文件,其中包含所有生成的内容,除了工作表上的 VBA 代码,它就像普通的 .xlsx 文件一样是空的。

有趣的是,如果您在保存文件后停止该过程,然后按 ctrl+s Excel 会识别出某些内容已更改并保存整个工作簿。

但是如果我在那之后使用

关闭工作簿
workbookUsed.Close

我再次得到一个文件,其中没有 VBA 代码,即使我将其设置为关闭时不保存。

那么是否需要设置任何特殊参数才能保存整个工作簿,包括 vba 内容?

【问题讨论】:

  • 奇怪,你的潜艇叫什么名字?你试过编译VbaProject吗?
  • 其实,你是在保存文件的同一个子过程中,在VbaProject的Worksheet Object里面添加代码吗?
  • 不,我有一个 Main Sub Sub lcds () 这包含 Set lcds_wb = Workbooks.Add 并调用创建工作表所需的所有 Subs(大约 40 个),它调用的最后一个 Sub 是Sub 显示在上面,名称为 `Sub saveFile ()`

标签: excel vba save-as


【解决方案1】:

例如,您可以将代码保存在名为 SaveWorkbook 的单独过程中,并在主过程结束时使用以下代码:

Application.OnTime Now + TimeSerial(0, 0, 2), "SaveWorkbook"

这将安排保存文件的过程在 2 秒后运行,并让 Excel 有时间在保存之前处理对 VBproject 的更改。

【讨论】:

  • 谢谢,这样做可以,但有很大的缺点。如果我使用 OnTime 方法,整个脚本会继续运行,并且下一个 Sub 正在执行。这意味着我的主要方法完成并且“SaveWorkbook”运行。由于“SaveWorkbook”后面跟着另一个 Sub,这将迫使我在保存后需要执行的所有 Subs 尾随(可以完成,但很脏),但这也意味着我不能不再调用“workbookUsed”对象。由于 Sleep 和 Wait 正在暂停 Excel,因此它们也不起作用。但现在我知道我必须节省时间
  • @kai,另一种选择是在另一个 Excel 实例中创建新工作簿。请参阅本文中的示例方法 3:excelgorilla.com/excel/general/open-multiple-instances-excel
  • 我现在改为将安全代码写入工作簿中的新工作表,当代码完成时激活该工作表(在其上写上程序完成的文字)并让所有动作处理程序触发安全的例行公事。例程的最后一行删除了这张表。不好,但可以工作,计算速度不会有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2020-12-02
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多