我负责一个非常大的Excel 2010电子表格,链接到各种外部数据源,包括彭博社,65个工作表与VBA模块和引用其他VBA加载项。
我注意到VBA项目已经获得了多个Workbook Object。
这是标准的ThisWorkbook。然而,许多工作表也被Excel转换为Workbook对象,保留原始工作表作为前一个工作表的副本,减去代码。
这似乎不是任何人行为的结果。事实上,我认为不可能有多个Workbook对象!
例如,我有一个名为wksInputs的工作表,它现在已经转换成了Workbook对象,而原来的wksInputs现在被称为wksInputs 1。
我无法删除wksInputs Workbook对象。
有人能帮我解释一下这里发生了什么事,以及我如何才能解决这个问题?
非常感谢。
8条答案
按热度按时间d8tt03nd1#
这是我的解决方案,它工作一致,你不需要手动复制工作表和代码到一个空白的工作簿。我已经在几个损坏的工作簿上测试了这个方法,这些工作簿在启动时给我“自动化错误-灾难性失败”错误。
注意:原始损坏文件保存为.xlsm
1.打开空白Excel工作簿
1.开发人员选项卡>宏安全性>禁用所有宏而不通知
1.关闭Excel
1.双击损坏的文件,例如MyFile.xlsm
1.文件>保存为...> MyFile.xlsb(而不是.xlsm),选择**.xlsb**格式才是关键
1.开发人员选项卡>宏安全性>启用所有宏(或您喜欢的任何安全级别)
1.关闭Excel
1.双击MyFile.xlsb
**文件已修复!**如果需要,您可以将MyFile.xlsb文件重新保存为.xlsm。根据我的经验,.xlsm文件很容易损坏,所以我打算养成总是使用.xlsb格式的习惯。
希望有人觉得这有帮助:)
rryofs0p2#
我遇到了同样的问题,一个文件有多个工作簿对象,并在打开时生成“自动化错误-灾难性失败”错误。
我将 *.xlsm文件保存为 *. xlsb.当我重新打开 *.xlsb文件时,所有工作簿对象仍然在文件中。我合理地假设文件中的错误最终会导致问题,并辞职将所有内容复制到一个新文件中。
但是,当我关闭 *.xlsb文件并重新打开原始的 *.xlsm时,所有对象都消失了,并且文件没有生成“自动化错误-灾难性故障”错误。
奇怪的是,我承认,但问题仍然存在于 *.xlsb文件,但原来的 *.xlsm(这是一个我试图保存)是好的。
这可能是一次性的,但可能值得一试...
6mw9ycah3#
您可以通过执行"convert to .zip and unzip trick",然后将
vbaProject.bin
文件(宏代码文件)替换为来自具有不同工作表结构的其他项目的vbaProject.bin来引入此行为。我不知道这是不是发生在OP身上的事情,但这就是发生在我身上的事情。bpzcxfmw4#
当我将工作表作为参数传递给Sub时,代码中出现了这个问题,如下所示:
调用BuildCodeStrings(Sheet2,sAccount)
Sub BuildCodeStrings(wsSource As Worksheet,s As String)
为了解决这个问题,我创建了一个新的工作簿,将所有数据从原来的所有合法工作表复制到新工作簿中同名的工作表中。然后将原始工作簿中的所有代码复制到新工作簿中。
然后我将子例程调用改为
调用BuildCodeStrings(“IC Accounts”,sAccounts)
SubBuildCodeStrings(sSource As String,s As String)
并在我的子例程BuildCodeString中添加了一行代码:
设置wsSource = ThisWorkbook.Sheets(sSource)
我不知道是什么原因导致了这个问题,但这个解决方法对我很有效。
ijnw1ujt5#
我在PowerPoint(2007)中遇到了同样的问题,其中“Slide 1”是空的,无法删除。@Scoox的回答给了我一个解决方案:
1.将所有VBA模块导出为文本(.bas)文件
1.将.pptm(或.xlsm)文件另存为.pptx(或.xlsx)
1.关闭PowerPoint(或Excel)
1.打开这个.pptx/.xlsx并将其保存为.pptm/.xlsm
1.导入原始VBA文本(.bas)文件
1.手动将所有按钮重新关联到原始宏功能
1.添加原始文件中的任何外部 * 引用 *
1.保存并测试是否一切正常
这对我很有效,我相信它也适用于Excel。
xxhby3vn6#
Office365也有同样的问题,发现了一个错误,我的公共常量和函数的参数有相同的名称。在函数中更改参数名称后,它不会再次发生。
cclgggtu7#
我的错误是当我把一个工作表传递给一个函数,然后在一个for循环中使用这个变量名作为循环变量时引起的(因为我是一个糟糕而懒惰的程序员)。
作为完全重写工作簿的替代方法:
1.将所有工作表复制到新工作簿
1.将所有模块、窗体和类也复制到该文件中
1.将其保存为.xlsm
1.将两个文件名(新的和旧的)都更改为.zip
1.将新文件“xl/vbaProject.bin”复制到旧文件
1.将文件名改回.xlsm
这听起来好像你只是复制了所有内容,但这意味着你不必检查链接、命名范围、条件格式或数据验证来确保所有内容都正确复制。
slsn1g298#
也许有人还需要这个。。我设法编写了解决方案…基本上,它创建一个副本,您的vba和excel副本到另一个在您的桌面。
:)
参考文献: