如何在Excel工作簿、VBA中测试VBA是否存在?
我正在编写一个报告工具,用于记录各种“合规性标准”的Excel文件,包括wkb.VBProject.Protection,以便在VBA被锁定时报告 但是我如何才能找到工作簿中是否有任何项目 如果我计算如何在Excel工作簿、VBA中测试VBA是否存在?,vba,excel,Vba,Excel,我正在编写一个报告工具,用于记录各种“合规性标准”的Excel文件,包括wkb.VBProject.Protection,以便在VBA被锁定时报告 但是我如何才能找到工作簿中是否有任何项目 如果我计算 wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook) 这将给我模块+类模块+表单的数量,但我仍然可以在一张工作表后面有一些代码 在Excel中是否有一种方法(如Access frm.HasM
wkb.VBProject.VBComponents.Count - wkb.Worksheets.Count - 1 '(for the workbook)
这将给我模块+类模块+表单的数量,但我仍然可以在一张工作表后面有一些代码
在Excel中是否有一种方法(如Access frm.HasModule)来确定工作簿中是否有VBA代码?我以前使用过以下方法来计算项目中的总行数。它将获取
本工作簿中的代码、代码模块、类模块和表单
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的提示之后,这里是我的最后一个函数(它可能会对您有所帮助):
函数fTest4Code(wkb作为工作簿)为布尔值
'如果wkb包含VBA代码,则返回true,否则返回false
作为对象的Dim obj
Dim I以整数形式计数
对于wkb.VBProject.VBComponents中的每个obj
使用obj.codemule
“#行-#声明行>2表示我们有代码
iCount=iCount+(.CountOfLines-.CountOfDecrationLines)>2)
以
如果iCount 0,则退出“找到第一个时停止”
下一个obj
fTest4Code=CBool(iCount)
端函数
Excel 2007+有一个名为“.HasVBProject”的新工作簿属性,您可以查询该属性
对于Excel 2003和更早版本,上述解决方案测试工作簿任何组件的CodeModule中的代码行是合适的
您应该单独测试“.CountOfLines”属性,因为代码模块的声明部分中的代码行(通过“.CountOfDecrationLines”获得)被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
荷兰语
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