See more issues and resolutions

Symptoms

SOLIDWORKS macro doesn’t work if it is run from the Tools->Macro->Run menu in SOLIDWORKS.

This may produce error like Run-time Error ‘91’: Object variable or With block variable not set.

'Run-time Error '91': Object variable or With block variable not set when running the macro
'Run-time Error '91': Object variable or With block variable not set when running the macro

Alternatively macro can misbehave or just do not execute any steps. Macro runs correctly if opened in the VBA editor and executed via F5 or by clicking green arrow (run) button from the VBA editor

Cause

When macro starts SOLIDWORKS tries to find the entry point (the subroutine (sub) to execute first). This will be the sub which doesn’t contain any parameters.

If the macro contains multiple such subs this will provide the ambiguity and any sub can be an entry point.

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main() 'this method must be an entry point

    ConnectToSw
    CountFeatures
    
End Sub

Sub ConnectToSw() 'this method could be selected as an entry point
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then
        MsgBox "Please open the model"
        End
    End If
    
End Sub

Sub CountFeatures() 'this method could be selected as an entry point
    
    swApp.SendMsgToUser "There are " & swModel.GetFeatureCount() & " features in the active model"
    
End Sub

The entry sub is critical as it usually contains initialisation routines and if this is not executed in the correct order the macro logic is compromised.

Resolution

  • Always keep one parameterless subroutine (usually called main). Use dummy parameter if necessarily for any other subs which do not require input parameters to prevent the incorrect behaviour. It is possible to pass any value for this parameter as it is not used (i.e. “” or Empty).
Call AnotherProc(Empty) 'calling the sub with empty value
----
Sub AnotherProc(dummy) 'dummy parameter not in use
End Sub
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main() 'this method is the only one without parameters

    ConnectToSw Empty
    CountFeatures Empty
    
End Sub

Sub ConnectToSw(dummy)
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then
        MsgBox "Please open the model"
        End
    End If
    
End Sub

Sub CountFeatures(dummy) 'this method could be selected as an entry point
    
    swApp.SendMsgToUser "There are " & swModel.GetFeatureCount() & " features in the active model"
    
End Sub
  • Assign the macro to the button. In this case it will be required to forcibly select the entry point sub so no ambiguity in case of multiple parameterless subs exist in the macro