如何在VBA中testingExcel工作簿中是否存在VBA?

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

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

如果我计算

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

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

有没有在Excel中的方式 – 像访问frm.HasModule – 找出工作簿中是否有任何VBA代码?

我已经使用了以下来计算一个项目中的行数。 它将在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,那么您可以简单地计算对象的数量,将其加倍并testingVBALineCount是否不超过此数字。

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

对于Excel 2003及更早版本,上述解决schemetesting工作簿的任何VBComponent的CodeModule中的代码行都是适当的。

您应该单独testing“.CountOfLines”属性,因为代码模块的声明部分中的代码行(通过“.CountOfDeclarationLines”获取)被Excel视为“macros代码”,并且需要保存为启用macros的格式。

 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 

荷兰人

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

函数fTest4Code(wkb As Workbook)作为布尔值
     '如果wkb包含VBA代码则返回true,否则返回false
     Dim obj As Object
     Dim iCount As Integer
    对于每个obj中的wkb.VBProject.VBComponents
        用obj.CodeModule
             '#行 - #声明行> 2意味着我们有代码
             iCount = iCount +((.CountOfLines  -  .CountOfDeclarationLines)> 2)
        结束
        如果iCount 0 Then Exit For'停止当第一次发现
    下一个obj
     fTest4Code = CBool​​(iCount)
结束function