简体   繁体   中英

Check if Private Sub Workbook.open() is empty

I have a user who needs to execute a macro after an Excel file was opened, and who needs to know (programatically) if the current Excel file's Private Sub Workbook.open() routine is empty.

Is there any way to keep this information in memory after the workbook is opened so that if the user needs to run his macro this information is available. Something along a persistent global var would be ideal. But i'm not sure if it's possible.

Thanks!

This code below (inside a regular module) loops through all the VB Project components (including ThisWorkbook module), and checks if the module name is "ThisWorkbook".

Once it finds "ThisWorkbook" module, it checks the total number of code lines inside that module, if it's 0, it raises a MsgBox that it's empty. If it's not, then it checks to see if it can find a "Workbook_Open" string inside the code. If it does, it counts the total number of lines (not empty lines) of code between the "Workbook_Open" line and the closest "End Sub" line.

Check_WorkBookModule_Contents Code

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

Note : In order to access the VB Project Module, you need to follow the 2 steps below:

Step 1 : Add " Trust access to the VBA project object model " , go to Developer >> Macro Security >> then add a V to the Trust access to the VBA project object model.

Step 2 : Add Reference to your VB project, add " Microsoft Visual Basic for Applications Extensibility 5.3 "

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM