【问题标题】:How to test for existence of VBA in Excel workbook, in VBA?如何在 VBA 中测试 Excel 工作簿中是否存在 VBA?
【发布时间】:2009-10-28 18:39:21
【问题描述】:

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

但是我怎样才能找到工作簿是否有任何项目?

如果我计算

wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook)

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

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

    对于 Excel 2003 和更早版本,上述解决方案测试工作簿任何 VBComponents 的 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
    

    荷兰语

    【讨论】:

      【解决方案2】:

      我以前使用以下方法来计算项目中的总行数。它将提取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
      

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

      【讨论】:

        【解决方案3】:

        在 Lunatik 的提示之后,这是我的最终功能(对谁有帮助):

        函数 fTest4Code(wkb As Workbook) 作为布尔值 '如果 wkb 包含 VBA 代码,则返回 true,否则返回 false 将 obj 调暗为对象 将 iCount 调暗为整数 对于 wkb.VBProject.VBComponents 中的每个 obj 使用 obj.CodeModule '#lines - #declarations lines > 2 表示我们确实有代码 iCount = iCount + ((.CountOfLines - .CountOfDeclarationLines) > 2) 结束于 If iCount 0 Then Exit For '当找到第一个时停止 下一个对象 fTest4Code = CBool​​(iCount) 结束功能

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多