Excel表单:识别未使用的代码

时间:2011-09-16 13:51:25

标签: excel excel-vba vba

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

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

属性框顶部的列表看起来确实可靠,因为它是上下文敏感的:如果您在选项卡中,它只显示该选项卡的项目。 / p>

3 个答案:

答案 0 :(得分:10)

一个有趣的问题!

  1. 我已经对Pearson的代码Listing All Procedures In A Module进行了重大修改,以便在每个工作表上找到所有CommandButtonXX_Click代码(不包括其他潜在客户),
  2. 然后尝试将每个CommandButtonXX_Click代码与该工作表上的实际按钮相匹配。
  3. 如果没有匹配,则删除该按钮,最后的Msgbox列出所有删除
  4. 编写VBA编辑器可能会有问题,所以请事先保存您的工作。我避免早期绑定Pearson使用的扩展性库。

    [2012年10月4日:已更新以使用UserForms而不是表格]

           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
    

答案 1 :(得分:6)

有一个名为MZ-Tools的免费加载项工具,可用于识别未使用的过程(它还可以执行更多操作)。这是链接:http://www.mztools.com/v3/download.aspx

答案 2 :(得分:4)

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

"Procedure 'CommandButton5_Click' is never used"

此检查并非专门寻找未使用的点击处理程序,因为已接受的答案正在进行(如果任何CommandButtonX重命名为有意义的任何内容,则接受的答案将不会找到他们 - 但这不是原帖的内容) - 它正在寻找永远不会被称为的程序,假设{{1}标准模块中的过程和函数(即作为"宏"或者#34;用户定义的函数")暴露给主机应用程序,在VBA代码之外使用。

此版本仅查找表单上的控件,而不是工作表上的控件 - 因此位于工作表上的ActiveX控件的处理程序实际上会显示为误报。