如何在VBA中测试Excel工作簿中是否存在VBA?

Pat*_*rez 4 excel vba excel-vba

我正在编写一个报告工具来记录各种"合规性标准"的Excel文件,包括wkb.VBProject.Protection报告VBA是否被锁定.

但是,如何找到工作簿是否有任何项目?

如果我计算

wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook)
Run Code Online (Sandbox Code Playgroud)

这将给我模块+类模块+表单的数量,但我仍然可以在工作表后面有一些代码.

在Excel中有没有办法 - 比如Access frm.HasModule - 找出工作簿中是否有任何VBA代码?

小智 7

Excel 2007+有一个名为".HasVBProject"的新工作簿属性,您可以查询.

对于Excel 2003及更早版本,上述解决方案测试工作簿的任何VBComponent的CodeModule中的代码行是合适的.

您应该单独测试".CountOfLines"属性,因为代码模块的声明部分中的代码行(通过".CountOfDeclarationLines"获得)被Excel视为"宏代码",并且需要保存为启用宏的格式.

Public Function HasVBProject(Optional pWorkbook As Workbook) As Boolean
'
' Checks if the workbook contains a VBProject.
'
On Error Resume Next
    Dim wWorkbook    As Workbook
    Dim wVBComponent As VBIDE.VBComponent ' As Object if used with Late Binding

    ' Default.
    '
    HasVBProject = False

    ' Use a specific workbook if specified, otherwise use current.
    '
    If pWorkbook Is Nothing _
    Then Set wWorkbook = ActiveWorkbook _
    Else Set wWorkbook = pWorkbook
    If wWorkbook Is Nothing Then GoTo EndFunction

    If (VBA.CInt(Application.Version) >= 12) _
    Then
        ' The next method only works for Excel 2007+
        '
        HasVBProject = wWorkbook.HasVBProject
    Else
       ' Signs the workbook has a VBProject is code in any of the VBComponents that make up this workbook.
        '
        For Each wVBComponent In wWorkbook.VBProject.VBComponents
            If (wVBComponent.CodeModule.CountOfLines > 0) _
            Then
                ' Found a sign of programmer's activity. Mark and quit.
                '
                HasVBProject = True: Exit For
            End If
        Next wVBComponent
    End If

EndFunction:
    Set wVBComponent = Nothing
    Set wWorkbook = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

荷兰人


Lun*_*tik 5

我以前使用以下内容来计算项目中的总行数.它将获取ThisWorkbook代码模块,类模块和表单.

Private Sub countCodeLines()
    Dim obj As Object
    Dim VBALineCount As Long
    For Each obj In ThisWorkbook.VBProject.VBComponents
        VBALineCount = VBALineCount + obj.CodeModule.CountOfLines
    Next obj
    Debug.Print VBALineCount
End Sub
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您的工作簿已Option Explicit强制,则每个对象将计为两行(Option Explicit和换行符).如果您知道这种情况,并且正在从另一个项目检查LOC,那么您可以简单地计算对象的数量,将其加倍并测试VBALineCount不超过此数量.