有没有办法破解Excel VBA项目的密码?

时间:2009-06-22 10:37:13

标签: excel vba passwords

我被要求更新一些Excel 2003宏,但VBA项目受密码保护,似乎缺少文档......没有人知道密码。

有没有办法在VBA项目中删除或破解密码?

23 个答案:

答案 0 :(得分:624)

您可以尝试这种不需要HEX编辑的直接VBA方法。它适用于任何文件(* .xls,*。xlsm,* .xlam ...)。

经过测试和使用

  

Excel 2007
    Excel 2010
    Excel 2013 - 32位版本
    Excel 2016 - 32位版本

寻找64位版本?见https://stackoverflow.com/a/31005696/4342479

如何运作

我会尽力解释它是如何运作的 - 请原谅我的英语。

  1. VBE将调用系统函数来创建密码对话框。
  2. 如果用户输入正确的密码并单击“确定”,则此功能返回1.如果用户输入了错误的密码或单击“取消”,则此功能返回0.
  3. 关闭对话框后,VBE将检查系统函数的返回值
  4. 如果此值为1,VBE将“认为”密码正确,因此将打开锁定的VBA项目。
  5. 下面的代码将用于显示密码对话框的原始函数的内存交换为用户定义的函数,该函数在被调用时始终返回1。
  6. 使用代码

    请先备份您的文件!

    1. 打开包含已锁定的VBA项目的文件
    2. 创建新的xlsm文件并将此代码存储在 Module1

      code credited to Siwtom (nick name), a Vietnamese developer

      Option Explicit
      
      Private Const PAGE_EXECUTE_READWRITE = &H40
      
      Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
              (Destination As Long, Source As Long, ByVal Length As Long)
      
      Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
              ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
      
      Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
      
      Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
              ByVal lpProcName As String) As Long
      
      Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
              ByVal pTemplateName As Long, ByVal hWndParent As Long, _
              ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
      
      Dim HookBytes(0 To 5) As Byte
      Dim OriginBytes(0 To 5) As Byte
      Dim pFunc As Long
      Dim Flag As Boolean
      
      Private Function GetPtr(ByVal Value As Long) As Long
          GetPtr = Value
      End Function
      
      Public Sub RecoverBytes()
          If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
      End Sub
      
      Public Function Hook() As Boolean
          Dim TmpBytes(0 To 5) As Byte
          Dim p As Long
          Dim OriginProtect As Long
      
          Hook = False
      
          pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
      
      
          If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
      
              MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
              If TmpBytes(0) <> &H68 Then
      
                  MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
      
                  p = GetPtr(AddressOf MyDialogBoxParam)
      
                  HookBytes(0) = &H68
                  MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                  HookBytes(5) = &HC3
      
                  MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                  Flag = True
                  Hook = True
              End If
          End If
      End Function
      
      Private Function MyDialogBoxParam(ByVal hInstance As Long, _
              ByVal pTemplateName As Long, ByVal hWndParent As Long, _
              ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
          If pTemplateName = 4070 Then
              MyDialogBoxParam = 1
          Else
              RecoverBytes
              MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                                 hWndParent, lpDialogFunc, dwInitParam)
              Hook
          End If
      End Function
      
    3. 将此代码粘贴在 Module1 中的上述代码下并运行

      Sub unprotected()
          If Hook Then
              MsgBox "VBA Project is unprotected!", vbInformation, "*****"
          End If
      End Sub
      
    4. 回到您的VBA项目并享受。

答案 1 :(得分:208)

是的,只要您使用.xls格式的电子表格(Excel的默认值为2003)。对于Excel 2007及更高版本,默认值为.xlsx,这是一种相当安全的格式,此方法无效。

正如Treb所说,这是一个简单的比较。一种方法是使用十六进制编辑器简单地换出文件中的密码条目(参见Hex editors for Windows)。一步一步的例子:

  1. 创建一个新的简单excel文件。
  2. 在VBA部分中,设置一个简单的密码(例如 - 1234)。
  3. 保存文件并退出。 然后检查文件大小 - 请参阅Stewbob's gotcha
  4. 使用十六进制编辑器打开刚刚创建的文件。
  5. 复制以下列键开头的行:

    CMG=....
    DPB=...
    GC=...
    
  6. FIRST BACKUP 您不知道VBA密码的excel文件,然后使用十六进制编辑器打开它,并从虚拟文件中粘贴上面复制的行。

  7. 保存excel文件并退出。
  8. 现在,打开您需要查看VBA代码的excel文件.VBA代码的密码 将只是1234(如我在这里展示的例子)。
  9. 如果您需要使用Excel 2007或2010,下面还有一些其他答案可能有所帮助,尤其是:123

    编辑 2015年2月:对于另一种看起来非常有前途的方法,请查看ĐứcThanhNguyễn的 this new answer

