![](/img/trans.png)
[英]Excel vba - How to refer to workbook builtin document properties in 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.