如何在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