Формы Excel: идентификация неиспользуемого кода

Я обновляю excel написанное кем-то другим (конечно:)

Я нашел много неиспользуемых субтитров Sub CommandButtonXX_Click(), и я не всегда уверен, что кнопка все еще существует. Есть ли способ (программа, VBE-интерфейс, внешний инструмент), чтобы сделать некоторую очистку, избегая при этом удаления еще используемого кода?

Список в верхней части окна свойств кажется надежным, так как он является довольно чувствительным к контексту: если вы находитесь на вкладке, он отображает только элементы этой вкладки.

Ответ 1

Интересный вопрос!

  • Я значительно изменил код Pearson Список всех процедур в модуле, чтобы найти все CommandButtonXX_Click код на каждом листе (за исключением других подсайтов)
  • затем попытался сопоставить каждый код CommandButtonXX_Click с фактической кнопкой на этом листе.
  • Если нет совпадения, кнопка удаляется, а Msgbox в конце перечисляет все удаления

Кодирование редактора VBA может быть проблематичным, поэтому PLS сохранит вашу работу заранее. Я избегал раннего связывания с библиотекой расширяемости, которую использовал Пирсон.

[4 октября 2012: Обновлено для работы с 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

Ответ 2

Там есть бесплатный инструмент надстройки, называемый MZ-Tools, который может использоваться для идентификации неиспользуемых процедур (он может сделать намного больше). Вот ссылка: http://www.mztools.com/v3/download.aspx

Ответ 3

Я разрабатываю Rubberduck, надстройку COM с открытым исходным кодом для написанного VBE в С#, который имеет функцию проверки кода, которая с версии 1.3 (следующая версия!) будет включать проверку, которая делает именно это:

"Procedure 'CommandButton5_Click' is never used"

Эта проверка специально не ищет неиспользуемых обработчиков кликов по мере принятия принятого ответа (и если какой-либо CommandButtonX был переименован во что-либо значимое, тогда принятый ответ их не найдет - но это не то, что исходное сообщение было about) - он ищет процедуры, которые никогда не вызывают, предполагая Public процедуры и функции в стандартном модуле (т.е. подвергающиеся хост-приложению как "макросы" или "определяемые пользователем функции" ), используются вне кода VBA.

Эта версия только находит элементы управления в формах, а не на листах - поэтому процедуры обработчика элементов управления ActiveX, расположенные на листе, будут фактически отображаться как ложные срабатывания.