ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5721|回复: 16

[分享] 批量删除宏模块窗体类模块模板

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-5 11:12 | 显示全部楼层 |阅读模式
本帖最后由 f8b1987 于 2019-7-24 11:22 编辑

由于工作需要,经常给工作簿设置一些VBA代码,并保存在不同月份的工作簿中。

突然觉得,哪天把表格发给其他人时,老是有宏启用提示,对不用VBA且有强迫症的人是个烦恼的提示。

000.png

于是我在度娘搜索+EH/EP论坛的资料,通过加工整理出批量删除宏模块、类模块、窗体的代码,分享给大家。
该模板可以批量删除宏模块、类模块、窗体的代码,包含在sheet和thiswokbook里的代码也删除。

使用前需对Excel进行设置:文件——选项——信任中心——信任中心设置——宏设置——勾选【信任对VBA对象模型的访问】,再运行VBA
001.png 002.png 003.png


由于代码是复制、修改为主,一些多余的定义、无关语句并未做删除处理。盼各位对代码加以修改,让代码更简洁、高效。

特别鸣谢以下帖子:
我学 【喜迎2015立春】遍历文件夹(含子文件夹)方法 ABC  http://club.excelhome.net/thread-1185089-1-1.html?referrer=

http://club.excelhome.net/forum.php?mod=viewthread&tid=864766

http://club.excelhome.net/thread-1023302-1-1.html

http://club.excelhome.net/thread-1123734-1-1.html

原代码文件夹中有非Excel文件时会崩溃,现已更新代码解决。




批量删除宏模块窗体等20190724.zip

199.23 KB, 下载次数: 424

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-24 11:16 | 显示全部楼层

20190724已更新,补充了指定删除类型为窗体的代码,该段代码已注释,请自行解除注释及修改。
  1.                     If m.Type = 3 Then ''模块的值为1,类模块为2,窗体type值为3,Sheet及Thisworkbook为100
  2.                            m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  3.                            Wb.VBProject.VBComponents.Remove m
  4.                     End If
  5. <p> </p>
复制代码

批量删除宏模块窗体等20190724.zip

199.23 KB, 下载次数: 196

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-5 11:13 | 显示全部楼层
  1. Sub 删除模块等()
  2.     '------------------单个文件夹,不含子文件夹
  3.     Dim VBP As Object, vbc As Object, shp As Shape, sh As Worksheet
  4.     On Error Resume Next
  5.     Application.ScreenUpdating = False        '冻结屏幕,以防屏幕抖动
  6.     Application.AskToUpdateLinks = False  '不更新链接
  7.     Application.DisplayAlerts = False  '不提示窗口
  8.     With Application.FileDialog(msoFileDialogFolderPicker)
  9.     If .Show Then
  10.             Path = .SelectedItems(1)
  11.             File = Dir(Path & "\*.xls*")
  12. '            Application.EnableEvents = False
  13. '            Application.Calculation = xlCalculationManual
  14.             Do Until LenB(File) = 0
  15.                 Set Wb = Workbooks.Open(Filename:=Path & "" & File)
  16.                 For Each m In Wb.VBProject.VBComponents
  17.                   If m.Name Like "*" Then
  18.                     m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  19.                     Wb.VBProject.VBComponents.Remove m
  20.                   End If
  21.                 Next m
  22.                 Wb.Close savechanges:=True   '关闭
  23.                 File = Dir
  24.             Loop
  25.         End If
  26.     End With
  27.     Application.ScreenUpdating = True        '恢复屏幕刷新
  28.     Application.AskToUpdateLinks = True  '更新链接
  29.     Application.DisplayAlerts = True  '提示窗口
  30.     Application.Calculation = xlCalculationAutomatic     '恢复自动重算
  31.     MsgBox "已完成"
  32. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-5 11:15 | 显示全部楼层
本帖最后由 f8b1987 于 2019-7-5 22:34 编辑
  1. Sub ListFilesTest()
  2.     '-----------------文件夹内含有子文件夹操作
  3.     Application.ScreenUpdating = False        '冻结屏幕,以防屏幕抖动
  4.     Application.AskToUpdateLinks = False  '不更新链接
  5.     Application.DisplayAlerts = False  '不提示窗口
  6.     Application.EnableEvents = False
  7.     Application.Calculation = xlCalculationManual
  8.     With Application.FileDialog(msoFileDialogFolderPicker)
  9.         If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
  10.     End With
  11.     If Right(myPath, 1) <> "" Then myPath = myPath & ""
  12.    
  13. '    [a:b] = ""                    '清空A列
  14.     Call ListAllFso(myPath)   '调用FSO遍历子文件夹的递归过程
  15.     Application.EnableEvents = True
  16.     Application.ScreenUpdating = True        '恢复屏幕刷新
  17.     Application.AskToUpdateLinks = True  '更新链接
  18.     Application.DisplayAlerts = True  '提示窗口
  19.     Application.Calculation = xlCalculationAutomatic     '恢复自动重算
  20.     MsgBox "已完成"
  21. End Sub

  22. Function ListAllFso(myPath$) '用FSO方法遍历并列出所有文件和文件夹名的【递归过程】
  23.     On Error Resume Next
  24.     Set fld = CreateObject("Scripting.FileSystemObject").GetFolder(myPath)
  25.     '用FSO方法得到当前路径的文件夹对象实例 注意这里的【当前路径myPath是个递归变量】
  26.     ad = fld.Path
  27.     For Each f In fld.Files  '遍历当前文件夹内所有【文件.Files】
  28.         If f.Name Like "*.xls*" Then
  29.                 ddname = f.Name
  30.         '        [a65536].End(3).Offset(1) = f.Name '在A列逐个列出文件名
  31.                 Set Wb = Workbooks.Open(Filename:=ad & "" & f.Name) '打开文件操作
  32.                 For Each m In Wb.VBProject.VBComponents
  33.                             If m.Name Like "*" Then
  34.                                     m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  35.                                     Wb.VBProject.VBComponents.Remove m
  36.                               End If
  37.                 Next m
  38.                 Wb.Close savechanges:=True   '保存并关闭
  39.             End If
  40.     Next f

  41.     For Each fd In fld.SubFolders  '遍历当前文件夹内所有【子文件夹.SubFolders】
  42.         ad2 = fd.Path
  43.         na2 = fd.Name
  44. '        [a65536].End(3).Offset(1) = " " & fd.Name & ""  '在A列逐个列出子文件夹名
  45.         Call ListAllFso(fd.Path)       '注意此时的路径变量已经改变为【子文件夹的路径fd.Path】
  46.         '注意重点在这里: 继续向下调用递归过程【遍历子文件夹内所有文件文件夹对象】
  47.     Next fd
  48. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-7-23 14:45 | 显示全部楼层

