Run VBA macro automatically on document load using SOLIDWORKS API

Edit ArticleEdit Article
More 'Goodies'

This VBA macro handles document load events using SOLIDWORKS API and runs a custom code for each of the documents.

Macro operates in the background and needs to be run once a session to start monitoring.

Both visible (opened in its own window) and invisible (opened as assembly or drawing component) documents are handled.

SOLIDWORKS file open dialog
SOLIDWORKS file open dialog


  • Create new macro
  • Copy the code into corresponding modules of the macro. The VBA macro tree should look similar to the image below:

VBA macro tree
VBA macro tree

  • Place your code into the main sub of the HandlerModule module. The pointer to IModelDoc2 document is passed as the parameter. Use this pointer instead of ISldWorks::ActiveDoc to properly handle invisible documents.
Sub main(model As SldWorks.ModelDoc2)
    'TODO: add your routine here
End Sub

Macro Module

Entry point which starts events monitoring

Dim swFileLoadWatcher As FileLoadWatcher

Sub main()
    Set swFileLoadWatcher = New FileLoadWatcher
    While True
End Sub

FileLoadWatcher Class Module

Class which handles SOLIDWORKS API notifications

Dim WithEvents swApp As SldWorks.SldWorks

Private Sub Class_Initialize()
    Set swApp = Application.SldWorks
End Sub

Private Function swApp_DocumentLoadNotify2(ByVal docTitle As String, ByVal docPath As String) As Long
    Dim swModel As SldWorks.ModelDoc2
    If docPath <> "" Then
        Set swModel = swApp.GetOpenDocumentByName(docPath)
        Dim vDocs As Variant
        vDocs = swApp.GetDocuments
        Dim i As Integer
        For i = 0 To UBound(vDocs)
            Dim swDoc As SldWorks.ModelDoc2
            Set swDoc = vDocs(i)
            If swDoc.GetTitle() = docTitle Then
                Set swModel = swDoc
                Exit For
            End If
    End If
    OnModelLoad swModel
End Function

Sub OnModelLoad(model As SldWorks.ModelDoc2)
    HandlerModule.main model
End Sub

HandlerModule Module

Custom VBA code which needs to be run for each opened document

Sub main(model As SldWorks.ModelDoc2)
    'TODO:implement the procedure
    MsgBox "File Loaded: " & model.GetTitle()
End Sub

Product of Xarial Product of Xarial