2011-09-16 52 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。 –