Attribute VB_Name = "DeleteEmptyModules"
Option Explicit

Sub DeleteEmptyModules()
    Dim objVBComp As VBComponent

    Const vbext_ct_StdModule As Long = 1
    Const vbext_ct_ClassModule As Long = 2

    For Each objVBComp In ActiveWorkbook.VBProject.VBComponents
      Select Case objVBComp.Type
        Case vbext_ct_StdModule, vbext_ct_ClassModule
          If objVBComp.CodeModule.CountOfLines < 3 Then
            Debug.Print "(deleted) " & objVBComp.Name & vbTab & _
                "declarations: " & objVBComp.CodeModule. _
            CountOfDeclarationLines & vbTab & _
                "Total code Lines: " & _
                objVBComp.CodeModule.CountOfLines
            ActiveWorkbook.VBProject.VBComponents. _
                Remove objVBComp
          End If
      End Select
    Next
    Set objVBComp = Nothing
End Sub

Function ModuleExists(strModName As String) As Boolean
    Dim objVBProj As VBProject

    Set objVBProj = ThisWorkbook.VBProject

    On Error Resume Next

    ModuleExists = Len(objVBProj.VBComponents(strModName).Name) <> 0
End Function

Function ProcExists(strModName As String, _
                    strProcName As String) As Boolean

    Dim objVBProj As VBProject

    Set objVBProj = ThisWorkbook.VBProject

    On Error Resume Next

    ' first find out if the specified module exists
    If ModuleExists(strModName) = True Then
        ProcExists = objVBProj.VBComponents(strModName) _
            .CodeModule.ProcStartLine(strProcName, vbext_pk_Proc) <> 0
    End If
End Function