Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2412|回复: 6

[已解决]想通过代码删除指定工作簿所有代码

[复制链接]
发表于 2013-7-23 12:50 | 显示全部楼层 |阅读模式
本帖最后由 我心飞翔410 于 2013-7-23 13:16 编辑

我知道某个工作簿路径 “新建 Microsoft Excel 工作表.xlsm”   想删除里面的所有宏文件 包括移除模块
最佳答案
2013-7-23 13:53
  1. Sub 清除代码和模块()
  2.     '开启VBA模型访问信任
  3.     Call TrustVBA
  4.    
  5.     '清除指定工作簿的代码和模块
  6.     Call clearModule(ThisWorkbook.Name)
  7. End Sub

  8. Sub clearModule(strWorkbook As String)
  9.     Dim vbe As Object
  10.     Dim vbc As Object
  11.     Dim wb As Workbook
  12.    
  13.     On Error Resume Next
  14.    
  15.     Set wb = Workbooks(strWorkbook)
  16.    
  17.     If wb Is Nothing Then
  18.         MsgBox "找到不指定的工作簿窗口,请确认是否有打开"
  19.         Exit Sub
  20.     End If
  21.    
  22.     If wb.HasVBProject Then
  23.         '检测是否有保护
  24.         If wb.VBProject.Protection Then
  25.             MsgBox strWorkbook & " 有VBA密码保护,请先取消密码保护", vbCritical + vbokok
  26.             Set wb = Nothing
  27.             Exit Sub
  28.         End If
  29.         
  30.         Set vbe = wb.VBProject.VBComponents
  31.         
  32.         For Each vbc In vbe
  33.             Select Case vbc.Type
  34.                 Case 1, 2, 3
  35.                     vbe.Remove vbc
  36.                 Case 100
  37.                     With vbc.CodeModule
  38.                         .DeleteLines 1, .CountOfLines
  39.                     End With
  40.             End Select
  41.         Next
  42.     End If

  43. End Sub

  44. Function TrustVBA(Optional ByVal KeyValue = 1)
  45.     Dim strKey1 As String, strKey2 As String, strKey3 As String, strKey4 As String
  46.     Dim KeyValue1, KeyValue2
  47.     Dim strVersion As String
  48.     On Error Resume Next

  49.     strVersion = Application.Version

  50.     strKey1 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  51.     strKey2 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  52.     strKey3 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  53.     strKey4 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  54.     'AccessVBOM 允许访问VBA对象

  55.     Call WriteReg(strKey1, KeyValue, "REG_DWORD")
  56.     Call WriteReg(strKey2, KeyValue, "REG_DWORD")
  57.     Call WriteReg(strKey3, KeyValue, "REG_DWORD")
  58.     Call WriteReg(strKey4, KeyValue, "REG_DWORD")

  59. End Function

  60. Sub WriteReg(strkey As String, Value As Variant, ValueType As String)
  61.     Dim objWshell As Object
  62.     Set objWshell = CreateObject("WScript.Shell")
  63.     If ValueType = "" Then
  64.         objWshell.RegWrite strkey, Value
  65.     Else
  66.         objWshell.RegWrite strkey, Value, ValueType
  67.     End If
  68.     Set objWshell = Nothing
  69. End Sub
复制代码
发表于 2013-7-23 13:45 | 显示全部楼层
  1. Option Explicit


  2. Sub 清除代码和模块()
  3.     Call TrustVBA
  4.     Call clearModule(ThisWorkbook.Name)
  5. End Sub

  6. Sub clearModule(strworkbook As String)
  7.     Dim vbe As Object
  8.     Dim vbc As Object
  9.     Set vbe = Workbooks(strworkbook).VBProject.VBComponents
  10.     For Each vbc In vbe
  11.         Debug.Print vbc.Name, vbc.Type

  12.         Select Case vbc.Type
  13.             Case 1, 2, 3
  14.                 vbe.Remove vbc
  15.             Case 100
  16.                 With vbc.CodeModule
  17.                     .DeleteLines 1, .CountOfLines
  18.                 End With
  19.         End Select
  20.     Next
  21. End Sub

  22. Function TrustVBA(Optional ByVal KeyValue = 1)
  23.     Dim strKey1 As String, strKey2 As String, strKey3 As String, strKey4 As String
  24.     Dim KeyValue1, KeyValue2
  25.     Dim strVersion As String
  26.     On Error Resume Next

  27.     strVersion = Application.Version

  28.     strKey1 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  29.     strKey2 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  30.     strKey3 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  31.     strKey4 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  32.     'AccessVBOM 允许访问VBA对象

  33.     Call WriteReg(strKey1, KeyValue, "REG_DWORD")
  34.     Call WriteReg(strKey2, KeyValue, "REG_DWORD")
  35.     Call WriteReg(strKey3, KeyValue, "REG_DWORD")
  36.     Call WriteReg(strKey4, KeyValue, "REG_DWORD")

  37. End Function

  38. Sub WriteReg(strkey As String, Value As Variant, ValueType As String)
  39.     Dim objWshell As Object
  40.     Set objWshell = CreateObject("WScript.Shell")
  41.     If ValueType = "" Then
  42.         objWshell.RegWrite strkey, Value
  43.     Else
  44.         objWshell.RegWrite strkey, Value, ValueType
  45.     End If
  46.     Set objWshell = Nothing
  47. End Sub