答案 2 :(得分:161)

还有另一种(稍微容易一些)解决方案,没有尺寸问题。我今天使用这种方法(在2003 XLS文件上,使用Excel 2007)并且成功了。

  1. 备份xls文件
  2. 在HEX编辑器中打开文件,找到DPB=...部分
  3. DPB=...字符串更改为DPx=...
  4. 在Excel中打开xls文件
  5. 打开VBA编辑器( ALT + F11
  6. 魔术: Excel发现无效密钥(DPx)并询问您是否要继续加载项目(基本上忽略保护)
  7. 您将能够覆盖密码,因此请将其更改为您能记住的密码
  8. 保存xls文件*
  9. 关闭并重新打开文档并运行您的VBA魔法!
  10. *注意:请确保您已将密码更改为新值,否则下次打开电子表格时Excel将报告错误(意外错误),然后当您访问VBA模块列表时,您将看到源模块的名称,但在尝试打开表单/代码/等时收到另一个错误。要解决此问题,请返回VBA项目属性并将密码设置为新值。保存并重新打开Excel文档,你应该好好去!

答案 3 :(得分:145)

我建立在ĐứcThanhNguyễn的奇妙答案上,允许这种方法与64位版本的Excel一起使用。我在64位Windows 7上运行Excel 2010 64位。

  1. 打开包含已锁定的VBA项目的文件。
  2. 创建新的xlsm文件并将此代码存储在 Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 5) As Byte
    Dim OriginBytes(0 To 5) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 5) As Byte
        Dim p As LongPtr
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
    
        If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
            If TmpBytes(0) <> &H68 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                HookBytes(0) = &H68
                MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                HookBytes(5) = &HC3
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                       hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
    
  3. 将此代码粘贴到 Module2 并运行

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
  4. 免责声明这对我有用,我在这里记录了它,希望能帮助别人。 我还没有完全测试它。在继续此选项之前,请务必保存所有打开的文件。

答案 4 :(得分:63)

科林皮卡德有一个很好的答案,但有一个'小心'这个。有些实例(我还没有弄清楚原因)文件中“CMG = ........ GC = ....”条目的总长度不同于一个excel文件到下一个。在某些情况下,此条目将为137个字节,而在其他情况下,它将为143个字节。 137字节长度是奇数,如果在使用'1234'密码创建文件时发生这种情况,只需创建另一个文件,它应跳转到143字节长度。

如果您尝试将错误的字节数粘贴到文件中,当您尝试使用Excel打开文件时,将丢失VBA项目。

修改

这对Excel 2007/2010文件无效。标准的.xlsx文件格式实际上是一个.zip文件,其中包含许多子文件夹,其格式,布局,内容等存储为xml数据。对于不受保护的Excel 2007文件,您只需将.xlsx扩展名更改为.zip,然后打开zip文件并查看所有xml数据。这很简单。

但是,当您使用密码保护Excel 2007文件时,整个.zip(.xlsx)文件实际上是使用RSA加密进行加密的。无法再将扩展名更改为.zip并浏览文件内容。

答案 5 :(得分:51)

对于.xlsm.dotm文件类型,您需要采用稍微不同的方式。

  1. .xlsm文件的扩展名更改为.zip
  2. 打开.zip文件(使用WinZip或WinRar等)并转到xl文件夹。
  3. 解压缩vbaProject.bin文件并在十六进制编辑器中打开它(我使用HxD,它完全免费且轻量级。)
  4. 搜索DPB并替换为DPx并保存文件。
  5. 使用压缩文件中的新on替换旧的vbaProject.bin文件。
  6. 将文件扩展名更改回.xlsm
  7. 打开工作簿跳过警告消息。
  8. 在Excel中打开Visual Basic。
  9. 转到工具&gt; VBAProject属性&gt;保护标签。
  10. 输入新密码并保存.xlsm文件。
  11. 关闭并重新打开,您的新密码将有效。

答案 6 :(得分:34)

值得指出的是,如果您有一个Excel 2007(xlsm)文件,那么您只需将其保存为Excel 2003(xls)文件并使用其他答案中列出的方法。

答案 7 :(得分:16)

您是否尝试过在OpenOffice.org中打开它们?

我前段时间遇到类似的问题,发现Excel和Calc不了解彼此的加密,因此允许直接访问几乎所有内容。

