Find tables from drawing by type using SOLIDWORKS API
{ width=250 }
This examples allows to find all tables by specified type from the active drawing document using SOLIDWORKS API.
It is required to specify the array of types using the Array function, where each value represents the type of the table (BOM, general, cut-list, revision, title block etc.) as defined in swTableAnnotationType_e enumeration.
As the result array of pointer to ITableAnnotation SOLIDWORKS API interface is returned and title of each table is output to the immediate window of VBA editor.
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swDraw As SldWorks.DrawingDoc
Set swDraw = swApp.ActiveDoc
If Not swDraw Is Nothing Then
Dim vTables As Variant
vTables = FindTables(swDraw, Array(swTableAnnotationType_e.swTableAnnotation_BillOfMaterials, swTableAnnotationType_e.swTableAnnotation_RevisionBlock))
If Not IsEmpty(vTables) Then
Dim i As Integer
For i = 0 To UBound(vTables)
Dim swTable As SldWorks.TableAnnotation
Set swTable = vTables(i)
Debug.Print swTable.Title
Next
End If
Else
MsgBox "Please open drawing"
End If
End Sub
Function FindTables(draw As SldWorks.DrawingDoc, filter As Variant) As Variant
Dim swTables() As SldWorks.TableAnnotation
Dim isInit As Boolean
isInit = False
Dim vSheets As Variant
vSheets = draw.GetViews()
Dim i As Integer
For i = 0 To UBound(vSheets)
Dim vViews As Variant
vViews = vSheets(i)
Dim swSheetView As SldWorks.View
Set swSheetView = vViews(0)
Dim vTableAnns As Variant
vTableAnns = swSheetView.GetTableAnnotations
If Not IsEmpty(vTableAnns) Then
Dim j As Integer
For j = 0 To UBound(vTableAnns)
Dim swTableAnn As SldWorks.TableAnnotation
Set swTableAnn = vTableAnns(j)
If FilterContains(swTableAnn.Type, filter) Then
If isInit Then
ReDim Preserve swTables(UBound(swTables) + 1)
Else
ReDim swTables(0)
isInit = True
End If
Set swTables(UBound(swTables)) = swTableAnn
End If
Next
End If
Next
FindTables = swTables
End Function
Function FilterContains(val As swTableAnnotationType_e, filter As Variant) As Boolean
Dim i As Integer
For i = 0 To UBound(filter)
If val = filter(i) Then
FilterContains = True
Exit Function
End If
Next
FilterContains = False
End Function