Sort Table Example (VBA)
This example shows how to sort bill of materials, hole, general, and weldment cut list tables.
'---------------------------------------------------------------------------
' Preconditions:
' 1. Open a drawing with one of the following tables:
' * General
' * Hole chart
' * Weldment cut list
' * Bill of materials parts-only table that
' contains four columns: Item No, Part Number,
Description, and Qty.
' 2. Click the move-table icon in the upper-left corner
' of the table in the view.
' The PropertyManager opens on the table.
' 3. If the table is a BOM table, ensure that
' PropertyManager > Item Numbers > Follow assembly order
is not selected.
'
' Postconditions:
' 1. Inspect the Immediate Window.
' 2. The tables are sorted as follows:
' * If it is a BOM table:
' * Primary sort is on column three (Qty).
' * Secondary sort is on column one (Part Number).
' * There is no tertiary sort.
' * All column sorts are ascending.
' * Rows are sorted into categories in the
following order:
' 1. Parts
' 2. User-defined
' * If it is a general table, the sort is descending on the
first column.
' * If it is a hole table, the sort is ascending on the Tag
column.
' * If it is a weldment cut list table, the sort is descending
on the third
' column.
' --------------------------------------------------------------------------
Dim swApp As SldWorks.SldWorks
Dim swModDoc As SldWorks.IModelDoc2
Dim swTable As SldWorks.ITableAnnotation
Option Explicit
Public Sub Main()
Set swApp = Application.SldWorks
GetSelTable
SortSelTable
End Sub
Public Sub GetSelTable()
Set swModDoc = swApp.ActiveDoc
Dim swSM As ISelectionMgr
Set swSM = swModDoc.SelectionManager
Set swTable = swSM.GetSelectedObject6(1, -1)
swModDoc.ClearSelection2 (True)
End Sub
Public Sub SortSelTable()
Dim tableType As swTableAnnotationType_e
tableType = swTable.Type
Dim status As Boolean
Select Case tableType
Case
swTableAnnotationType_e.swTableAnnotation_General
status =
SortGeneralTable()
End
Case
swTableAnnotationType_e.swTableAnnotation_HoleChart
status =
SortHoleChartTable()
End
Case
swTableAnnotationType_e.swTableAnnotation_WeldmentCutList
status =
SortWeldmentCutlistTable()
End
Case
swTableAnnotationType_e.swTableAnnotation_BillOfMaterials
status =
SortBOMTable()
End
Case Else
Debug.Print
("Unspecified table type selected.")
End
End Select
End Sub
Public Function SortGeneralTable() As Boolean
Debug.Print ("Table type selected: swTableAnnotation_General")
Dim swSpecTable As IGeneralTableAnnotation
swSpecTable = swTable
Dim status As Boolean
status = swSpecTable.Sort(0, False) 'sort descending
End Function
Public Function SortHoleChartTable() As Boolean
Debug.Print ("Table type selected:
swTableAnnotation_HoleChart")
Dim swSpecTable As IHoleTableAnnotation
Set swSpecTable = swTable
Dim status As Boolean
status = swSpecTable.Sort(0, True) 'sort ascending
End Function
Public Function SortWeldmentCutlistTable() As Boolean
Debug.Print ("Table type selected:
swTableAnnotation_WeldmentCutList")
Dim swSpecTable As IWeldmentCutListAnnotation
Set swSpecTable = swTable
Dim status As Boolean
status = swSpecTable.Sort(2, False) 'sort descending
End Function
Public Function SortBOMTable() As Boolean
Debug.Print ("Table type selected:
swTableAnnotation_BillOfMaterials")
Dim swSpecTable As IBomTableAnnotation
Set swSpecTable = swTable
Dim swSortData As BomTableSortData
Set swSortData = swSpecTable.GetBomTableSortData
' Specify the sort order indexes for three
columns in the table
' Specify the direction of sort for the three sort order
indexes
swSortData.ColumnIndex(0) = 3 ' primary sort
swSortData.Ascending(0) = True ' sort ascending
swSortData.ColumnIndex(1) = 1 ' secondary sort
swSortData.Ascending(1) = True ' sort ascending
swSortData.ColumnIndex(2) = -1 ' no tertiary sort
Dim pos1 As Integer
pos1 = swSortData.ColumnIndex(0)
Debug.Print ("Column for primary sort is " & pos1) ' should
be 3
Dim pos2 As Integer
pos2 = swSortData.ColumnIndex(1)
Debug.Print ("Column for secondary sort is " & pos2) ' should
be 1
Dim pos3 As Integer
pos3 = swSortData.ColumnIndex(2)
Debug.Print ("Column for tertiary sort is " & pos3) ' should
be -1
Dim listGrpArray(2) As Integer
Dim bWantGrp As Boolean
bWantGrp = True
If bWantGrp Then
' Sort rows into part and
user-defined categories
listGrpArray(0) =
swBomTableSortItemGroup_None
listGrpArray(1) =
swBomTableSortItemGroup_Parts
listGrpArray(2) =
swBomTableSortItemGroup_Other
End If
swSortData.ItemGroups =
listGrpArray
' After sorting, do not re-number the
items
swSortData.DoNotChangeItemNumber = True
Dim status As Boolean
status = swSpecTable.Sort(swSortData)
Debug.Print ("BOM table sorted: " & status)
End Function