【问题标题】:Excel forms: identify unused codeExcel 表单:识别未使用的代码
【发布时间】:2018-07-06 10:16:08
【问题描述】:

我正在更新由其他人编写的 应用程序(当然:)

我发现了很多未使用的Sub CommandButtonXX_Click() 订阅者,我并不总是确定按钮是否仍然存在。有没有办法(程序、VBE 界面、外部工具)进行一些清理,同时避免删除 仍在使用 代码?

属性框顶部的列表似乎确实可靠,因为它有点上下文相关:如果您在一个选项卡中,它只会显示该选项卡的项目。

【问题讨论】:

  • 好问题。我不会尝试通过 VBA 自动进行抑制,因为这将很难编码,并且您可能会得到意想不到的结果。如果您“手动”尝试,VBE 中的列表框应该会列出剩余的按钮。
  • @JMAx:我真的不希望自动删除代码,只是为了确保 ButtonXX 真的消失了,所以我可以手动删除相应的子。

标签: excel excel vba


【解决方案1】:

一个有趣的问题!

  1. 我对 Pearson 的代码 Listing All Procedures In A Module 进行了重大修改,以便在每个工作表(不包括其他子项)上找到所有 CommandButtonXX_Click 代码,
  2. 然后尝试将每个 CommandButtonXX_Click 代码与该工作表上的实际按钮进行匹配。
  3. 如果不匹配,按钮将被删除,最后的Msgbox 列出所有删除

对 VBA 编辑器进行编码可能会出现问题,因此请事先保存您的工作。我避免了与 Pearson 使用的可扩展性库的早期绑定。

[2012 年 10 月 4 日:更新为在用户窗体而非表格上工作]

       SConst vbext_ct_MSForm = 3
Sub ListProcedures()
    Dim VBProj
    Dim VBComp
    Dim CodeMod
    Dim LineNum As Long
    Dim NumLines As Long
    Dim ProcName As String
    Dim ObjButton
    Dim ProcKind
    Dim strBadButtons As String
    Set VBProj = ActiveWorkbook.VBProject
    For Each VBComp In VBProj.vbcomponents
        If VBComp.Type = vbext_ct_MSForm Then
            Set CodeMod = VBComp.CodeModule
            With CodeMod
                LineNum = .CountOfDeclarationLines + 1
                Do Until LineNum >= .CountOfLines
                    ProcName = .ProcOfLine(LineNum, 0)
                    If ProcName Like "CommandButton*_Click" Then
                        Set ObjButton = Nothing
                        On Error Resume Next
                        Set ObjButton = VBComp.Designer.Controls(Replace(ProcName, "_Click", vbNullString))
                        On Error GoTo 0
                        If ObjButton Is Nothing Then
                            strBadButtons = strBadButtons & CodeMod.Name & "-" & Replace(ProcName, "_Click", vbNullString) & vbNewLine
                            .DeleteLines .ProcStartLine(ProcName, 0), .ProcCountLines(ProcName, 0)
                        End If
                    End If
                    LineNum = LineNum + 1
                Loop
            End With
        End If
    Next
    If Len(strBadButtons) > 0 Then MsgBox "Bad Buttons deleted" & vbNewLine & strBadButtons
End Sub

【讨论】:

  • 这是一个好的开始,谢谢...除了我在 Forms 中寻找按钮,而不是在 Worksheets 中。我正在根据您的代码进行处理,完成后将发布我的更新。
  • 没有问题,应该不需要太多修改,Pearson 的链接应该有助于修改代码,否则如果您希望我调整它,请告诉我。
  • 更新为查看用户表单。
  • 太棒了!非常感谢。太糟糕了,我不能接受两次;-)
  • 很高兴能帮上忙,我真的很喜欢这个:)
【解决方案2】:

有一个名为 MZ-Tools 的免费插件工具可用于识别未使用的程序(它还可以做更多事情)。这是链接:http://www.mztools.com/v3/download.aspx

【讨论】:

  • 我安装了 MZ-Tools,它看起来确实很有用。但我无法轻易找到识别未使用过程的功能。你可以张贴截图吗? :)
  • 我也找不到那个功能。
  • 我已经向我推荐过它,但我以前从未使用过它。据该网站介绍:“当您制作项目的可执行文件时,即单击某些 File | Make ... 菜单时,可以自动启动(或询问您)源代码审查。”
【解决方案3】:

我正在开发 Rubberduck,这是一个用于 VBE 的开源 COM 插件,用 C# 编写,具有 代码检查 功能,截至版本1.3(下一个版本!),将包括一个完全这样做的检查:

此检查并不是专门寻找未使用的点击处理程序,因为接受的答案正在执行(如果任何 CommandButtonX 被重命名为任何有意义的东西,那么接受的答案将找不到它们 - 但这不是原始帖子的内容)-它正在寻找从未调用过的过程,假设Public 标准模块中的过程和函数(即暴露给主机)应用程序作为“宏”或“用户定义的函数”),在 VBA 代码之外使用。

这个版本只在 forms 上找到控件,而不是在 worksheets 上 - 因此位于工作表上的 ActiveX 控件的处理程序实际上会显示为误报。

【讨论】:

猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2012-01-02
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多