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

如何在Excel工作簿、VBA中测试VBA是否存在?,vba,excel,Vba,Excel,我正在编写一个报告工具,用于记录各种“合规性标准”的Excel文件,包括wkb.VBProject.Protection,以便在VBA被锁定时报告 但是我如何才能找到工作簿中是否有任何项目 如果我计算 wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook) 这将给我模块+类模块+表单的数量,但我仍然可以在一张工作表后面有一些代码 在Excel中是否有一种方法(如Access frm.HasM

我正在编写一个报告工具,用于记录各种“合规性标准”的Excel文件,包括wkb.VBProject.Protection,以便在VBA被锁定时报告

但是我如何才能找到工作簿中是否有任何项目

如果我计算

wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook)
这将给我模块+类模块+表单的数量,但我仍然可以在一张工作表后面有一些代码


在Excel中是否有一种方法(如Access frm.HasModule)来确定工作簿中是否有VBA代码?

我以前使用过以下方法来计算项目中的总行数。它将获取
本工作簿中的代码、代码模块、类模块和表单

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

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

在Lunatik的提示之后,这里是我的最后一个函数(它可能会对您有所帮助):

函数fTest4Code(wkb作为工作簿)为布尔值 '如果wkb包含VBA代码,则返回true,否则返回false 作为对象的Dim obj Dim I以整数形式计数 对于wkb.VBProject.VBComponents中的每个obj 使用obj.codemule “#行-#声明行>2表示我们有代码 iCount=iCount+(.CountOfLines-.CountOfDecrationLines)>2) 以 如果iCount 0,则退出“找到第一个时停止” 下一个obj fTest4Code=CBool(iCount) 端函数
Excel 2007+有一个名为“.HasVBProject”的新工作簿属性,您可以查询该属性

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

您应该单独测试“.CountOfLines”属性,因为代码模块的声明部分中的代码行(通过“.CountOfDecrationLines”获得)被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
荷兰语

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