使用VBA破解Excel 2013及以上版本受保护工作表的密码

6

有人知道除了下面这些代码之外,还有其他方法可以破解Excel受保护工作表的密码吗?我一直使用这些代码,但现在似乎已经不起作用了。每次运行代码时,文件都会显示“未响应”。我正在使用MS Office 2013。

Sub PasswordBreaker()
'Breaks worksheet password protection.
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
    MsgBox "One usable password is " & Chr(i) & Chr(j) & _
        Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
        Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
     Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

如果您使用基本密码(abc)保存工作表,那么它是否仍然有效? - SierraOscar
@MacroMan -- 它仍然不起作用。 - Meedee
你最近在电脑上做了什么更改吗?一些 VBA 可能会在 Windows 10 上出现问题,我在其他宏中也见过这种情况。 - Histerical
不,我没有。仍在使用Windows 7。 - Meedee
我经常使用这个 - 做得很好。可以确认它与Office 2016兼容。 - Jonny Wright
4个回答

8
Excel在Excel 2013及更高版本中更新了其表格保护安全性,因此这个宏现在无法使用,请参见此处
从链接中可以看出,如果将文件保存为xls文件(Excel 1997-2003),则必须放弃较新的安全性,因为它与文件类型不兼容。然后您可以运行您的宏。
将文件保存为旧版本可能会使工作簿的某些部分无法正常工作。

通过(速度)修改,该方法仍适用于Excel 2013和Excel 2016。请在下面的答案中查找详细信息。 - Kawi42

6

感谢Kawi,这个完美地解决了问题。

以下是包含Kawi修改的完整代码:

Sub PasswordBreaker()
'Breaks worksheet password protection.
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
Debug.Print Chr(i) & Chr(j) & Chr(k) _
      & Chr(l) & Chr(m) & Chr(i1) _
      & Chr(i2) & Chr(i3) & Chr(i4) _
      & Chr(i5) & Chr(i6) & Chr(n)
DoEvents
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
    MsgBox "One usable password is " & Chr(i) & Chr(j) & _
        Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
        Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

对我来说,在XLSX工作表中完美运行。谢谢! - tc_NYC

1
我不确定这是如何工作的,但我能够取消保护该工作表。我进行了“另存为”操作,并将类型更改为:“Excel 97-2003”。当我打开文件并取消保护该工作表时,它不再要求密码。 :) 而且我的工作簿仍然正常工作。

1
自从最近的更新,Excel在试图执行取消保护命令时出现了高尝试率的问题。一些减速使代码再次运行:在Unprotect行之前(即最内部循环中)放置以下内容:
Debug.Print Chr(i) & Chr(j) & Chr(k) _
      & Chr(l) & Chr(m) & Chr(i1) _
      & Chr(i2) & Chr(i3) & Chr(i4) _
      & Chr(i5) & Chr(i6) & Chr(n)
DoEvents

使用这个(速度)修改后,最初提到的方法也适用于Excel 2013和Excel 2016。

我认为那不起作用。如果可以的话,请发布确切的代码,让我们来测试! - pgSystemTester
确切的代码是这个帖子的第一个帖子中的代码,再加上这里提到的行(要插入到Unprotect命令之前)。它是如何工作的:额外的行减慢了试验速率,这就是一些Excel版本所需要的。这里显示的额外行只是一个工作示例,在我的情况下具有足够的减速效果,即防止VBA冻结。也就是说,如果原始代码(如此线程的第一个帖子中)适用于您,则一切正常。但如果它导致VBA冻结,则我的评论应该解决问题。 - Kawi42
你认为这段代码应该有多快?在发现这篇文章之前,我创建了一个进度条来跟踪宏的进度,看起来它防止了它冻结,但是完成需要超过一个小时。 - MartyMcfly0033
这只需要几秒钟就能完成,具体时间取决于密码的长度,大约在2到15秒之间。 - Kawi42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接