老师好!如果想保留窗体,代码要如何修改,请赐教,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-24 10:12 | 显示全部楼层
本帖最后由 f8b1987 于 2019-7-24 11:10 编辑
huazai688 发表于 2019-7-23 14:45
老师好!如果想保留窗体,代码要如何修改,请赐教,谢谢!

把If m.Name Like "*" Then这一段改一下,
  1.                     If m.Type = 3 Then ''模块的值为1,类模块为2,窗体type值为3,Sheet及Thisworkbook为100
  2.                            m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  3.                            Wb.VBProject.VBComponents.Remove m
  4.                     End If
复制代码

TA的精华主题

TA的得分主题

发表于 2019-7-24 10:19 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-24 11:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 f8b1987 于 2019-7-24 11:10 编辑
huazai688 发表于 2019-7-24 10:19
好的,谢谢老师指点!!!
  1.                     If m.Type = 3 Then ''模块的值为1,类模块为2,窗体type值为3,Sheet及Thisworkbook为100
  2.                            m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  3.                            Wb.VBProject.VBComponents.Remove m
  4.                     End If
复制代码
第一次回复的代码有误,已修改,请留意。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-24 11:13 | 显示全部楼层
本帖最后由 f8b1987 于 2019-7-29 12:53 编辑

  1. Sub 删除模块等()
  2.     '------------------单个文件夹,不含子文件夹
  3.     Dim VBP As Object, vbc As Object, shp As Shape, sh As Worksheet
  4.     On Error Resume Next
  5.     Application.ScreenUpdating = False        '冻结屏幕,以防屏幕抖动
  6.     Application.AskToUpdateLinks = False  '不更新链接
  7.    Application.DisplayAlerts = False  '不提示窗口
  8.     With Application.FileDialog(msoFileDialogFolderPicker)
  9.     If .Show Then
  10.             Path = .SelectedItems(1)
  11.             File = Dir(Path & "\*.xls*")
  12.             Application.EnableEvents = False
  13.             Application.Calculation = xlCalculationManual
  14.             Do Until LenB(File) = 0
  15.                 Set Wb = Workbooks.Open(Filename:=Path & "" & File)
  16. '                For Each sht In Wb.Sheets
  17. '                    If sht.Type = xlExcel4MacroSheet Or sht.Name Like "Macro*" Then '判断是否宏表4.0
  18. '                        sht.Visible = True
  19. '                        sht.Delete
  20. '                    End If
  21. '                Next sht
  22.                 For Each m In Wb.VBProject.VBComponents
  23.                     If m.Name Like "*" Then
  24.                       m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  25.                       Wb.VBProject.VBComponents.Remove m
  26.                     End If
  27. '                    '===========================以下一段指定删除窗体、模块、类模块、Excel对象
  28. '                    If m.Type = 3 Then ''模块的值为1,类模块为2,窗体type值为3,Sheet及Thisworkbook为100
  29. '                           m.CodeModule.DeleteLines 1, m.CodeModule.CountOfLines
  30. '                           Wb.VBProject.VBComponents.Remove m
  31. '                    End If
  32. '                    '============================================
  33.                 Next m
  34.                 Wb.Close savechanges:=True   '关闭
  35.                 File = Dir
  36.             Loop
  37.         End If
  38.     End With
  39.     Application.ScreenUpdating = True        '恢复屏幕刷新
  40.     Application.AskToUpdateLinks = True  '更新链接
  41.     Application.DisplayAlerts = True  '提示窗口
  42.     Application.Calculation = xlCalculationAutomatic     '恢复自动重算
复制代码


方便大家针对性删除窗体、模块、类模块等,重新添加代码判断对象类型,判断部分已注释,请自行解除注释。

TA的精华主题

TA的得分主题

发表于 2019-7-24 14:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-21 11:24 , Processed in 0.039963 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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