检测何时使用密码打开或closuresExcel工作簿

我需要从VBA本身修改Excel工作簿,用户将指出要修改哪个工作簿,之后将修改工作簿的副本并以新名称保存。 这可以是已经打开的工作簿,也可以是磁盘上的已closures工作簿,我需要支持从2000年以后的所有工作簿types(2000-2016,二进制,加载项,模板等)。 我需要修改工作簿的内容以及其中的任何自定义UI(function区xml)。 这一切都必须从不受我控制的随机Excel安装完成。

我面临的问题是处理密码保护的工作簿 – encryption的,即打开密码。 我的代码需要能够处理这些,并最好将所使用的密码应用于保存的更新副本。

代码stream程如下:

  1. 让用户select工作簿进行修改(通过表单)
  2. 如果工作簿已打开:
    1. 保存到一个临时文件夹
    2. 指向保存的副本进行进一步处理
  3. 在Excel的第二个实例中打开用户select的文件(不可见)
  4. 更新打开的临时副本的内容
  5. 保存为没有密码的临时文件夹并closures它
  6. 更新已closures的临时副本的自定义UI
  7. 重新打开更新后的临时副本,并再次使用原始工作簿上的任何密码进行保存

使用上述步骤2.1,.SaveCopyAs将保存打开的工作簿并将任何密码应用于副本,这将导致步骤3中的所有情况都要求input密码。 我不能通过使用.SaveAs来删除步骤2.1中的通行证,因为这将导致打开的工作簿不再被打开。 这也只是一个半angular度的措施,因为它并不能阻止封闭文件发生的同样的事情。

在这种情况下,当Excel要求用户input密码(至less在Excel 2010中)时,密码提示只显示带有编辑框的文件的文件名,所有文件都在popup的第二个Excel窗口中开放,这是一个难看的景象。 而且它也不允许我捕捉input的密码以及第7步。

我能做的最好的办法就是检测磁盘上的一个closures的工作簿是否被encryption,然后显示自己的密码提示,然后再尝试打开它。 但如何做到这一点? 这些是我可以提出的选项;

  1. 当我使用Workbooks.Open(Filename:=...) ,然后Excel显示密码提示,我喜欢通过事先要求任何通过回避。
  2. 当我使用Workbooks.Open(Filename:=..., Password:="notthepassword") ,至lessExcel不会再显示密码提示,没有密码的工作簿可以正常打开,而那些使用pass的人现在会生成错误1004 。但是,我不能这样做推断密码是必要的,因为1004是Excel的全部错误号,我不能检查Err.Description要么是“错误的密码”等,因为我不知道在客户端上运行的Excel GUI语言。 然后检查Excel文件是否受密码保护 ; 当encryption的文件也有工作簿结构保护时,显然Excel不会再以这种方式打开它们 – 我testing了这个,它可以和我的2010 Excel一起工作,但听起来并不令人鼓舞。
  3. 忽略要求通过的Excel的丑陋,事后阅读任何Workbook.PasswordXxx属性不会透露任何东西; 他们总是返回相同的值在所有情况下(在工作簿上有或没有密码)。
  4. 对于OOXML文件(.xlsm / .xlsx等),我可以预先检查文件的zip内容是否存在两个文件“EncryptionInfo”和“EncryptedPackage”,表示文件已encryption,但2000-2003(.xls )文件? 在这些文件中使用了BIFF文件结构的Microsoft文档 ,告诉它检查工作簿stream中的FilePasslogging; 虽然我知道我可以实现这个逻辑(例如,现在不支持的Koogra项目 ),我宁愿不只是:)( 侧面的问题:从什么时候微软发布这些细节,而不签署NDA的,并跳过他们的合法的篮球?

有没有人有任何的洞察力,我可以如何做代码第7步。上面的工作,短短的生活与Excel的提示,并添加一个键logging器到我的应用程序? 🙂