2011-09-16 26 views
10

我更新的应用别人写的(当然:)的Excel表格:识别未使用的代码

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

属性框顶部的列表似乎是可靠的,因为它是上下文敏感的:如果您在选项卡中,它只显示该选项卡的项目。

+1

不错的问题。我不会试图通过VBA自动化抑制,因为这将是很难编码,你可能会得到未预料到的结果。如果您尝试“手动”,VBE中的列表框应该是穷举剩下的按钮。 – JMax

+0

@JMAx:我真的不想自动删除代码,只是为了确保ButtonXX真的没了,所以我可以手动删除相应的子文件。 –

回答

10

一个有趣的问题!

  1. 我有显著修改皮尔森代码Listing All Procedures In A Module找到每个工作表上的所有CommandButtonXX_Click代码(不包括其他潜艇),
  2. 然后试图每个CommandButtonXX_Click代码匹配对片上的实际按钮。
  3. 如果没有匹配的按钮被删除,并且Msgbox末列出所有缺失

编码VBA编辑器可能会产生问题,从而请事先保存工作。我避免了早期与Pearson使用的Extensibility库绑定。

[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 
+0

这是一个不错的开始,谢谢...除了我正在寻找* Forms *中的按钮,而不是在Worksheets中。我正在根据您的代码开展工作,并在完成后发布我的更新。 –

+0

没有probs,它不应该做太多修改,Pearson的链接应该有助于调整代码,否则让我知道你是否希望我调整它。 – brettdj

+1

已更新,查看UserForms。 – brettdj

6

有一个称为MZ-工具,可以用来识别未使用的程序无附加工具(它也可以做更多)。这里是链接:http://www.mztools.com/v3/download.aspx

+1

我也用!这是很不错的! –

+0

我安装了MZ-Tools,看起来非常有用。但是我无法找到识别未使用过程的功能。你能发表一个截图吗? :) – brettdj

+1

我无法找到该功能。 –

3

我开发Rubberduck,一个开源的COM加载项为C#编写的VBE具有代码检查的特征是,作为1.3版本(下一个版本! ),将包括正是这么做的检查:

"Procedure 'CommandButton5_Click' is never used"

这种检查是不是专门找未使用单击处理作为公认的答案是做(如果有任何CommandButtonX是重命名d到任何有意义的东西,那么接受的答案将不会找到它们 - 但这不是原来的帖子是关于) - 它正在寻找程序,从来没有被称为,假设Public过程和标准模块中的功能。在主机应用程序中暴露为“宏”或“用户定义的函数”)在VBA代码之外使用。

此版本只发现于形式,而不是在工作表控制 - 因此对于位于一个工作表将实际显示为误报ActiveX控件处理程序。

+0

不是我的@brettdj –

+0

没有probs欢呼声。 – brettdj

+0

FWIW我已经编辑过来强调你的[非常好]的回答实际上解决了OP。 –