Skip to main content

Generate report for the SOLIDWORKS file versions (created and last saved) for all the files in the folder

SOLIDWORKS file versions report { width=500 }

This VBA macro generates a CSV report (can be opened in Excel) of created and last saved version of SOLIDWORKS file in the specified folder.

This macro will not be opening each model individually which significantly reduces the processing time

Macro input and output parameter can be configured by changing the constants below

Const INPUT_FOLDER_PATH As String = "D:\MyModels" 'full path to the input folder with SOLIDWORKS files
Const OUT_FILE_PATH As String = "D:\sw-file-versions.csv" 'full path to the output CSV file of the report
Const FILES_FILTER As String = "*.sld*" 'Filter for files with the support of wildcards
Const INCLUDE_SUB_FOLDERS As Boolean = True 'True to process sub-folders, False to only process top level files
Const INPUT_FOLDER_PATH As String = "D:\MyModels"
Const OUT_FILE_PATH As String = "D:\sw-file-versions.csv"
Const FILES_FILTER As String = "*.sld*"
Const INCLUDE_SUB_FOLDERS As Boolean = True

Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

Dim vFilePaths As Variant
vFilePaths = GetFiles(INPUT_FOLDER_PATH, INCLUDE_SUB_FOLDERS, FILES_FILTER)

Dim i As Integer

Dim fileNo As Integer
fileNo = FreeFile

Open OUT_FILE_PATH For Output As #fileNo

Print #fileNo, "File Path,Created,Last Saved"

For i = 0 To UBound(vFilePaths)

Dim filePath As String
filePath = vFilePaths(i)
Dim vVers As Variant
vVers = swApp.VersionHistory(filePath)

Dim swCreatedVers As String
Dim swLastSavedVers As String

If Not IsEmpty(vVers) Then
swCreatedVers = ConvertFileVersionToSwMajorVersion(ExtractSwRevisonFromHistoryRecord(CStr(vVers(0))))
swLastSavedVers = ConvertFileVersionToSwMajorVersion(ExtractSwRevisonFromHistoryRecord(CStr(vVers(UBound(vVers)))))
Else
swCreatedVers = "???"
swLastSavedVers = "???"
End If

Print #fileNo, filePath & "," & swCreatedVers & "," & swLastSavedVers

Next

Close #fileNo

End Sub

Function GetFiles(path As String, includeSubFolders As Boolean, Optional filter As String) As Variant

Dim paths() As String
Dim isInit As Boolean

isInit = False

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim folder As Object
Set folder = fso.GetFolder(path)

CollectFilesFromFolder folder, includeSubFolders, filter, paths, isInit

If isInit Then
GetFiles = paths
Else
GetFiles = Empty
End If

End Function

Sub CollectFilesFromFolder(folder As Object, includeSubFolders As Boolean, filter As String, ByRef paths() As String, ByRef isInit As Boolean)

For Each file In folder.files

If LCase(file.path) Like LCase(filter) Then
If Not isInit Then
ReDim paths(0)
isInit = True
Else
ReDim Preserve paths(UBound(paths) + 1)
End If
paths(UBound(paths)) = file.path
End If
Next

If includeSubFolders Then
Dim subFolder As Object
For Each subFolder In folder.SubFolders
CollectFilesFromFolder subFolder, includeSubFolders, filter, paths, isInit
Next
End If

End Sub

Function ExtractSwRevisonFromHistoryRecord(fileVers As String) As String

ExtractSwRevisonFromHistoryRecord = Left(fileVers, InStr(fileVers, "[") - 1)

End Function

Function ConvertFileVersionToSwMajorVersion(versNumber As Integer) As String

Dim swVersMajor As String

If versNumber >= 5000 Then
swVersMajor = 2012 + (versNumber - 5000) / 1000
Else
Select Case versNumber
Case 44
swVersMajor = 95
Case 243
swVersMajor = 96
Case 483
swVersMajor = 97
Case 629
swVersMajor = "97Plus"
Case 822
swVersMajor = 98
Case 1008
swVersMajor = "98Plus"
Case 1137
swVersMajor = 99
Case 1500
swVersMajor = 2000
Case 1750
swVersMajor = 2001
Case 1950
swVersMajor = "2001Plus"
Case 2200
swVersMajor = 2003
Case 2500
swVersMajor = 2004
Case 2800
swVersMajor = 2005
Case 3100
swVersMajor = 2006
Case 3400
swVersMajor = 2007
Case 3800
swVersMajor = 2008
Case 4100
swVersMajor = 2009
Case 4400
swVersMajor = 2010
Case 4700
swVersMajor = 2011
End Select
End If

ConvertFileVersionToSwMajorVersion = "SOLIDWORKS " & swVersMajor

End Function