复制代码
回复

使用道具 举报

发表于 2013-7-23 13:46 | 显示全部楼层
Call clearModule(ThisWorkbook.Name)
调用的时候,直接改 thisworkbook.name 为要删除代码和模块的工作簿。
还有个BUG得改下。
回复

使用道具 举报

发表于 2013-7-23 13:53 | 显示全部楼层    本楼为最佳答案   
  1. Sub 清除代码和模块()
  2.     '开启VBA模型访问信任
  3.     Call TrustVBA
  4.    
  5.     '清除指定工作簿的代码和模块
  6.     Call clearModule(ThisWorkbook.Name)
  7. End Sub

  8. Sub clearModule(strWorkbook As String)
  9.     Dim vbe As Object
  10.     Dim vbc As Object
  11.     Dim wb As Workbook
  12.    
  13.     On Error Resume Next
  14.    
  15.     Set wb = Workbooks(strWorkbook)
  16.    
  17.     If wb Is Nothing Then
  18.         MsgBox "找到不指定的工作簿窗口,请确认是否有打开"
  19.         Exit Sub
  20.     End If
  21.    
  22.     If wb.HasVBProject Then
  23.         '检测是否有保护
  24.         If wb.VBProject.Protection Then
  25.             MsgBox strWorkbook & " 有VBA密码保护,请先取消密码保护", vbCritical + vbokok
  26.             Set wb = Nothing
  27.             Exit Sub
  28.         End If
  29.         
  30.         Set vbe = wb.VBProject.VBComponents
  31.         
  32.         For Each vbc In vbe
  33.             Select Case vbc.Type
  34.                 Case 1, 2, 3
  35.                     vbe.Remove vbc
  36.                 Case 100
  37.                     With vbc.CodeModule
  38.                         .DeleteLines 1, .CountOfLines
  39.                     End With
  40.             End Select
  41.         Next
  42.     End If

  43. End Sub

  44. Function TrustVBA(Optional ByVal KeyValue = 1)
  45.     Dim strKey1 As String, strKey2 As String, strKey3 As String, strKey4 As String
  46.     Dim KeyValue1, KeyValue2
  47.     Dim strVersion As String
  48.     On Error Resume Next

  49.     strVersion = Application.Version

  50.     strKey1 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  51.     strKey2 = "HKEY_CURRENT_USER\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  52.     strKey3 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\AccessVBOM"
  53.     strKey4 = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office" & strVersion & "\Excel\Security\Level"
  54.     'AccessVBOM 允许访问VBA对象

  55.     Call WriteReg(strKey1, KeyValue, "REG_DWORD")
  56.     Call WriteReg(strKey2, KeyValue, "REG_DWORD")
  57.     Call WriteReg(strKey3, KeyValue, "REG_DWORD")
  58.     Call WriteReg(strKey4, KeyValue, "REG_DWORD")

  59. End Function

  60. Sub WriteReg(strkey As String, Value As Variant, ValueType As String)
  61.     Dim objWshell As Object
  62.     Set objWshell = CreateObject("WScript.Shell")
  63.     If ValueType = "" Then
  64.         objWshell.RegWrite strkey, Value
  65.     Else
  66.         objWshell.RegWrite strkey, Value, ValueType
  67.     End If
  68.     Set objWshell = Nothing
  69. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-7-23 14:08 | 显示全部楼层
太长了 吗 不是有个'         For Each VBC In ThisWorkbook.VBProject.VBComponents   '删除所有宏文件
'
'             VBC.CodeModule.DeleteLines 1, VBC.CodeModule.CountOfLines
'
'         Next
回复

使用道具 举报

 楼主| 发表于 2013-7-23 17:04 | 显示全部楼层
呵呵 学习了 赞
回复

使用道具 举报

发表于 2013-7-29 09:09 | 显示全部楼层
汗,这么写错了,
MsgBox strWorkbook & " 有VBA密码保护,请先取消密码保护", vbCritical + vbokok

改成
MsgBox strWorkbook & " 有VBA密码保护,请先取消密码保护", vbCritical + vbokonly
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 16:23 , Processed in 1.337663 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表