跳到主要内容

Run VBA macro automatically on document load using SOLIDWORKS API

{% youtube { id: tgRB8YtB4v4 } %}

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{ width=350 }

Configuration​

  • 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{ width=250 }

  • 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
DoEvents
Wend

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)
Else
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
Next
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