I found the original macro online, and I expanded upon it quite a bit. It takes a drawing BOM and saves it out as a CSV file, which is then converted to an Excel file.
My Problem: If the description, or another column in my BOM has a comma in it, that throws off the CSV file, and I get an extra column when I open it in Excel. I get the BOM through GetTableAnnotations. My thought was to try and loop through the annotations and replace a comma with nothing for each cell string, but I cant' figure out how to navigate through annotations. Can someone please help me with this loop?
Sub Export_BOM_As_Excel_Main()
On Error Resume Next
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swTableAnn As SldWorks.TableAnnotation
Dim swBomFeature As SldWorks.BomFeature
Dim swAnn As SldWorks.Annotation
Dim ActiveDocumentPath As String
Dim vTableArr As Variant
Dim vTable As Variant
Dim retval As Boolean
Dim CSVFile As String
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim ValOut As String
Dim DwgRev As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swSelMgr = swModel.SelectionManager
Set swCustPropMgr = swModel.Extension.CustomPropertyManager("")
ActiveDocumentPath = swModel.GetPathName ' get filename for evaluation
If swModel Is Nothing Then ' checks to see if something is open
MsgBox "No Drawing Loaded!", vbCritical, "Drawing Load Error"
Exit Sub
ElseIf swModel.GetType <> 3 Then ' checks to make sure drawing is open
MsgBox "Current Document Is Not A Drawing!", vbCritical, "Drawing Macro Only!"
Exit Sub
ElseIf ActiveDocumentPath = "" Then ' check to make sure drawing has been saved
MsgBox "Save Drawing First!", vbCritical, "Save Document Error"
Exit Sub
End If
swCustPropMgr.Get5 "REVISION", True, ValOut, DwgRev, False ' get revision of drawing
TraverseFeatureTree ' traverse tree and select BOM
Set swBomFeature = swSelMgr.GetSelectedObject5(1) ' Make sure a BOM is selected in the feature manager design tree
If swBomFeature Is Nothing Then Exit Sub
vTableArr = swBomFeature.GetTableAnnotations
For Each vTable In vTableArr
Set swTableAnn = vTable ' Got BOM as table annotation
Next vTable
CSVFile = "C:\" & Left(swModel.GetTitle, InStrRev(swModel.GetTitle, " Sheet") - 3) & "_" & DwgRev & ".csv" ' Rename BOM with Rev and .csv file extension
' Save csv file. If you save it as an xlsx file and try to open it in Excel and it will tell you that it is an text file.
' This way it actually saves as a csv file and no message box will pop up
retval = swTableAnn.SaveAsText(CSVFile, ",")
Dim FileToKill As String
FileToKill = Left(CSVFile, Len(CSVFile) - 3) & "xlsx" ' existing excel file
If Dir(FileToKill) <> "" Then Kill FileToKill ' delete if exists
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
Set xlWB = xlApp.Workbooks.Open(CSVFile) ' Open the CSV file
With xlWB.ActiveSheet
.Range("A1").Value = "REV" ' rename header
.Cells.EntireColumn.AutoFit ' fit column width
End With
xlWB.SaveAs Left(CSVFile, Len(CSVFile) - 3) & "xlsx", 51 ' and save as xlsx
xlApp.Quit
Kill CSVFile ' Get rid of .csv file
End Sub
Sub TraverseFeatureTree() ' You could even add arguments
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeature As SldWorks.Feature
Dim ModelDocType As Long
Dim FeatureName As String
Set swApp = Application.SldWorks ' Connect to SW
Set swModel = swApp.ActiveDoc ' Get active document
swModel.ClearSelection ' Clear any selection
ModelDocType = swModel.GetType ' Get document type
Set swFeature = swModel.FirstFeature ' Get first feature in feature tree
While Not swFeature Is Nothing
FeatureName = swFeature.Name
If InStr(UCase(FeatureName), "EXCLUDE") Then ' bom excluded for hose kits
'do nothing
Else
If InStr(UCase(FeatureName), "BILL OF MATERIALS") Then
swFeature.Select True ' Select the BOM
Exit Sub
End If
End If
Set swFeature = swFeature.GetNextFeature ' Get next feature
Wend
End Sub
SolidworksApi/macros