Combine identical components command in SOLIDWORKS BOM table
This VBA macro demonstrates how to emulate the Combine identical component command which is missing in SOLIDWORKS API.
Select BOM table to combine identical components. By default, all components are combined, however it is possible to specify the rows to combine by changing the parameters of CombineIdenticalComponents function in the macro.
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
Dim swBomTable As SldWorks.TableAnnotation
Set swBomTable = swModel.SelectionManager.GetSelectedObject6(1, -1)
CombineIdenticalComponents swModel, swBomTable, 1, swBomTable.RowCount - 1
End Sub
Sub CombineIdenticalComponents(model As SldWorks.ModelDoc2, table As SldWorks.BomTableAnnotation, startRowIndex As Integer, entRowIndex As Integer)
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = model.SelectionManager
Dim swSelData As SldWorks.SelectData
Set swSelData = swSelMgr.CreateSelectData
Dim swTableAnnotation As SldWorks.TableAnnotation
Set swTableAnnotation = table
Dim swAnn As SldWorks.Annotation
Set swAnn = swTableAnnotation.GetAnnotation()
swSelData.SetCellRange startRowIndex, entRowIndex, 0, 0
swAnn.Select3 False, swSelData
RunCombineIdenticalComponentsCommand
End Sub
Sub RunCombineIdenticalComponentsCommand(Optional dummy = Empty)
Const WM_COMMAND As Long = &H111
Dim swFrame As SldWorks.Frame
Set swFrame = swApp.Frame
Const CMD_COMBINE_IDENTICAL_COMPONENTS As Long = 24378
SendMessage swFrame.GetHWnd(), WM_COMMAND, CMD_COMBINE_IDENTICAL_COMPONENTS, 0
End Sub