簡體   English   中英

如何在VBA中測試Excel工作簿中是否存在VBA?

[英]How to test for existence of VBA in Excel workbook, in VBA?

我正在編寫一個報告工具來記錄各種“合規性標准”的Excel文件,包括wkb.VBProject.Protection報告VBA是否被鎖定。

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

如果我計算

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

這將給我模塊+類模塊+表單的數量,但我仍然可以在工作表后面有一些代碼。

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

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

荷蘭人

我以前使用以下內容來計算項目中的總行數。 它將獲取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不超過這個數字。

在Lunatik的暗示之后,這是我的最終功能(對他們有幫助):

Function fTest4Code(wkb As Workbook) As Boolean
    'returns true if wkb contains VBA code, false otherwise
    Dim obj As Object
    Dim iCount As Integer
    For Each obj In wkb.VBProject.VBComponents
        With obj.CodeModule
            '# lines - # declaration lines > 2 means we do have code
            iCount = iCount + ((.CountOfLines - .CountOfDeclarationLines) > 2)
        End With
        If iCount  0 Then Exit For    'stop when 1st found
    Next obj
    fTest4Code = CBool(iCount)
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM