2009-08-19 11 views
4

J'écris un outil de reporting pour documenter les fichiers Excel pour divers "critères de conformité", y compris wkb.VBProject.Protection pour signaler si le VBA est verrouillé. Mais comment puis-je savoir si le classeur a un projet?Comment tester l'existence de VBA dans un classeur Excel, en VBA?

Si je calcule

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

qui me donnera le nombre de modules + modules + classe formes, mais je pouvais encore avoir un code derrière une feuille.

Existe-t-il un moyen dans Excel - comme Access frm.HasModule - pour savoir s'il y a du code VBA dans le classeur?

Répondre

5

J'ai utilisé ce qui suit pour compter le nombre total de lignes dans un projet auparavant. Il prendra le code au ThisWorkbook, les modules de code, les modules de classe et les formulaires.

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 

Notez cependant que si vos classeurs ont Option Explicit forcé alors ce comptera comme deux lignes par objet (Option Explicit et un saut de ligne). Si vous savez que c'est le cas, et que vous vérifiez le LOC d'un autre projet, vous pouvez simplement compter le nombre d'objets, le doubler et tester que VBALineCount ne dépasse pas ce nombre.

+0

grâce Lunatik, qui est parfait. –

4

Après soupçon de Lunatik, voici ma dernière fonction (pour qui il peut aider):

 
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 
7

Excel 2007+ a une nouvelle propriété de classeur appelé « .HasVBProject » que vous pouvez vous renseigner.

Pour Excel 2003 et versions antérieures, le test de solution ci-dessus pour les lignes de code dans le CodeModule de l'un des composants VBComponents du classeur est approprié.

Vous devez tester la propriété ".CountOfLines" tout seul, car les lignes de code dans la section Declaration d'un module de code (obtenues via ".CountOfDeclarationLines") sont considérées par Excel comme "Macro code" et nécessitent l'enregistrement en macro formats activés

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 

Néerlandais