VBA macro to import STEP files and save as SolidWorks files using a subfolder with the same name
Author: Eddy Alleman
Suppose we have hundreds of STEP files, all in the same folder from our supplier.
We want to build a library out of them to reuse again and again in our designs.
To keep the files well separated one from another, we want each STEP file exported in a separate folder per type.
Solidworks has a tool for this: Task scheduler
But all step files will end up in the same folder, unless we put the STEP files in separate folders first and then the exported Solidworks files to those subfolders.
This is a lot of manual work.
Also we don't know for sure if there are duplicate files and if those files have different level of detail.
We want to be able to choose the best ones after importing and not just overwrite already processed ones.
So how can we automate this and avoid making all those subfolders manually?
Batch+ with simple macro
Batch+ is a free tool, that is part of CAD+ and it handles a lot of the peculiarities when batch processing files.
We will choose this option because of the easy setup and full control over the process.
There is a SolidWorks problem with the temporary STEP file which does not fire the DestroyNotify when it is closed. As a workaround we use Limit Batch Size = 1.
The following macro determines if the step is an assembly or a part file.
If it is an assembly then the components will be saved as separate part files (depending on system options, see image above).
The macro creates a subfolder in the same location as and with the same name as the step file.
This helps in separating the files that belong together from other imports.
If you don't put them in a new folder every time, you could get the same file twice
and the last save overwrites the previous ones. Be sure that they are the same in that case.
(1) make sure you don't have system option set to:
Prompt user to select document template
Use instead : "Always use these default document templates"
Otherwise SolidWorks keeps asking to select a document template.
(2) Set system options > import > Enable 3D interconnect OFF
Documentation about 3D interconnect :
Insert proprietary CAD data directly into a SOLIDWORKS assembly without converting it to a SOLIDWORKS file.
And converting is exactly what we want. 3D interconnect just makes a link to the STEP file and updates if needed.
'Overwrites if solidworks files already exist in case they have been processed before.
Const OVERWRITE As Boolean = False
'set the path you want to save to
Const DESTINATION_PATH As String = "C:\temp"
'Uncomment the following line if you want to debug into this code during running Batch+
On Error GoTo catch_
'test if DESTINATION PATH exists
If FolderExists(DESTINATION_PATH) Then
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
'You have to open a step file first, without saving it if you want to test without Batch+
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
If Not swModel Is Nothing Then
'--- Get file name without extension and path
'only get the document name (which is displayed in the title bar of SolidWorks)
Dim swxFilenaam As String
swxFilenaam = swModel.GetTitle
'--- Get file extension
'Determine if the step file was an assembly or a part file to set the file extension correctly
Dim Extension As String
Select Case swModel.GetType
Extension = ".SLDPRT"
Extension = ".SLDASM"
'--- Get path
Dim newPath As String
newPath = DESTINATION_PATH
'Add the name of the subfolder
Dim subfoldername As String
subfoldername = "\" + swxFilenaam + "\"
newPath = DESTINATION_PATH + subfoldername
'--- if folder doesn't exist already create it
'--- Create the name of the file to save to
swxFilenaam = newPath + swxFilenaam + Extension
'--- if swxFilenaam exists already and OVERWRITE = False
If FileExists(swxFilenaam) And OVERWRITE = False Then
' make sure nothing is selected, otherwise only selected entities are saved
'--- save the step file
Dim lErrors As Long
Dim lWarnings As Long
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SaveAs(swxFilenaam, 0, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, lErrors, lWarnings)
'swApp.CloseDoc (swxFilenaam)'don't use it , let Batch+ handle it
End If 'File exists already
MsgBox "No document open"
End If 'swModel Nothing
MsgBox DESTINATION_PATH + "doesn't exist"
End If 'DESTINATION_PATH exists
Debug.Print "Error: " & Err.Number & ":" & Err.source & ":" & Err.Description
Debug.Print "FINISHED MACRO ImportStep"
Function CreateFolderIfNotExisting(newPath As String)
If FolderExists(newPath) Then
Debug.Print "Path created : " + newPath
Function FolderExists(newPath As String) As Boolean
If Dir(newPath, vbDirectory) = "" Then
Debug.Print "Path doesn't exist : " + newPath
FolderExists = False
Debug.Print "Path exists : " + newPath
FolderExists = True
Function FileExists(newPath As String) As Boolean
If Dir(newPath) = "" Then
Debug.Print "File doesn't exist : " + newPath
FileExists = False
Debug.Print "File exists : " + newPath
FileExists = True