2009-08-19 19 views
4

私は、VBAがロックされているかどうかを報告するwkb.VBProject.Protectionを含む、さまざまな「コンプライアンス基準」のExcelファイルを文書化するためのレポートツールを作成しています。VBAの存在をExcelワークブック、VBAでテストする方法は?

しかし、ワークブックにプロジェクトがあるかどうかはどうすればわかりますか?

私は私のモジュール+クラスモジュール+フォームの数を与えるだろうが、私はまだシートの背後にあるいくつかのコードを持っている可能性があり

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

を計算する場合。

Accessでfrm.HasModuleのような方法がありますか?ワークブックにVBAコードがあるかどうかを確認しますか?

答えて

5

私は以前にプロジェクトの行の総数を数えるために以下を使用しました。 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 

注しかし、あなたのワークブックが、これはオブジェクトごとに2つのライン(Option Explicitとラインフィード)としてカウントされますOption Explicitを余儀なくされている場合は、その。これが事実であると分かっていて、別のプロジェクトからLOCをチェックしている場合は、オブジェクトの数を数えて二倍にしてVBALineCountがこの数を超えないことをテストできます。

+0

おかげLunatik、それは完璧です。 –

4

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 
7

エクセル2007+は、あなたが尋ねることができ、「.HasVBProject」と呼ばれる新しいワークブックのプロパティがあります。

Excel 2003およびそれ以前のバージョンでは、ワークブックのVBComponentsのCodeModule内のコード行に対する上記のソリューションテストが適切です。

".CountOfDeclarationLines"で取得されたコードモジュールの宣言セクションのコード行がExcelで "マクロコード"とみなされ、マクロに保存する必要があるため、 ".CountOfLines"プロパティだけをテストする必要があります有効な形式。

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 

オランダ

関連する問題