【问题标题】:Check whether Excel file is Password protected检查 Excel 文件是否受密码保护
【发布时间】:2010-04-20 06:18:10
【问题描述】:

我正在尝试通过 VBA 打开 Excel (xlsm) 文件。它可能会或可能不会受到(已知)密码的保护。我正在使用此代码:

On Error Resume Next
Workbooks.Open filename, Password:=user_entered_pw
opened = (Err.Number=0)
On Error Goto 0

现在,如果工作簿有密码,这可以正常工作。但是,如果它没有受到保护,则无法打开它。如果还有工作簿结构保护处于活动状态,显然这是 XL2007 中的一个错误。 (http://vbaadventures.blogspot.com/2009/01/possible-error-in-excel-2007.html)。在旧的 XL2003 上,提供密码会打开未受保护和受密码保护的文件。

我试过了:

Workbooks.Open filename, Password:=user_entered_pw
If (Err.Number <> 0) Then workbooks.open filename

这适用于未受保护和受保护的文件。但是,如果用户输入了错误的密码,它会运行到第二行并弹出“输入密码”提示,这是我不想要的。

如何解决这个问题?

【问题讨论】:

  • 你检查过Err.Number吗?如果密码错误/文件不受保护,您可能会得到不同的结果吗?
  • 我检查过,Excel 总是给出错误 1004(特定于应用程序的错误)。不幸的是,即使是错误描述也是一样的。

标签: excel vba


【解决方案1】:

记录一下——原因确实是我打开的工作簿的结构保护。 我可以通过禁用结构保护并在 Workbook_Open() 中重新保护(在受保护的工作簿中)来规避这个问题。

在结构保护无效的情况下,即使没有密码,Workbooks.Open 带密码也不会失败。

由于我是通过 VBA 方法打开的,所以 VBA 代码已经是可信的,这意味着肯定会调用 Workbook_Open 方法。

【讨论】:

  • +1 用于发布您自己的发现,这也让这个问题变得有价值
【解决方案2】:
  1. 仅针对此特定问题使用 1004 错误处理,对 Sub 中的所有其他问题使用 On Error Resume Next。

  2. 声明上方Workbooks.Open filename, Password:=user_entered_pw 还添加另一个不带密码参数的行语句。

  3. 1234563在预打开函数中使用该信息。

【讨论】:

  • ad 2.:这样做时,如果文件受密码保护,则会弹出“输入密码”提示。 ad 3.:如果根本没有激活保护,则可以识别 ZIP 标头(文件以“PK”开头)。如果存在任何保护(VBA 项目、工作簿、工作表、打开密码),则文件显然已加密。因此,人们无法将具有打开密码的文件与具有工作簿保护的文件区分开来(据我所知)。
  • 我不知道你想在这方面走多远,但我可以推荐 James L. Conger 的“Windows API 圣经”、Charles Petzold 的“Programming Windows”和 Dan Appleman 的“Visual Basic Programmer's Guide”到 WIN32 API。”您可以在它显示之前识别/停止/拦截/响应其轨道中的输入密码提示(以及许多其他内容)。
猜你喜欢
  • 2023-03-03
  • 2015-08-24
  • 2013-02-05
  • 1970-01-01
  • 2014-12-30
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多