【发布时间】:2023-03-27 21:05:02
【问题描述】:
我在电子表格中有一个 Excel 文件列表。我想遍历它们并为每个添加一个工作表事件。保存它,关闭它,然后继续下一个。问题是当我(手动)重新打开工作簿时,代码消失了。
for each 循环内部:
Set xl = Workbooks.Open(filepath)
addCode xl 'subroutine to add code
xl.Save
xl.Close SaveChanges:=False
addCode 子程序是:
Sub addCode(book As Excel.Workbook)
acsh = book.ActiveSheet.CodeName
startline = book.VBProject.VBComponents(acsh).CodeModule.CreateEventProc("SelectionChange", "Worksheet") + 1
book.VBProject.VBComponents(acsh).CodeModule.InsertLines startline, codetoadd
End Sub
如果我注释掉 xl.Close 代码在工作簿中并且可以工作。我可以手动保存并关闭文件,代码仍然存在。我在 xl.save 和 xl.close 之间添加了一个断点并复制了该文件。代码完成后也没有更改。我试过使用 xl.saveas 和 xl.close SaveChanges:=True。都有相同的结果。
我正在使用 Excel 2013,我告诉 excel 信任对 VBA 对象模型的访问。我试过使用 XLS 文件和 XLSM 文件。显然 XLSX 是行不通的。
【问题讨论】:
-
听起来好像 Excel 无法识别文件是dirty,所以 Save 认为没有什么可做的?您是否尝试过在保存之前添加一条更改其他属性的行?这可能会提示 Excel 认为文件已脏。
-
dirty 标志在这里:
ThisWorkbook.Saved = False(可读和可写)。然而,我不认为这是问题所在。您正在打开的工作簿是.xlsx还是.xlsm?如果它们是.xlsx,那么所有 VBA 代码都会自动被切断。然而,通常会显示一条警告,所有代码都将被删除(在尝试保存文件时)。 -
我只是在保存之前添加了 xl.saved = false ,同样的问题。它正在更新修改后的文件日期/时间,所以我认为它一直在保存。我用过 xlsm 和 xls,我不希望 xlsx 能工作,所以从未尝试过。
-
文件是 .xlsm 以开始使用,例如文件路径 = "C:\data\sheet.xlsm" ?
-
@Robin 是的。我试过 xls->xls、xlsm->xlsm、xls->xlsm 和 xlsx->xlsm