2017-01-11 15 views
1

Excelファイルを開いた後でマクロを実行する必要があり、現在のExcelファイルのPrivate Sub Workbook.open( )ルーチンは空です。Private Sub Workbook.open()が空であることを確認する

ブックを開いた後にこの情報をメモリに保存する方法はありますか。ユーザーがマクロを実行する必要がある場合、この情報は利用可能です。永続的なグローバル変数に沿った何かが理想的です。しかし、可能かどうかは分かりません。

ありがとうございます!

+0

http://www.cpearson.com/excel/vbe.aspx –

+0

が 'かどうかの確認 "5.3アプリケーションの機能拡張のためにのMicrosoft Visual Basic" を追加し、あなたのVBプロジェクトへの参照を追加します。 Workbook_Open() 'がコードを持っているのは、' Workbook_Open() 'が***を実行したかどうかを判断することとは大きく異なります。そこにコードがあるのか​​、それとも実行されたのかを知る必要がありますか? – Comintern

+0

@ Comintern、いずれにしても良いです。いずれかの解決策がある場合、両方を知ることは素晴らしいことです! – hardish

答えて

1

以下のコード(通常のモジュール内)は、すべてのVBプロジェクトコンポーネント(ThisWorkbookモジュールを含む)をループし、モジュール名が "ThisWorkbook"であるかどうかを確認します。

「ThisWorkbook」モジュールが見つかると、そのモジュール内のコード行の総数をチェックし、0の場合は空であることをMsgBoxにします。そうでなければ、コード内に "Workbook_Open"という文字列があるかどうかを調べます。存在する場合は、 "Workbook_Open"行と最も近い "End Sub"行の間にあるコードの総数(空でない行)をカウントします。

Check_WorkBookModule_Contentsコード

Option Explicit 

Sub Check_WorkBookModule_Contents() 

Const PROC_NAME = "ThisWorkbook" 

Dim VBProj As VBIDE.VBProject 
Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 
Dim i As Long, j As Long, SubLinesCount As Long 
Dim ModuleCodeLinesCount As Long 

Set VBProj = ActiveWorkbook.VBProject 

' loop through all modules, worksheets and other objects in VB Project 
For Each VBComp In VBProj.VBComponents 
    Set CodeMod = VBComp.CodeModule    
    Debug.Print CodeMod.Name ' <-- for debug 

    If CodeMod.Name Like PROC_NAME Then ' <-- check if module name is "ThisWorkbook" 
     ' if total of code lines in "ThisWorkbook" module is empty 
     If CodeMod.CountOfLines = 0 Then 
      MsgBox CodeMod.Name & " module is empty" 
      Exit Sub 
     End If     
     SubLinesCount = 0 ' reset counter 

     ' loop through all code lines inside current module 
     For i = 1 To CodeMod.CountOfLines 
      If Len(CodeMod.Lines(i, 1)) > 0 Then 
       ' if the name of current sub is found within the current code line 
       If CodeMod.Lines(i, 1) Like "*Workbook_Open*" Then 

        For j = i + 1 To CodeMod.CountOfLines 
         If Len(CodeMod.Lines(j, 1)) > 0 And Not CodeMod.Lines(j, 1) Like "End Sub*" Then 
          SubLinesCount = SubLinesCount + 1 
         End If 
        Next j 

        If SubLinesCount > 0 Then 
         MsgBox CodeMod & " module, has an event of 'Workbook_Open' , with total of " & SubLinesCount & " lines of code" 
         Exit Sub 
        Else 
         MsgBox CodeMod & " module, has an event of 'Workbook_Open' , but it's empty !" 
         Exit Sub 
        End If 

       End If 
      End If 
     Next i 
    End If 
Next VBComp 

End Sub 

ステップ1:VBプロジェクトのモジュールにアクセスするためには、あなたは以下の2つの手順を実行する必要があります」 VBAプロジェクトオブジェクトモデルへの信頼アクセス ""、開発者>>マクロセキュリティ>>に移動し、VをTに追加しますVBAプロジェクトオブジェクトモデルへの錆のあるアクセス。

ステップ2

関連する問題