0 Replies Latest reply on Jul 22, 2013 9:31 AM by Joshua Temple

    Macro-Sub to look into the cutlist

    Joshua Temple

      I'm exporting the mass properties from SW into Excel using a macro.  I've recently run into the issue where the model builders are using cutlists rather than just individual parts.  My macro is able to get the mass properties for the sum of the cutlist, but I need it to break it down into each individual piece and am at a lost on how to do it.

       

       

      Any help would be appreciated.  Here is the code.  Others are welcome to it if they need to simply export the mass properties of an assembly to excel.  Note: everything except the assembly you want infomation for must be suppressed.

       

      *************************************************

       

      Option Explicit
      Public xlApp As Excel.Application
      Public xlWorkBooks As Excel.Workbooks
      Public xlBook As Excel.Workbook
      Public xlsheet As Excel.Worksheet
      Public OutputPath As String
      Public OutputFN As String
      Public xlCurRow As Integer

       

      Sub main()

      Call SwExtractData
      'Call CondenseData

      'saves, and quits excel
      'xlBook.Save
      'xlWorkBooks.Close
      'xlApp.Quit

      End Sub


      'This subroutine opens excel, and populates the worksheet with various data from the respective parts
      Sub SwExtractData()

      Dim swApp As ISldWorks
      Dim swModel As IModelDoc2
      Dim swModExt As IModelDocExtension
      Dim swAssembly As IAssemblyDoc
      Dim swComp As IComponent2
      Dim MassProp As IMassProperty
      Dim Component As Variant
      Dim Components As Variant
      Dim Bodies As Variant
      Dim BodyInfo As Variant
      Dim CenOfM As Variant
      Dim RetBool As Boolean
      Dim RetVal As Long
      Dim swFeat As IFeature
      Dim Description As String
      Dim path As String 'Used to get and edit the part name
      Dim Name As String 'Used to get name of non-MPN parts
      Dim refConf As String 'Gets the referenced configuration name
      Dim extensionLen As Integer 'Used in editing name of parts
      Dim Name2 As String 'Used to get name of MPN parts


      'Get active drawing view
      Set swApp = Application.SldWorks
      Set swModel = swApp.ActiveDoc

      'Checks to see if various preconditions are met in order for the macro to run
      If swModel Is Nothing Then
              swApp.SendMsgToUser2 "An assembly must be an active document.", swMbWarning, swMbOk
             Exit Sub
             End If
                          
      If swModel.GetType <> swDocASSEMBLY Then
              swApp.SendMsgToUser2 "An assembly must be an active document.", swMbWarning, swMbOk
              Exit Sub
      Else
          Set swAssembly = swModel

      End If

       

      Set swModExt = swModel.Extension
      Set MassProp = swModExt.CreateMassProperty


      'Open Excel
      OutputPath = Environ("USERPROFILE") & "\Desktop\"
      OutputFN = swModel.GetTitle & ".xlsx"

      Set xlApp = Excel.Application
      xlApp.Visible = True
      Set xlWorkBooks = Excel.Workbooks
      Set xlBook = xlWorkBooks.Add()
      Set xlsheet = xlBook.Worksheets("Sheet1")
      Sheets("Sheet2").Name = "A -Title"


      'Populate Excel Spreadsheet Titles
      xlsheet.Range("A1").value = "Type"
      xlsheet.Range("B1").value = "Item"
      xlsheet.Range("C1").value = "Part"
      xlsheet.Range("D1").value = "Drawing No."
      xlsheet.Range("E1").value = "E/C/A"
      xlsheet.Range("F1").value = "Description"
      xlsheet.Range("G1").value = "Material"
      xlsheet.Range("H1").value = "Qty"
      xlsheet.Range("I1").value = "Unit Weight (kg) "
      xlsheet.Range("J1").value = "Total Weight (kg)"
      xlsheet.Range("K1").value = "Removal"
      xlsheet.Range("L1").value = "VCG (m)"
      xlsheet.Range("M1").value = "V Moment (kg-m) "
      xlsheet.Range("N1").value = "LCG  (m)"
      xlsheet.Range("O1").value = "L Moment (kg-m)"
      xlsheet.Range("P1").value = "TCG (m)"
      xlsheet.Range("Q1").value = "T Moment (kg-m)"
      xlsheet.Range("R1").value = "P/S"

      'Highlights columns
      Worksheets("sheet1").Range("C:C").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("E:E").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("G:G").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("J:J").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("L:L").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("N:N").Interior.Color = RGB(216, 216, 216)
      Worksheets("sheet1").Range("P:P").Interior.Color = RGB(216, 216, 216)


      'Highlights title row
      ActiveSheet.Rows("1").Interior.Color = RGB(155, 187, 89)

      'Freezes top title row
      With ActiveWindow
              .SplitColumn = 0
              .SplitRow = 1
          End With
          ActiveWindow.FreezePanes = True

      'Set current row to 2
      xlCurRow = 2

      'RetVal = swAssembly.ResolveAllLightWeightComponents(False)
      Components = swAssembly.GetComponents(0)


      'On Error Resume Next

      'Loop that populates excel spreadsheet
      For Each Component In Components
          Set swComp = Component
        
              If swComp.GetSuppression <> 0 And Not swComp.IsHidden(False) Then
            
                  Bodies = swComp.GetBodies2(0)
                  RetBool = MassProp.AddBodies(Bodies)
                  CenOfM = MassProp.CenterOfMass
                  path = swComp.GetPathName  'Grabs whole path name of part to later be edited
                  extensionLen = Len(".sldxxx") 'Used to get the part name (meant to exclude the part extension from name
                  Name = Mid(path, InStrRev(path, "\") + 1, Len(path) - InStrRev(path, "\") - extensionLen)
                  refConf = Mid(swComp.ReferencedConfiguration, 1, 4)  'Used to get the referenced configuration name
                
             
                  'Logic that determines if "MPN" is in the part name, and if so it adds the referenced configuration to the end
                  If InStr(Name, "MPN") Then
                          Name2 = Name + refConf
                      Else: Name2 = Name
                  End If
                 
                 
                  'Logic to see if each of the different MPN numbers are in string, and if so it deletes them
                  If InStr(Name, "-MPN01") Then
                          Name2 = Replace(Name, "-MPN01", "") + refConf
                      ElseIf InStr(Name, "-MPN02") Then
                          Name2 = Replace(Name, "-MPN02", "") + refConf
                      ElseIf InStr(Name, "-MPN03") Then
                          Name2 = Replace(Name, "-MPN03", "") + refConf
                      ElseIf InStr(Name, "-MPN04") Then
                          Name2 = Replace(Name, "-MPN04", "") + refConf
                  End If
                 
                  'Logic to determine if ICD is in part name, and if so, highlights it (so that way we know to disregard this in spreadsheet)
                  If InStr(swComp.GetPathName, "ICD") Then
                      ActiveSheet.Rows(xlCurRow).Interior.Color = RGB(255, 255, 153)
                  End If
                 

              'Tests to see if last three (lowercase) letters in file name are asm or prt
                  If LCase(Right(swComp.GetPathName, 3)) = "asm" Then
                          xlsheet.Range("A" & xlCurRow).value = "Assembly"
                      ElseIf LCase(Right(swComp.GetPathName, 3)) = "prt" Then
                          xlsheet.Range("A" & xlCurRow).value = "Part"
                      Else
                          xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT"
                  End If 'Right 3 of file extension
                 
                  'Highlights row is "error in mass props is found"
                  If xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                      ActiveSheet.Rows(xlCurRow).Interior.Color = RGB(217, 151, 149)
                  End If
                
                
              'Tests to see if last three (uppercase) letters in file name are asm or prt
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Then
                          xlsheet.Range("A" & xlCurRow).value = "Assembly"
                      ElseIf UCase(Right(swComp.GetPathName, 3)) = "PRT" Then
                          xlsheet.Range("A" & xlCurRow).value = "Part"
                      Else
                          xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT"
                  End If 'Right 3 of file extension
                 
                  xlsheet.Range("C" & xlCurRow).value = Name2
                  xlsheet.Range("D" & xlCurRow).value = "='A -Title'!$Q$5 "
                  'xlsheet.Range("E" & xlCurRow).valbecue = E/C/A
                  xlsheet.Range("F" & xlCurRow).value = GetRefConfigProps(swComp, "Description")
                 
              'This If statement is meant to get the default description if if couldn't get an referenced configuration description
                  If xlsheet.Range("F" & xlCurRow).value = "" Then
                      xlsheet.Range("F" & xlCurRow).value = GetDefaultPartProps(swComp, "Description")
                  End If
                 
                  xlsheet.Range("G" & xlCurRow).value = GetDefaultPartProps(swComp, "Material")
                  xlsheet.Range("H" & xlCurRow).value = 1 'Qty of 1 which is what we're currently using for the parts we get
                 
              'Doesn't get data for current row if it is an assembly (as assembly data is inaccurate)
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Or xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                          xlsheet.Range("I" & xlCurRow) = ""
                      Else: xlsheet.Range("I" & xlCurRow).value = MassProp.Mass
                  End If
                 
              'Doesn't get data for current row if it is an assembly (as assembly data is inaccurate)
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Or xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                          xlsheet.Range("J" & xlCurRow) = ""
                      Else: xlsheet.Range("J" & xlCurRow).value = xlsheet.Range("H" & xlCurRow).value * xlsheet.Range("I" & xlCurRow).value     '(Mass * Qty).
                  End If
                 
                  xlsheet.Range("K" & xlCurRow).value = ""    'Nothing here for removal
                 
              'Doesn't get data for current row if it is an assembly (as assembly data is inaccurate)
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Or xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                          xlsheet.Range("L" & xlCurRow) = ""
                      Else: xlsheet.Range("L" & xlCurRow).value = CenOfM(1) 'VCG
                  End If
                 
                  xlsheet.Range("M" & xlCurRow).value = (xlsheet.Range("J" & xlCurRow).value + xlsheet.Range("K" & xlCurRow).value) * xlsheet.Range("L" & xlCurRow).value     '(Total mass + Removal) * VCG
                 
              'Doesn't get data for current row if it is an assembly (as assembly data is inaccurate)
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Or xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                          xlsheet.Range("N" & xlCurRow) = ""
                      Else: xlsheet.Range("N" & xlCurRow).value = CenOfM(2)   'LCG
                  End If
                 
                 
                  'PLACEHOLDER FOR LCG SIGN (N)
                  xlsheet.Range("O" & xlCurRow).value = (xlsheet.Range("J" & xlCurRow).value + xlsheet.Range("K" & xlCurRow).value) * xlsheet.Range("N" & xlCurRow).value     '(Total mass + Removal)  * LCG
                 
              'Doesn't get data for current row if it is an assembly (as assembly data is inaccurate)
                  If UCase(Right(swComp.GetPathName, 3)) = "ASM" Or xlsheet.Range("A" & xlCurRow).value = "ERROR IN MASS PROPS OUTPUT" Then
                          xlsheet.Range("P" & xlCurRow) = ""
                      Else: xlsheet.Range("P" & xlCurRow).value = -(CenOfM(0)) 'TCG
                  End If
                 
                  xlsheet.Range("Q" & xlCurRow).value = (xlsheet.Range("J" & xlCurRow).value + xlsheet.Range("K" & xlCurRow).value) * xlsheet.Range("P" & xlCurRow).value     '(Total mass + Removal)  * TCG
                  'PLACEHOLDER FOR P/S (TCG Sign)
                  'xlsheet.Range("S" & xlCurRow).value = EFF
                  'xlsheet.Range("T" & xlCurRow).value = SWBS CODE
              
                 
              'Checks sign of TCG and outputs based on negative or positive value
                  If xlsheet.Range("P" & xlCurRow).value < 0 Then
                          xlsheet.Range("R" & xlCurRow).value = "S"
                      ElseIf xlsheet.Range("P" & xlCurRow).value > 0 Then
                          xlsheet.Range("R" & xlCurRow).value = "P"
                  End If


              'If current row is an assembly, the row is highlighted
                  If xlsheet.Range("A" & xlCurRow).value = "Assembly" Then
                      ActiveSheet.Rows(xlCurRow).Interior.Color = RGB(149, 179, 215)
                  End If
                   
          xlCurRow = xlCurRow + 1
                 
          End If
          
      Next Component


      'This portion of the code creates the totals section

      xlsheet.Range("F" & xlCurRow + 3).value = "Hardware Allowance"
      xlsheet.Range("F" & xlCurRow + 5).value = "Stbd Assembly"
      xlsheet.Range("F" & xlCurRow + 6).value = "Port Assembly"
      xlsheet.Range("F" & xlCurRow + 7).value = "Welding Allowance Stbd"
      xlsheet.Range("F" & xlCurRow + 8).value = "Welding Allowance Port"
      xlsheet.Range("F" & xlCurRow + 10).value = "Total Calculated Weight Addition"
      xlsheet.Range("F" & xlCurRow + 11).value = "Total Calculated Weight Removal"
      xlsheet.Range("F" & xlCurRow + 12).value = "Weight and Moment Summary"

      'Provides total for weight
      xlsheet.Range("J" & (xlCurRow + 5)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "P" & Chr(34) & ", J2:J" & xlCurRow & ")" 'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "S", xlsheet.Range("I2", "I" & xlCurRow))
      xlsheet.Range("J" & (xlCurRow + 6)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "S" & Chr(34) & ", J2:J" & xlCurRow & ")"  'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "P", xlsheet.Range("I2", "I" & xlCurRow))


      'Provides total for V moment
      xlsheet.Range("M" & (xlCurRow + 5)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "P" & Chr(34) & ", M2:M" & xlCurRow & ")" 'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "S", xlsheet.Range("L2", "L" & xlCurRow))
      xlsheet.Range("M" & (xlCurRow + 6)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "S" & Chr(34) & ", M2:M" & xlCurRow & ")" 'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "P", xlsheet.Range("L2", "L" & xlCurRow))


      'Provides total for VCG
      xlsheet.Range("L" & (xlCurRow + 5)).value = "=J" & (xlCurRow + 5) & "/M" & (xlCurRow + 5) 'xlsheet.Range("I" & (xlCurRow + 4)).value / xlsheet.Range("L" & (xlCurRow + 5)).value
      xlsheet.Range("L" & (xlCurRow + 6)).value = "=J" & (xlCurRow + 6) & "/M" & (xlCurRow + 6) 'xlsheet.Range("I" & (xlCurRow + 5)).value / xlsheet.Range("L" & (xlCurRow + 6)).value


      'Provides total for L moment
      xlsheet.Range("O" & (xlCurRow + 5)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "P" & Chr(34) & ", O2:O" & xlCurRow & ")" ' xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "S", xlsheet.Range("O2", "O" & xlCurRow))
      xlsheet.Range("O" & (xlCurRow + 6)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "S" & Chr(34) & ", O2:O" & xlCurRow & ")" ' xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "P", xlsheet.Range("O2", "O" & xlCurRow))


      'Provides total for LCG
      xlsheet.Range("N" & (xlCurRow + 5)).value = "=J" & (xlCurRow + 5) & "/O" & (xlCurRow + 5) 'xlsheet.Range("I" & (xlCurRow + 4)).value / xlsheet.Range("O" & (xlCurRow + 5)).value
      xlsheet.Range("N" & (xlCurRow + 6)).value = "=J" & (xlCurRow + 6) & "/O" & (xlCurRow + 6) 'xlsheet.Range("I" & (xlCurRow + 5)).value / xlsheet.Range("O" & (xlCurRow + 6)).value


      'Provides total for T moment
      xlsheet.Range("Q" & (xlCurRow + 5)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "P" & Chr(34) & ", Q2:Q" & xlCurRow & ")" 'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "S", xlsheet.Range("Q2", "Q" & xlCurRow))
      xlsheet.Range("Q" & (xlCurRow + 6)).value = "=SUMIF(R2:R" & xlCurRow & "," & Chr(34) & "S" & Chr(34) & ", Q2:Q" & xlCurRow & ")" 'xlApp.WorksheetFunction.SumIf(xlsheet.Range("R2", "R" & xlCurRow), "P", xlsheet.Range("Q2", "Q" & xlCurRow))


      'Provides total for TCG
      xlsheet.Range("P" & (xlCurRow + 5)).value = "=J" & (xlCurRow + 5) & "/Q" & (xlCurRow + 5) 'xlsheet.Range("I" & (xlCurRow + 4)).value / xlsheet.Range("Q" & (xlCurRow + 5)).value
      xlsheet.Range("P" & (xlCurRow + 6)).value = "=J" & (xlCurRow + 6) & "/Q" & (xlCurRow + 6) 'xlsheet.Range("I" & (xlCurRow + 5)).value / xlsheet.Range("Q" & (xlCurRow + 6)).value


      'Total TCG Sign
      If xlsheet.Range("P" & xlCurRow + 5).value < 0 Then
              xlsheet.Range("R" & xlCurRow + 5).value = "S"
          ElseIf xlsheet.Range("P" & xlCurRow + 5).value > 0 Then
              xlsheet.Range("R" & xlCurRow + 5).value = "P"
      End If
                 
                 
      If xlsheet.Range("P" & xlCurRow + 6).value < 0 Then
              xlsheet.Range("R" & xlCurRow + 6).value = "S"
          ElseIf xlsheet.Range("P" & xlCurRow + 6).value > 0 Then
              xlsheet.Range("R" & xlCurRow + 6).value = "P"
      End If

      'Hardware allowance calculation
      xlsheet.Range("J" & xlCurRow + 3).value = "=H" & (xlCurRow + 3) & "*sum(J2:J" & xlCurRow & ")"

      'Welding Allowance Stbd and Port calculation
      xlsheet.Range("J" & xlCurRow + 7).value = "=H" & (xlCurRow + 7) & "*sumif(R2:R" & xlCurRow & "," & Chr(34) & "S" & Chr(34) & ",J2:J" & xlCurRow & ")" 'Note, Chr(34) used here because can't put double quotes within string, so it's used as a workaround
      xlsheet.Range("J" & xlCurRow + 8).value = "=H" & (xlCurRow + 8) & "*sumif(R2:R" & xlCurRow & "," & Chr(34) & "P" & Chr(34) & ",J2:J" & xlCurRow & ")"

      'V Moment for welding allowance
      xlsheet.Range("M" & xlCurRow + 7).value = "=M" & (xlCurRow + 5) & "*H" & (xlCurRow + 7)
      xlsheet.Range("M" & xlCurRow + 8).value = "=M" & (xlCurRow + 6) & "*H" & (xlCurRow + 8)

      'VCG for welding allowance
      xlsheet.Range("L" & xlCurRow + 7).value = "=M" & (xlCurRow + 7) & "/J" & (xlCurRow + 7)
      xlsheet.Range("L" & xlCurRow + 8).value = "=M" & (xlCurRow + 8) & "/J" & (xlCurRow + 8)

      'L Moment for welding allowance
      xlsheet.Range("O" & xlCurRow + 7).value = "=O" & (xlCurRow + 5) & "*H" & (xlCurRow + 7)
      xlsheet.Range("O" & xlCurRow + 8).value = "=O" & (xlCurRow + 6) & "*H" & (xlCurRow + 8)

      'LCG for welding allowance
      xlsheet.Range("N" & xlCurRow + 7).value = "=O" & (xlCurRow + 7) & "/J" & (xlCurRow + 7)
      xlsheet.Range("N" & xlCurRow + 8).value = "=O" & (xlCurRow + 8) & "/J" & (xlCurRow + 8)

      'T Moment for welding allowance
      xlsheet.Range("Q" & xlCurRow + 7).value = "=Q" & (xlCurRow + 5) & "*H" & (xlCurRow + 7)
      xlsheet.Range("Q" & xlCurRow + 8).value = "=Q" & (xlCurRow + 6) & "*H" & (xlCurRow + 8)

      'TCG for welding allowance
      xlsheet.Range("P" & xlCurRow + 7).value = "=Q" & (xlCurRow + 7) & "/J" & (xlCurRow + 7)
      xlsheet.Range("P" & xlCurRow + 8).value = "=Q" & (xlCurRow + 8) & "/J" & (xlCurRow + 8)


      'Grand Total calculations

      'Total weight
      xlsheet.Range("J" & xlCurRow + 10).value = "=sum(J" & (xlCurRow + 3) & ":J" & (xlCurRow + 8)

      'Removal
      xlsheet.Range("K" & xlCurRow + 11).value = "=sum(K" & (xlCurRow + 3) & ":K" & (xlCurRow + 8)

      'Grand total weight (taking into account removal)
      xlsheet.Range("J" & xlCurRow + 12).value = "=J" & (xlCurRow + 10) & "+K" & (xlCurRow + 11)

      'xlsheet.Range("J" & xlCurRow + 12).value = "=sum(J" & (xlCurRow + 11) & ":J" & (xlCurRow + 7) & ")"

      'V Moment
      xlsheet.Range("M" & xlCurRow + 12).value = "=sum(M" & (xlCurRow + 3) & ":M" & (xlCurRow + 11) & ")"

      'VCG
      xlsheet.Range("L" & xlCurRow + 12).value = "=M" & (xlCurRow + 12) & "/J" & (xlCurRow + 12)

      'L Moment
      xlsheet.Range("O" & xlCurRow + 12).value = "=sum(O" & (xlCurRow + 3) & ":O" & (xlCurRow + 11) & ")"

      'LCG
      xlsheet.Range("N" & xlCurRow + 12).value = "=O" & (xlCurRow + 12) & "/J" & (xlCurRow + 12)
             
      'T Moment
      xlsheet.Range("Q" & xlCurRow + 12).value = "=sum(Q" & (xlCurRow + 3) & ":Q" & (xlCurRow + 11) & ")"

      'TCG
      xlsheet.Range("P" & xlCurRow + 12).value = "=Q" & (xlCurRow + 12) & "/J" & (xlCurRow + 12)

      'P/S
      If xlsheet.Range("P" & xlCurRow + 12).value < 0 Then
              xlsheet.Range("R" & xlCurRow + 12).value = "S"
          ElseIf xlsheet.Range("P" & xlCurRow + 12).value > 0 Then
              xlsheet.Range("R" & xlCurRow + 12).value = "P"
      End If

      xlsheet.UsedRange.EntireColumn.AutoFit

       

      'Checks type column to see if "ERROR IN MASS PROPS" appears, and if it does, warns user
      'If xlsheet.Range("A1", "A" & xlCurRow).value = "Part" Then '"ERROR IN MASS PROPS OUTPUT" Then
          'MsgBox ("Warning, ERROR IN MASS PROPS OUTPUT detected in output. Please refer to that section in the Read-Me for instructions on how to fix the issue.")
      'End If

      End Sub


      'This function is used to get access to the custom property manager in order to get the part description, number, etc. to be used in the subroutine SwExtractData

      Private Function GetDefaultPartProps(swComp As Component2, swProp As String) As String
          Dim myDoc As ModelDoc2
          Dim sa As Variant
          Dim i As Integer
          Dim myVal As String
          Dim myValOut As String
          Dim myMgr As ICustomPropertyManager
          Dim retB As Boolean
          Dim refConfigName As String

          refConfigName = swComp.ReferencedConfiguration
          Set myDoc = swComp.GetModelDoc2
          If myDoc Is Nothing Then Exit Function 'This will happen if you load your assembly lightweight
          Set myMgr = myDoc.Extension.CustomPropertyManager(refConfigName)
          GetDefaultPartProps = ""
          sa = myMgr.GetNames
          If IsEmpty(sa) Then Exit Function
          For i = 0 To UBound(sa)
              If sa(i) = swProp Then
                  retB = myMgr.Get4(sa(i), False, myVal, myValOut)
                  
                  GetDefaultPartProps = myValOut
                  Exit Function
              End If
          Next
      End Function

      'This function is used in conjunction with the function GetCustomProperty. GetRefConfigProps gets the referenced configuration description, while
          'GetDefaultPartProps gets the default part description
         
      Private Function GetRefConfigProps(swComp As Component2, swProp As String) As String
          Dim myDoc As ModelDoc2
          Dim sa As Variant
          Dim i As Integer
          Dim myVal As String
          Dim myValOut As String
          Dim myMgr As ICustomPropertyManager
          Dim retB As Boolean
          Dim refConfigName As String

          refConfigName = swComp.ReferencedConfiguration
          Set myDoc = swComp.GetModelDoc2
          If myDoc Is Nothing Then Exit Function 'This will happen if you load your assembly lightweight
          Set myMgr = myDoc.Extension.CustomPropertyManager("")
          GetRefConfigProps = ""
          sa = myMgr.GetNames
          If IsEmpty(sa) Then Exit Function
          For i = 0 To UBound(sa)
              If sa(i) = swProp Then
                  retB = myMgr.Get4(sa(i), False, myVal, myValOut)
                  
                  GetRefConfigProps = myValOut
                  Exit Function
              End If
          Next
      End Function

      'This subroutine will condense the data by assembly and then type, and sum various data for the respective types
      'Sub CondenseData()

      'End Sub

       

      **********************************************************