Формы Excel: определить неиспользуемый код - PullRequest
10 голосов
/ 16 сентября 2011

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

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

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

Ответы [ 3 ]

10 голосов
/ 16 сентября 2011

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

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

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

[4 октября 2012: обновлена ​​работа с пользовательскими формами, а не с листами]

       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
6 голосов
/ 18 сентября 2011

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

4 голосов
/ 17 апреля 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...