Good Morning Friends,
I'm trying to create a macro that sorts my BOMs. I found almost exactly what I need from solidworks help, the problem is that solidworks doesn't like one of the actions the help gave me. I've pasted the code given to me below. The problem is in red. Thanks in advance for your help.
-Trevor
'---------------------------------------------------------------------------
' 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 <<<< It doesn't approve of this line, tells me there is a compile error: user defined type not defined.
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