这是不久前的事,所以如果这不仅仅是我的侥幸,它也可能已被打补丁。

答案 8 :(得分:12)

对于Excel 2007以上版本,您需要将文件扩展名更改为.zip 在存档中有一个子文件夹xl,在那里你会找到vbaProject.bin。 按照上面的步骤使用vbaProject.bin然后将其保存回存档。 修改你的扩展名并vo! (意思是按照上面的步骤)

答案 9 :(得分:11)

如果你阻止了 CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" 在“已知密码”文件中,比“未知密码”文件中的现有块短,用十字零填充十六进制字符串以达到正确的长度。

e.g。

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

在未知密码文件中,应设置为

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"以保留文件长度。

我还在Office 2007中使用.XLA(97/2003格式)文件。

答案 10 :(得分:10)

Access,Excel,Powerpoint或Word文档(2007, 2010, 2013 or 2016版本扩展名为.ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM)的VBA项目密码可以 轻松删除

只需将文件扩展名更改为.ZIP,解压缩文件,并使用任何基本的十六进制编辑器(如XVI32)来打破&#34;打破&#34;现有密码,&#34;混淆&#34; Office,以便下次打开文件时提示输入新密码。

步骤摘要:

  • 重命名该文件,使其扩展名为.ZIP
  • 打开ZIP并转到XL文件夹。
  • 提取vbaProject.bin并使用十六进制编辑器
  • 打开它
  • &#34;搜索&amp;替换&#34; to&#34;替换所有&#34;将DPB更改为DPX
  • 保存更改,将.bin文件放回zip中,将其恢复为正常扩展名并正常打开文件。
  • ALT + F11进入VB编辑器并右键单击Project Explorer以选择VBA Project Properties
  • Protection标签上,设置新密码。
  • 点击OK,关闭文件,重新打开,点击ALT + F11。
  • 输入您设置的新密码。

此时,如果您选择,则可以完全删除密码。

完整说明,我在<{3}}上播放了&#34;返回的视频

令人震惊的是,这种解决方法已经存在多年,而且微软还没有解决这个问题。

  

故事的寓意?

     为了 任何敏感信息的安全性,

Microsoft Office VBA项目密码不依赖 。如果安全性很重要,请使用第三方加密软件。

答案 11 :(得分:9)

Colin Pickard大多是正确的,但不要将整个文件的“密码打开”保护与VBA密码保护混淆,这与前者完全不同,对Office 2003和2007也是如此(适用于Office) 2007年,将文件重命名为.zip并在zip中查找vbaProject.bin。从技术上讲,编辑文件的正确方法是使用像CFX这样的OLE复合文档查看器来打开正确的流。当然,如果你只是替换字节,普通的旧二进制编辑器可能会工作。

顺便说一下,如果你想知道这些字段的确切格式,他们现在已经记录了它们:

http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx

答案 12 :(得分:8)

轮到我了,这是基于kaybee99出色的答案而建立的,该答案基于ĐứcThanhNguyễn出色的答案而建立,以使该方法可同时用于x86和amd64版本的Office。

有关更改的概述,我们避免将push / ret限制为32位地址,而将其替换为mov / jmp reg。

经过测试并可以在

上使用
  

Word / Excel 2016- 32位版本
    Word / Excel 2016- 64位版本

工作方式

  1. 打开包含锁定的VBA项目的文件。
  2. 创建与上述类型相同的新文件,并将此代码存储在 Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 11) As Byte
    Dim OriginBytes(0 To 11) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 12
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 11) As Byte
        Dim p As LongPtr, osi As Byte
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        #If Win64 Then
            osi = 1
        #Else
            osi = 0
        #End If
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
        If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1
            If TmpBytes(osi) <> &HB8 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                If osi Then HookBytes(0) = &H48
                HookBytes(osi) = &HB8
                osi = osi + 1
                MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi
                HookBytes(osi + 4 * osi) = &HFF
                HookBytes(osi + 4 * osi + 1) = &HE0
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                       hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
    
  3. 将此代码粘贴到 Module2 中并运行

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    

答案 13 :(得分:7)

如果文件是有效的zip文件(前几个字节是50 4B - 以.xlsm等格式使用),则解压缩文件并查找子文件xl/vbaProject.bin。这是一个CFB文件,就像.xls文件一样。按照XLS格式的说明(应用于子文件),然后只压缩内容。

对于XLS格式,您可以按照本文中的其他一些方法进行操作。我个人更喜欢搜索DPB=块并替换文本

CMG="..."
DPB="..."
GC="..."

有空格。这可以避免CFB容器尺寸问题。

答案 14 :(得分:5)

