2011-09-16 11 views
10

Estoy actualizando una aplicación escrito por otra persona (por supuesto :)formas de Excel: identificar código no utilizado

he encontrado un montón de no utilizados Sub CommandButtonXX_Click() submarinos, y yo no siempre estoy seguro de si todavía existe el botón. ¿Hay alguna forma (programa, interfaz VBE, herramienta externa) de realizar una limpieza mientras se evita eliminar el código todavía en uso?

La lista en la parte superior del cuadro de propiedades parece ser confiable, ya que es tipo de sensible al contexto: si está en una pestaña, muestra solo los elementos de esa pestaña.

+1

nice question.No trataría de automatizar la supresión a través de VBA solo porque sería bastante difícil de codificar y podría obtener resultados no previstos. Si lo intenta "a mano", el cuadro de lista en el VBE debe ser exhaustivo de los botones restantes. – JMax

+0

@JMAx: Realmente no busco eliminar el código automáticamente, solo una manera de asegurarme de que ButtonXX realmente se haya ido, así que puedo eliminar el sub manualmente. –

Respuesta

10

¡Una pregunta interesante!

  1. he modificado significativamente código Listing All Procedures In A Module de Pearson para encontrar todo el código CommandButtonXX_Click en cada hoja de trabajo (con exclusión de otros submarinos),
  2. luego trató de igualar cada código CommandButtonXX_Click a un botón real en esa hoja.
  3. Si no hay ninguna coincidencia se elimina el botón, y una Msgbox en las listas de todas las eliminaciones finales

Codificación del Editor de VBA puede ser problemático así que por favor guarde su trabajo de antemano. He evitado el enlace anticipado con la biblioteca de extensibilidad que Pearson ha utilizado.

[4 Oct 2012: Actualización para trabajar en formularios de usuario en lugar de hojas]

 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

Es un buen comienzo, gracias ... excepto que estoy buscando botones en * Forms *, no en Worksheets. Estoy trabajando en ello, basado en tu código, y publicaré mis actualizaciones cuando haya terminado. –

+0

Sin problemas, no debería requerir demasiadas modificaciones, el enlace de Pearson debería ser útil para adaptar el código, de lo contrario, avíseme si desea que lo modifique. – brettdj

+1

Actualizado para mirar UserForms. – brettdj

6

Hay una herramienta gratuita complemento denominado MZ-Tools que se pueden utilizar para identificar los procedimientos utilizados (se puede hacer mucho más también). Aquí está el enlace: http://www.mztools.com/v3/download.aspx

+1

yo uso también! ¡Es muy bonito! –

+0

Instalé MZ-Tools y me parece muy útil. Pero no pude encontrar fácilmente la funcionalidad para identificar los procedimientos no utilizados. ¿Puedes enviar una captura de pantalla? :) – brettdj

+1

No pude encontrar esa característica tampoco. –

3

estoy desarrollando Rubberduck, un código abierto complemento COM para el VBE escrito en C# que tiene una inspecciones función código que, a partir de la versión 1.3 (próxima versión!), incluirá una inspección que hace exactamente eso:

"Procedure 'CommandButton5_Click' is never used"

Esta inspección no está buscando específicamente no utilizados manipuladores clic como la respuesta aceptada está haciendo (y en su caso de cambio de nombre fue CommandButtonX d a nada significativo, entonces la respuesta aceptada no los encontrará - pero esa no es la publicación original sobre) - está buscando procedimientos que nunca se llaman, asumiendo Public procedimientos y funciones en un módulo estándar (es decir expuestos a la aplicación host como "macros" o "funciones definidas por el usuario"), se utilizan fuera del código VBA.

Esta versión sólo se encuentra en los controles formas, no en las hojas de trabajo - por lo que los procedimientos de Manejador de controles ActiveX situados en una hoja de trabajo que en realidad aparecen como falsos positivos.

+0

No fue mío @brettdj –

+0

no hay problemas. – brettdj

+0

FWIW He editado para resaltar que su [muy buena] respuesta en realidad se dirige al OP. –

Cuestiones relacionadas