我需要在VBA内部修改Excel工作簿,用户将在其中指出要修改的工作簿,之后将修改工作簿的副本并以新名称保存。这可以是已打开的工作簿,也可以是磁盘上的封闭工作簿,我需要支持2000年以后的所有工作簿类型(2000-2016,二进制文件,加载项,模板等)。我需要修改工作簿的内容以及其中的任何自定义UI(功能区xml)。这一切都必须通过不受我控制的随机Excel安装来完成。
我面临的问题是处理受密码保护的工作簿 - 加密的工作簿,即打开的密码。我的代码需要能够处理这些代码,并且理想地将任何使用过的密码应用于已保存的更新副本。
代码流程如下:
使用上面的步骤2.1,.SaveCopyAs将保存打开的工作簿并将任何密码应用于副本,这导致步骤3在所有情况下都要求输入密码。我无法使用.SaveAs删除步骤2.1中的传递,因为这将导致打开的工作簿最终不再打开。这也只是一个半措施,因为它不会阻止关闭文件发生同样的事情。
在这种情况下,当Excel要求用户输入密码时(至少在Excel 2010中),密码提示只显示文件的文件名,并带有通行证的编辑框,所有这些都带有弹出的空白的第二个Excel它下面的窗户打开了,这是一个丑陋的景象。并且它也不允许我捕获输入的密码以及第7步。
我能做的最好的事情就是检测磁盘上的已关闭工作簿是否已加密,并在尝试打开它之前显示我自己的密码提示。但是怎么做呢?这些是我可以提出的选择;
Workbooks.Open(Filename:=...)
时,Excel会显示密码提示,我想通过事先询问任何通行证来逃避。Workbooks.Open(Filename:=..., Password:="notthepassword")
时,至少Excel不再显示密码提示,没有密码的工作簿打开正常,带有通行证的工具现在会产生错误1004.但是,我可以'行动起来推断需要密码,因为1004是Excel的全部错误编号,我无法检查Err.Description
是否有错误的密码"或者这样,因为我不知道客户端上运行的Excel GUI语言。然后还有Check whether Excel file is Password protected;当加密文件也具有工作簿结构保护时,显然Excel不再以这种方式打开它们 - 我测试了它并且它与我的2010 Excel一起工作,但听起来并不是很令人鼓舞。Workbook.PasswordXxx
财产并不能透露任何内容;它们总是在所有情况下返回相同的值(在工作簿上有或没有密码)。有没有人能够深入了解我如何才能使代码步骤7.上面的工作,只是生活在Excel的提示下并向我的应用添加一个键记录器? :)