我尝试了上面的一些解决方案,但它们都不适用于我(excel 2007 xlsm文件)。然后我找到了另一种解决方案,甚至可以检索密码,而不仅仅是破解它。

将此代码插入模块,运行并给它一些时间。它将通过强力恢复您的密码。

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

答案 15 :(得分:5)

ElcomSoft生成高级Office密码破解程序高级Office密码恢复产品,这些产品可能适用于此案例,只要该文档是在Office 2007中创建的或先前。

答案 16 :(得分:4)

汤姆 - 我最初犯了一个小学生错误,因为我没有看字节大小,而是从“CMG”设置复制并粘贴到后续条目。不过,这两个文件之间有两种不同的文字大小,就像Stewbob警告的那样,我丢失了VBA项目。

使用HxD,有一个计数器可以跟踪您选择的文件数量。复制从CMG开始,直到计数器读取8F(十六进制为143),同样当粘贴到锁定文件时 - 我最后在粘贴结束时使用了两倍“...”,这看起来很奇怪,感觉差不多不自然,但它奏效了。

我不知道它是否至关重要,但我确保在重新打开Excel中的文件之前关闭了十六进制编辑器并将其缩小。然后,我必须通过菜单打开VB编辑器,进入VBProject属性并输入“新”密码来解锁代码。

我希望这会有所帮助。

答案 17 :(得分:3)

我的工具VbaDiff直接从文件中读取VBA,因此您可以使用它从大多数office文档中恢复受保护的VBA代码,而无需使用十六进制编辑器。

答案 18 :(得分:2)

保护是Excel中的简单文本比较。 在您喜欢的调试器中加载Excel(Ollydbg是我的选择工具),找到进行比较的代码并将其修复为始终返回true,这样可以让您访问宏。

答案 19 :(得分:1)

您的excel文件的扩展名更改为xml。 并在记事本中打开它。 密码文本在xml文件中查找。

你看到如下线;

Sheets("Sheet1").Unprotect Password:="blabla"

(抱歉我的英语不好)

答案 20 :(得分:1)

接受的答案在 Windows 10 上的 Excel 2019 中不起作用。找出了我们需要采取的额外步骤来查看锁定的宏。我正在总结步骤。

  1. 在 excel 文件名的末尾添加一个 .zip 并按 Enter

  2. 将文件更改为 ZIP 文件后,双击打开它

  3. 在里面你会看到一个名为 xl 的文件夹,如下所示

  4. 在 xl 里面,你会找到一个名为 vbaProject.bin 的文件,将它复制/粘贴到桌面上

  5. 转至在线十六进制编辑器 HexEd.it

  6. 搜索以下文本 DPB=... 并将它们更改为 DPx=...

  7. 保存文件并关闭 HexEd.it

  8. 从桌面复制/粘贴更新的文件到 ZIP 文件中(您需要覆盖它)

  9. 删除文件名末尾的 .zip 扩展名并再次添加 excel 扩展名。

  10. 在 excel 中打开文件 - 您可能会收到几个错误通知,只需点击它们即可。

==== 接受答案的额外步骤 ======

<块引用>
  1. 打开 Visual Basic 窗口(如果我没记错的话,通常是 ALT+F11)并打开 VBAProject 属性(工具菜单)。
  2. 单击“保护”选项卡并将密码更改为(在此阶段不要删除)简短易记的密码(我们将 在下一步中删除)。
  3. 保存工作簿,然后关闭并重新打开。
  4. 再次打开 Visual Basic 窗口并输入您刚刚输入的密码。重做上一步,但这次您可以删除(删除) 密码。
  5. 保存工作簿,您现在已删除密码。

从以下站点采取了额外的步骤 https://confluence.jaytaala.com/display/TKB/Remove+Excel+VBA+password

答案 21 :(得分:0)

如果您在Java工作,可以尝试VBAMacroExtractor。从.xlsm中提取VBA脚本后,我在明文中找到了密码。

答案 22 :(得分:-1)

对于Windows 10计算机上的Excel 2016 64位,我使用十六进制编辑器来更改受保护xla的密码(尚未针对任何其他扩展测试此密码)。 提示:在执行此操作之前创建备份。

我采取的步骤:

  1. 在十六进制编辑器中打开vba(例如XVI)
  2. 在此DPB上搜索
  3. 将DPB更改为其他内容,例如DPX
  4. 保存!
  5. 重新打开.xla,会出现一条错误消息,只需继续。
  6. 您现在可以通过打开属性并转到密码选项卡来更改.xla的密码。
  7. 我希望这能帮助你们中的一些人!