Ответ 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