VBA offcut calculation

Cuprian

New Member
Joined
Oct 25, 2021
Messages
20
Office Version
  1. 365
  2. 2016
Platform
  1. Windows
Hi,
Let's say I have this set of data:
1635598121209.png


In colum E I want to display offcut with data from equation "B1 - all length with Nr 1, Nr 2, Nr 3, etc.)
Example:
E3 = B1- B3-B4-B5
E4 = B1- B6-B7-B8 etc.
Any ideas how can I acheive it using VBA?
 
I think I over complicated the heck out of this but try the following:

VBA Code:
Sub Test3()
'
    Dim A_ColumnLoopCounter         As Long, D_ColumnLoopCounter    As Long
    Dim Column_E_Array_Slot         As Long
    Dim CutsArrayColumnCounter      As Long, CutsArrayMaxColumn     As Long, CutsArrayResultsStartColumn As Long
    Dim CutsArrayRowNumber          As Long
    Dim H_Row_Counter               As Long
    Dim LastRowD                    As Long, LastRowInSheet         As Long
    Dim OneDimensionCutsArrayRow    As Long
    Dim UniqueCutsCountStartRow     As Long, UniqueCutsCountEndRow  As Long
    Dim SubtractTotal               As Long
    Dim TableStartRow               As Long
    Dim UniqueItems                 As Long
    Dim CutsDictionary              As Object
    Dim CutsArrayRowString          As String
    Dim DestinationSheet            As String
    Dim MyTableName                 As String, MyTableRange         As String
    Dim StartingValue               As String
    Dim Columns_AB_Array            As Variant, Column_D_Array      As Variant, Column_E_Array      As Variant
    Dim CutMeasurementArray         As Variant
    Dim CutsArray                   As Variant
    Dim d1Arr                       As Variant
    Dim key                         As Variant
    Dim OneDimensionCutsArray       As Variant
    Dim wsDestination               As Worksheet
'
    Set wsDestination = Sheets("Arkusz1")                                               ' <--- Set this to the proper sheet name
    MyTableName = "Tabela3"                                                             ' <--- Set this to your Table Nam
'
    LastRowInSheet = wsDestination.Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row    ' Find last used Row in sheet
    LastRowD = wsDestination.Range("D" & Rows.Count).End(xlUp).Row                      ' Get Last used Row of column D
'
    MyTableRange = "D2:E" & LastRowInSheet                                              ' <--- Set this to the Range of the Table
    TableStartRow = 3                                                                   ' <--- Set this to start row of data in the Table
    StartingValue = wsDestination.Range("B1")                                           ' <--- Set this to the Address of Value that will be subtracted from
'
    Column_E_Array_Slot = 0                                                             ' Initialize slot counter for Column_E_Array
    CutsArrayColumnCounter = 0                                                          ' Initialize CutsArrayColumnCounter
    CutsArrayMaxColumn = 0                                                              ' Initialize CutsArrayMaxColumn
    CutsArrayResultsStartColumn = 9                                                     ' Set start column number to display CutsArray
'
    Set CutsDictionary = CreateObject("Scripting.Dictionary")
'
    On Error Resume Next                                                                ' If Table doesn't exist then ignore error resulting from next line
    wsDestination.ListObjects(MyTableName).Unlist                                       ' Temporarily turn Table back into a Range
    On Error GoTo 0                                                                     ' Resume Excel Error Handling
'
    Columns_AB_Array = wsDestination.Range("A" & TableStartRow & ":B" & LastRowInSheet) ' Load data from A&B columns into 2 dimensional 1 based array RC
    Column_D_Array = wsDestination.Range("D" & TableStartRow & ":D" & LastRowD)         ' Load data from D column into 2 dimensional 1 based array RC
    ReDim Column_E_Array(1 To LastRowD)                                                 ' Set size of Column_E_Array 1 dimensional array 1 based
    ReDim CutsArray(1 To LastRowD, 1 To 50)                                             ' Set CutsArray to a 2 dimensional 1 based oversized array
'
    For D_ColumnLoopCounter = LBound(Column_D_Array) To UBound(Column_D_Array)                              ' Loop for the Column_D_Array
        For A_ColumnLoopCounter = LBound(Columns_AB_Array) To UBound(Columns_AB_Array)                      '   Loop for the Columns_AB_Array
            If Columns_AB_Array(A_ColumnLoopCounter, 1) = Column_D_Array(D_ColumnLoopCounter, 1) Then       '       If column A value = column D value then ...
                SubtractTotal = SubtractTotal + Columns_AB_Array(A_ColumnLoopCounter, 2)                    '           Keep total to subtract
'
                CutsArrayColumnCounter = CutsArrayColumnCounter + 1                                                 '   Increment CutsArrayColumnCounter
                If CutsArrayColumnCounter > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter     '   Keep track of CutsArrayMaxColumn
                CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter) = Columns_AB_Array(A_ColumnLoopCounter, 2)   '   Save cut value to CutsArray
            End If
        Next
'
        Column_E_Array_Slot = Column_E_Array_Slot + 1                                                               ' Increment Column_E_Array_Slot counter
        Column_E_Array(Column_E_Array_Slot) = StartingValue - SubtractTotal                                         ' Save result into Column_E_Array
        CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter + 1) = Column_E_Array(Column_E_Array_Slot)            ' Also Save result into CutsArray
        If CutsArrayColumnCounter + 1 > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter + 1     ' If new CutsArrayMaxColumn, save it
        SubtractTotal = 0                                                                                           ' Reset SubtractTotal back to zero
        CutsArrayColumnCounter = 0                                                                                  ' Reset CutsArrayColumnCounter back to zero
    Next
'
    ReDim Preserve CutsArray(1 To LastRowD, 1 To CutsArrayMaxColumn)                                                ' Resize CutsArray to actual used size
'
    wsDestination.Range("E" & TableStartRow & ":E" & LastRowD) = Application.Transpose(Column_E_Array)              ' Display Column_E_Array to column E
    wsDestination.Range("H" & TableStartRow & ":H" & LastRowD) = Column_D_Array                                     ' Display Column_D_Array to column H
    wsDestination.Range(Cells(TableStartRow, CutsArrayResultsStartColumn), _
        Cells(LastRowD, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutsArray                          ' Display CutsArray to column I range
'
'---------------------------------------------------------------------------------------------------------------
'
    ReDim OneDimensionCutsArray(1 To UBound(Column_D_Array))                                                        ' Resize OneDimensionCutsArray to proper size
'
    For CutsArrayRowNumber = LBound(Column_D_Array) To UBound(Column_D_Array)                                       ' Loop for CutsArrayRowNumber
        d1Arr = Application.Index(CutsArray, CutsArrayRowNumber, 0)                                                 '   1d array
'
        If CutsArrayRowString = "" Then                                                                             '   If CutsArrayRowString = blank then ...
            CutsArrayRowString = Join(d1Arr, ",")                                                                   '       add cut measurement and ',' to string
        Else                                                                                                        '   Else
            CutsArrayRowString = CutsArrayRowString & Join(d1Arr, ",")                                              '       add cut measurement and ',' to string
        End If
'
        If Right(CutsArrayRowString, 1) = "," Then CutsArrayRowString = Left(CutsArrayRowString, Len(CutsArrayRowString) - 1)   ' If string ends with',' remove it
'
        OneDimensionCutsArray(CutsArrayRowNumber) = CutsArrayRowString                                                  ' Save string to OneDimensionCutsArray
        CutsArrayRowString = vbNullString                                                                               ' erase CutsArrayRowString
    Next
'
    UniqueItems = 0                                                                                                     ' Initialize UniqueItems counter
'
    For OneDimensionCutsArrayRow = LBound(OneDimensionCutsArray) To UBound(OneDimensionCutsArray)                       ' OneDimensionCutsArrayRow loop
        If Not CutsDictionary.Exists(OneDimensionCutsArray(OneDimensionCutsArrayRow)) Then                  '   If string doesn't exist in CutsDictionary then ...
            CutsDictionary.Add OneDimensionCutsArray(OneDimensionCutsArrayRow), 1                                       '   add string to CutsDictionary
            UniqueItems = UniqueItems + 1                                                                               '   increment UniqueItems counter
        Else                                                                                                            ' Else
'           Increment duplicate counter
            CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) = CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) + 1
        End If
    Next
'
    UniqueCutsCountStartRow = TableStartRow + UBound(Column_D_Array) + 4                                                ' Establish UniqueCutsCountStartRow
    UniqueCutsCountEndRow = UniqueCutsCountStartRow + UniqueItems - 1                                                   ' Establish UniqueCutsCountEndRow
    H_Row_Counter = 0                                                                                                   ' Initialize H_Row_Counter
'
    wsDestination.Range("H" & UniqueCutsCountStartRow - 1) = "nr of patterns"                                           ' Display header
'
    wsDestination.Range("I" & UniqueCutsCountStartRow & ":I" & UniqueCutsCountEndRow).NumberFormat = "@"                ' Set range to be displayed to text
'
    For Each key In CutsDictionary.Keys                                                                                 ' CutsDictionary loop
        wsDestination.Range("H" & UniqueCutsCountStartRow + H_Row_Counter) = CutsDictionary(key) & "x"          ' display cut multiples and append 'x' to end
        wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter) = key                                        ' display cut measurements in one cell
'
        CutMeasurementArray = Split(wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter).Value, ",")
        wsDestination.Range(Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutMeasurementArray ' display cut measurements across columns
'
        H_Row_Counter = H_Row_Counter + 1                                                                               ' Increment H_Row_Counter
    Next
'
    With wsDestination.Range(Cells(UniqueCutsCountStartRow, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountEndRow, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1))                         ' Format the range ...
        .Replace "#N/A", ""                                                                                             ' Replace any '#N/A' with blank
        .NumberFormat = "General"                                                                                       ' Convert text value back to numeric
        .Value = .Value
    End With
End Sub

It is probably ugly to the more Excel educated, but it does work.

It will fill in E3 to the right on down.
 
Upvote 0

Excel Facts

Can a formula spear through sheets?
Use =SUM(January:December!E7) to sum E7 on all of the sheets from January through December
I think I over complicated the heck out of this but try the following:

VBA Code:
Sub Test3()
'
    Dim A_ColumnLoopCounter         As Long, D_ColumnLoopCounter    As Long
    Dim Column_E_Array_Slot         As Long
    Dim CutsArrayColumnCounter      As Long, CutsArrayMaxColumn     As Long, CutsArrayResultsStartColumn As Long
    Dim CutsArrayRowNumber          As Long
    Dim H_Row_Counter               As Long
    Dim LastRowD                    As Long, LastRowInSheet         As Long
    Dim OneDimensionCutsArrayRow    As Long
    Dim UniqueCutsCountStartRow     As Long, UniqueCutsCountEndRow  As Long
    Dim SubtractTotal               As Long
    Dim TableStartRow               As Long
    Dim UniqueItems                 As Long
    Dim CutsDictionary              As Object
    Dim CutsArrayRowString          As String
    Dim DestinationSheet            As String
    Dim MyTableName                 As String, MyTableRange         As String
    Dim StartingValue               As String
    Dim Columns_AB_Array            As Variant, Column_D_Array      As Variant, Column_E_Array      As Variant
    Dim CutMeasurementArray         As Variant
    Dim CutsArray                   As Variant
    Dim d1Arr                       As Variant
    Dim key                         As Variant
    Dim OneDimensionCutsArray       As Variant
    Dim wsDestination               As Worksheet
'
    Set wsDestination = Sheets("Arkusz1")                                               ' <--- Set this to the proper sheet name
    MyTableName = "Tabela3"                                                             ' <--- Set this to your Table Nam
'
    LastRowInSheet = wsDestination.Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row    ' Find last used Row in sheet
    LastRowD = wsDestination.Range("D" & Rows.Count).End(xlUp).Row                      ' Get Last used Row of column D
'
    MyTableRange = "D2:E" & LastRowInSheet                                              ' <--- Set this to the Range of the Table
    TableStartRow = 3                                                                   ' <--- Set this to start row of data in the Table
    StartingValue = wsDestination.Range("B1")                                           ' <--- Set this to the Address of Value that will be subtracted from
'
    Column_E_Array_Slot = 0                                                             ' Initialize slot counter for Column_E_Array
    CutsArrayColumnCounter = 0                                                          ' Initialize CutsArrayColumnCounter
    CutsArrayMaxColumn = 0                                                              ' Initialize CutsArrayMaxColumn
    CutsArrayResultsStartColumn = 9                                                     ' Set start column number to display CutsArray
'
    Set CutsDictionary = CreateObject("Scripting.Dictionary")
'
    On Error Resume Next                                                                ' If Table doesn't exist then ignore error resulting from next line
    wsDestination.ListObjects(MyTableName).Unlist                                       ' Temporarily turn Table back into a Range
    On Error GoTo 0                                                                     ' Resume Excel Error Handling
'
    Columns_AB_Array = wsDestination.Range("A" & TableStartRow & ":B" & LastRowInSheet) ' Load data from A&B columns into 2 dimensional 1 based array RC
    Column_D_Array = wsDestination.Range("D" & TableStartRow & ":D" & LastRowD)         ' Load data from D column into 2 dimensional 1 based array RC
    ReDim Column_E_Array(1 To LastRowD)                                                 ' Set size of Column_E_Array 1 dimensional array 1 based
    ReDim CutsArray(1 To LastRowD, 1 To 50)                                             ' Set CutsArray to a 2 dimensional 1 based oversized array
'
    For D_ColumnLoopCounter = LBound(Column_D_Array) To UBound(Column_D_Array)                              ' Loop for the Column_D_Array
        For A_ColumnLoopCounter = LBound(Columns_AB_Array) To UBound(Columns_AB_Array)                      '   Loop for the Columns_AB_Array
            If Columns_AB_Array(A_ColumnLoopCounter, 1) = Column_D_Array(D_ColumnLoopCounter, 1) Then       '       If column A value = column D value then ...
                SubtractTotal = SubtractTotal + Columns_AB_Array(A_ColumnLoopCounter, 2)                    '           Keep total to subtract
'
                CutsArrayColumnCounter = CutsArrayColumnCounter + 1                                                 '   Increment CutsArrayColumnCounter
                If CutsArrayColumnCounter > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter     '   Keep track of CutsArrayMaxColumn
                CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter) = Columns_AB_Array(A_ColumnLoopCounter, 2)   '   Save cut value to CutsArray
            End If
        Next
'
        Column_E_Array_Slot = Column_E_Array_Slot + 1                                                               ' Increment Column_E_Array_Slot counter
        Column_E_Array(Column_E_Array_Slot) = StartingValue - SubtractTotal                                         ' Save result into Column_E_Array
        CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter + 1) = Column_E_Array(Column_E_Array_Slot)            ' Also Save result into CutsArray
        If CutsArrayColumnCounter + 1 > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter + 1     ' If new CutsArrayMaxColumn, save it
        SubtractTotal = 0                                                                                           ' Reset SubtractTotal back to zero
        CutsArrayColumnCounter = 0                                                                                  ' Reset CutsArrayColumnCounter back to zero
    Next
'
    ReDim Preserve CutsArray(1 To LastRowD, 1 To CutsArrayMaxColumn)                                                ' Resize CutsArray to actual used size
'
    wsDestination.Range("E" & TableStartRow & ":E" & LastRowD) = Application.Transpose(Column_E_Array)              ' Display Column_E_Array to column E
    wsDestination.Range("H" & TableStartRow & ":H" & LastRowD) = Column_D_Array                                     ' Display Column_D_Array to column H
    wsDestination.Range(Cells(TableStartRow, CutsArrayResultsStartColumn), _
        Cells(LastRowD, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutsArray                          ' Display CutsArray to column I range
'
'---------------------------------------------------------------------------------------------------------------
'
    ReDim OneDimensionCutsArray(1 To UBound(Column_D_Array))                                                        ' Resize OneDimensionCutsArray to proper size
'
    For CutsArrayRowNumber = LBound(Column_D_Array) To UBound(Column_D_Array)                                       ' Loop for CutsArrayRowNumber
        d1Arr = Application.Index(CutsArray, CutsArrayRowNumber, 0)                                                 '   1d array
'
        If CutsArrayRowString = "" Then                                                                             '   If CutsArrayRowString = blank then ...
            CutsArrayRowString = Join(d1Arr, ",")                                                                   '       add cut measurement and ',' to string
        Else                                                                                                        '   Else
            CutsArrayRowString = CutsArrayRowString & Join(d1Arr, ",")                                              '       add cut measurement and ',' to string
        End If
'
        If Right(CutsArrayRowString, 1) = "," Then CutsArrayRowString = Left(CutsArrayRowString, Len(CutsArrayRowString) - 1)   ' If string ends with',' remove it
'
        OneDimensionCutsArray(CutsArrayRowNumber) = CutsArrayRowString                                                  ' Save string to OneDimensionCutsArray
        CutsArrayRowString = vbNullString                                                                               ' erase CutsArrayRowString
    Next
'
    UniqueItems = 0                                                                                                     ' Initialize UniqueItems counter
'
    For OneDimensionCutsArrayRow = LBound(OneDimensionCutsArray) To UBound(OneDimensionCutsArray)                       ' OneDimensionCutsArrayRow loop
        If Not CutsDictionary.Exists(OneDimensionCutsArray(OneDimensionCutsArrayRow)) Then                  '   If string doesn't exist in CutsDictionary then ...
            CutsDictionary.Add OneDimensionCutsArray(OneDimensionCutsArrayRow), 1                                       '   add string to CutsDictionary
            UniqueItems = UniqueItems + 1                                                                               '   increment UniqueItems counter
        Else                                                                                                            ' Else
'           Increment duplicate counter
            CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) = CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) + 1
        End If
    Next
'
    UniqueCutsCountStartRow = TableStartRow + UBound(Column_D_Array) + 4                                                ' Establish UniqueCutsCountStartRow
    UniqueCutsCountEndRow = UniqueCutsCountStartRow + UniqueItems - 1                                                   ' Establish UniqueCutsCountEndRow
    H_Row_Counter = 0                                                                                                   ' Initialize H_Row_Counter
'
    wsDestination.Range("H" & UniqueCutsCountStartRow - 1) = "nr of patterns"                                           ' Display header
'
    wsDestination.Range("I" & UniqueCutsCountStartRow & ":I" & UniqueCutsCountEndRow).NumberFormat = "@"                ' Set range to be displayed to text
'
    For Each key In CutsDictionary.Keys                                                                                 ' CutsDictionary loop
        wsDestination.Range("H" & UniqueCutsCountStartRow + H_Row_Counter) = CutsDictionary(key) & "x"          ' display cut multiples and append 'x' to end
        wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter) = key                                        ' display cut measurements in one cell
'
        CutMeasurementArray = Split(wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter).Value, ",")
        wsDestination.Range(Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutMeasurementArray ' display cut measurements across columns
'
        H_Row_Counter = H_Row_Counter + 1                                                                               ' Increment H_Row_Counter
    Next
'
    With wsDestination.Range(Cells(UniqueCutsCountStartRow, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountEndRow, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1))                         ' Format the range ...
        .Replace "#N/A", ""                                                                                             ' Replace any '#N/A' with blank
        .NumberFormat = "General"                                                                                       ' Convert text value back to numeric
        .Value = .Value
    End With
End Sub

It is probably ugly to the more Excel educated, but it does work.

It will fill in E3 to the right on down.
Hi,
This code works great unless I have numbers in column B that are decimal number (example: 191,5).
unnamed.png


NR 2: Offcut in column E should be 13,5 (not 13).

unnamed (1).png


Now it calculates the number 191,5 as 191 and 5 and does not show the offcut (13,5).

Btw, in my country we use "," as delimeter.

I would be extremely thankful if you could help with this one ;)
 
Upvote 0
Another simple approach

VBA Code:
Sub Try()

    Range("E2:E13").FormulaR1C1 = "=R1C[-3]-SUMIF(C[-4],RC[-1],C[-3])"
    Range("E2:E13").Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Range("A1").Select
    End Sub
 
Upvote 0
View attachment 50640

Now it calculates the number 191,5 as 191 and 5 and does not show the offcut (13,5).

Btw, in my country we use "," as delimeter.

I could not replicate that issue but see if the following solves the issue:

VBA Code:
Sub Test4()
'
    Dim SubtractTotal               As Double
    Dim A_ColumnLoopCounter         As Long, D_ColumnLoopCounter    As Long
    Dim Column_E_Array_Slot         As Long
    Dim CutsArrayColumnCounter      As Long, CutsArrayMaxColumn     As Long, CutsArrayResultsStartColumn As Long
    Dim CutsArrayRowNumber          As Long
    Dim H_Row_Counter               As Long
    Dim LastRowD                    As Long, LastRowInSheet         As Long
    Dim OneDimensionCutsArrayRow    As Long
    Dim UniqueCutsCountStartRow     As Long, UniqueCutsCountEndRow  As Long
    Dim TableStartRow               As Long
    Dim UniqueItems                 As Long
    Dim CutsDictionary              As Object
    Dim CutsArrayRowString          As String
    Dim DestinationSheet            As String
    Dim MyTableName                 As String, MyTableRange         As String
    Dim StartingValue               As String
    Dim Columns_AB_Array            As Variant, Column_D_Array      As Variant, Column_E_Array      As Variant
    Dim CutMeasurementArray         As Variant
    Dim CutsArray                   As Variant
    Dim d1Arr                       As Variant
    Dim key                         As Variant
    Dim OneDimensionCutsArray       As Variant
    Dim wsDestination               As Worksheet
'
    Set wsDestination = Sheets("Arkusz1")                                               ' <--- Set this to the proper sheet name
    MyTableName = "Tabela3"                                                             ' <--- Set this to your Table Nam
'
    LastRowInSheet = wsDestination.Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row    ' Find last used Row in sheet
    LastRowD = wsDestination.Range("D" & Rows.Count).End(xlUp).Row                      ' Get Last used Row of column D
'
    MyTableRange = "D2:E" & LastRowInSheet                                              ' <--- Set this to the Range of the Table
    TableStartRow = 3                                                                   ' <--- Set this to start row of data in the Table
    StartingValue = wsDestination.Range("B1")                                           ' <--- Set this to the Address of Value that will be subtracted from
'
    With Application
        .DecimalSeparator = "."                                                         ' Replace the commas with decimal points
        .ThousandsSeparator = ""                                                        ' Don't use thousands separator
        .UseSystemSeparators = False                                                    ' Tell excel not to use the normal system separators
    End With
'
    Column_E_Array_Slot = 0                                                             ' Initialize slot counter for Column_E_Array
    CutsArrayColumnCounter = 0                                                          ' Initialize CutsArrayColumnCounter
    CutsArrayMaxColumn = 0                                                              ' Initialize CutsArrayMaxColumn
    CutsArrayResultsStartColumn = 9                                                     ' Set start column number to display CutsArray
'
    Set CutsDictionary = CreateObject("Scripting.Dictionary")
'
    On Error Resume Next                                                                ' If Table doesn't exist then ignore error resulting from next line
    wsDestination.ListObjects(MyTableName).Unlist                                       ' Temporarily turn Table back into a Range
    On Error GoTo 0                                                                     ' Resume Excel Error Handling
'
    Columns_AB_Array = wsDestination.Range("A" & TableStartRow & ":B" & LastRowInSheet) ' Load data from A&B columns into 2 dimensional 1 based array RC
    Column_D_Array = wsDestination.Range("D" & TableStartRow & ":D" & LastRowD)         ' Load data from D column into 2 dimensional 1 based array RC
    ReDim Column_E_Array(1 To LastRowD)                                                 ' Set size of Column_E_Array 1 dimensional array 1 based
    ReDim CutsArray(1 To LastRowD, 1 To 50)                                             ' Set CutsArray to a 2 dimensional 1 based oversized array
'
    For D_ColumnLoopCounter = LBound(Column_D_Array) To UBound(Column_D_Array)                              ' Loop for the Column_D_Array
        For A_ColumnLoopCounter = LBound(Columns_AB_Array) To UBound(Columns_AB_Array)                      '   Loop for the Columns_AB_Array
            If Columns_AB_Array(A_ColumnLoopCounter, 1) = Column_D_Array(D_ColumnLoopCounter, 1) Then       '       If column A value = column D value then ...
                SubtractTotal = SubtractTotal + Columns_AB_Array(A_ColumnLoopCounter, 2)                    '           Keep total to subtract
'
                CutsArrayColumnCounter = CutsArrayColumnCounter + 1                                                 '   Increment CutsArrayColumnCounter
                If CutsArrayColumnCounter > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter     '   Keep track of CutsArrayMaxColumn
                CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter) = Columns_AB_Array(A_ColumnLoopCounter, 2)   '   Save cut value to CutsArray
            End If
        Next
'
        Column_E_Array_Slot = Column_E_Array_Slot + 1                                                               ' Increment Column_E_Array_Slot counter
        Column_E_Array(Column_E_Array_Slot) = StartingValue - SubtractTotal                                         ' Save result into Column_E_Array
        CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter + 1) = Column_E_Array(Column_E_Array_Slot)            ' Also Save result into CutsArray
        If CutsArrayColumnCounter + 1 > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter + 1     ' If new CutsArrayMaxColumn, save it
        SubtractTotal = 0                                                                                           ' Reset SubtractTotal back to zero
        CutsArrayColumnCounter = 0                                                                                  ' Reset CutsArrayColumnCounter back to zero
    Next
'
    ReDim Preserve CutsArray(1 To LastRowD, 1 To CutsArrayMaxColumn)                                                ' Resize CutsArray to actual used size
'
    wsDestination.Range("E" & TableStartRow & ":E" & LastRowD) = Application.Transpose(Column_E_Array)              ' Display Column_E_Array to column E
    wsDestination.Range("H" & TableStartRow & ":H" & LastRowD) = Column_D_Array                                     ' Display Column_D_Array to column H
    wsDestination.Range(Cells(TableStartRow, CutsArrayResultsStartColumn), _
        Cells(LastRowD, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutsArray                          ' Display CutsArray to column I range
'
'---------------------------------------------------------------------------------------------------------------
'
    ReDim OneDimensionCutsArray(1 To UBound(Column_D_Array))                                                        ' Resize OneDimensionCutsArray to proper size
'
    For CutsArrayRowNumber = LBound(Column_D_Array) To UBound(Column_D_Array)                                       ' Loop for CutsArrayRowNumber
        d1Arr = Application.Index(CutsArray, CutsArrayRowNumber, 0)                                                 '   1d array
'
        If CutsArrayRowString = "" Then                                                                             '   If CutsArrayRowString = blank then ...
            CutsArrayRowString = Join(d1Arr, ",")                                                                   '       add cut measurement and ',' to string
        Else                                                                                                        '   Else
            CutsArrayRowString = CutsArrayRowString & Join(d1Arr, ",")                                              '       add cut measurement and ',' to string
        End If
'
        If Right(CutsArrayRowString, 1) = "," Then CutsArrayRowString = Left(CutsArrayRowString, Len(CutsArrayRowString) - 1)   ' If string ends with',' remove it
'
        OneDimensionCutsArray(CutsArrayRowNumber) = CutsArrayRowString                                                  ' Save string to OneDimensionCutsArray
        CutsArrayRowString = vbNullString                                                                               ' erase CutsArrayRowString
    Next
'
    UniqueItems = 0                                                                                                     ' Initialize UniqueItems counter
'
    For OneDimensionCutsArrayRow = LBound(OneDimensionCutsArray) To UBound(OneDimensionCutsArray)                       ' OneDimensionCutsArrayRow loop
        If Not CutsDictionary.Exists(OneDimensionCutsArray(OneDimensionCutsArrayRow)) Then                  '   If string doesn't exist in CutsDictionary then ...
            CutsDictionary.Add OneDimensionCutsArray(OneDimensionCutsArrayRow), 1                                       '   add string to CutsDictionary
            UniqueItems = UniqueItems + 1                                                                               '   increment UniqueItems counter
        Else                                                                                                            ' Else
'           Increment duplicate counter
            CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) = CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) + 1
        End If
    Next
'
    UniqueCutsCountStartRow = TableStartRow + UBound(Column_D_Array) + 4                                                ' Establish UniqueCutsCountStartRow
    UniqueCutsCountEndRow = UniqueCutsCountStartRow + UniqueItems - 1                                                   ' Establish UniqueCutsCountEndRow
    H_Row_Counter = 0                                                                                                   ' Initialize H_Row_Counter
'
    wsDestination.Range("H" & UniqueCutsCountStartRow - 1) = "nr of patterns"                                           ' Display header
'
    wsDestination.Range("I" & UniqueCutsCountStartRow & ":I" & UniqueCutsCountEndRow).NumberFormat = "@"                ' Set range to be displayed to text
'
    For Each key In CutsDictionary.Keys                                                                                 ' CutsDictionary loop
        wsDestination.Range("H" & UniqueCutsCountStartRow + H_Row_Counter) = CutsDictionary(key) & "x"          ' display cut multiples and append 'x' to end
        wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter) = key                                        ' display cut measurements in one cell
'
        CutMeasurementArray = Split(wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter).Value, ",")
        wsDestination.Range(Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutMeasurementArray ' display cut measurements across columns
'
        H_Row_Counter = H_Row_Counter + 1                                                                               ' Increment H_Row_Counter
    Next
'
    With wsDestination.Range(Cells(UniqueCutsCountStartRow, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountEndRow, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1))                         ' Format the range ...
        .Replace "#N/A", ""                                                                                             ' Replace any '#N/A' with blank
        .NumberFormat = "General"                                                                                       ' Convert text value back to numeric
        .Value = .Value
    End With
'
    Application.UseSystemSeparators = True                                                                              ' Restore normal separators
End Sub
 
Upvote 0
I could not replicate that issue but see if the following solves the issue:

VBA Code:
Sub Test4()
'
    Dim SubtractTotal               As Double
    Dim A_ColumnLoopCounter         As Long, D_ColumnLoopCounter    As Long
    Dim Column_E_Array_Slot         As Long
    Dim CutsArrayColumnCounter      As Long, CutsArrayMaxColumn     As Long, CutsArrayResultsStartColumn As Long
    Dim CutsArrayRowNumber          As Long
    Dim H_Row_Counter               As Long
    Dim LastRowD                    As Long, LastRowInSheet         As Long
    Dim OneDimensionCutsArrayRow    As Long
    Dim UniqueCutsCountStartRow     As Long, UniqueCutsCountEndRow  As Long
    Dim TableStartRow               As Long
    Dim UniqueItems                 As Long
    Dim CutsDictionary              As Object
    Dim CutsArrayRowString          As String
    Dim DestinationSheet            As String
    Dim MyTableName                 As String, MyTableRange         As String
    Dim StartingValue               As String
    Dim Columns_AB_Array            As Variant, Column_D_Array      As Variant, Column_E_Array      As Variant
    Dim CutMeasurementArray         As Variant
    Dim CutsArray                   As Variant
    Dim d1Arr                       As Variant
    Dim key                         As Variant
    Dim OneDimensionCutsArray       As Variant
    Dim wsDestination               As Worksheet
'
    Set wsDestination = Sheets("Arkusz1")                                               ' <--- Set this to the proper sheet name
    MyTableName = "Tabela3"                                                             ' <--- Set this to your Table Nam
'
    LastRowInSheet = wsDestination.Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row    ' Find last used Row in sheet
    LastRowD = wsDestination.Range("D" & Rows.Count).End(xlUp).Row                      ' Get Last used Row of column D
'
    MyTableRange = "D2:E" & LastRowInSheet                                              ' <--- Set this to the Range of the Table
    TableStartRow = 3                                                                   ' <--- Set this to start row of data in the Table
    StartingValue = wsDestination.Range("B1")                                           ' <--- Set this to the Address of Value that will be subtracted from
'
    With Application
        .DecimalSeparator = "."                                                         ' Replace the commas with decimal points
        .ThousandsSeparator = ""                                                        ' Don't use thousands separator
        .UseSystemSeparators = False                                                    ' Tell excel not to use the normal system separators
    End With
'
    Column_E_Array_Slot = 0                                                             ' Initialize slot counter for Column_E_Array
    CutsArrayColumnCounter = 0                                                          ' Initialize CutsArrayColumnCounter
    CutsArrayMaxColumn = 0                                                              ' Initialize CutsArrayMaxColumn
    CutsArrayResultsStartColumn = 9                                                     ' Set start column number to display CutsArray
'
    Set CutsDictionary = CreateObject("Scripting.Dictionary")
'
    On Error Resume Next                                                                ' If Table doesn't exist then ignore error resulting from next line
    wsDestination.ListObjects(MyTableName).Unlist                                       ' Temporarily turn Table back into a Range
    On Error GoTo 0                                                                     ' Resume Excel Error Handling
'
    Columns_AB_Array = wsDestination.Range("A" & TableStartRow & ":B" & LastRowInSheet) ' Load data from A&B columns into 2 dimensional 1 based array RC
    Column_D_Array = wsDestination.Range("D" & TableStartRow & ":D" & LastRowD)         ' Load data from D column into 2 dimensional 1 based array RC
    ReDim Column_E_Array(1 To LastRowD)                                                 ' Set size of Column_E_Array 1 dimensional array 1 based
    ReDim CutsArray(1 To LastRowD, 1 To 50)                                             ' Set CutsArray to a 2 dimensional 1 based oversized array
'
    For D_ColumnLoopCounter = LBound(Column_D_Array) To UBound(Column_D_Array)                              ' Loop for the Column_D_Array
        For A_ColumnLoopCounter = LBound(Columns_AB_Array) To UBound(Columns_AB_Array)                      '   Loop for the Columns_AB_Array
            If Columns_AB_Array(A_ColumnLoopCounter, 1) = Column_D_Array(D_ColumnLoopCounter, 1) Then       '       If column A value = column D value then ...
                SubtractTotal = SubtractTotal + Columns_AB_Array(A_ColumnLoopCounter, 2)                    '           Keep total to subtract
'
                CutsArrayColumnCounter = CutsArrayColumnCounter + 1                                                 '   Increment CutsArrayColumnCounter
                If CutsArrayColumnCounter > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter     '   Keep track of CutsArrayMaxColumn
                CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter) = Columns_AB_Array(A_ColumnLoopCounter, 2)   '   Save cut value to CutsArray
            End If
        Next
'
        Column_E_Array_Slot = Column_E_Array_Slot + 1                                                               ' Increment Column_E_Array_Slot counter
        Column_E_Array(Column_E_Array_Slot) = StartingValue - SubtractTotal                                         ' Save result into Column_E_Array
        CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter + 1) = Column_E_Array(Column_E_Array_Slot)            ' Also Save result into CutsArray
        If CutsArrayColumnCounter + 1 > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter + 1     ' If new CutsArrayMaxColumn, save it
        SubtractTotal = 0                                                                                           ' Reset SubtractTotal back to zero
        CutsArrayColumnCounter = 0                                                                                  ' Reset CutsArrayColumnCounter back to zero
    Next
'
    ReDim Preserve CutsArray(1 To LastRowD, 1 To CutsArrayMaxColumn)                                                ' Resize CutsArray to actual used size
'
    wsDestination.Range("E" & TableStartRow & ":E" & LastRowD) = Application.Transpose(Column_E_Array)              ' Display Column_E_Array to column E
    wsDestination.Range("H" & TableStartRow & ":H" & LastRowD) = Column_D_Array                                     ' Display Column_D_Array to column H
    wsDestination.Range(Cells(TableStartRow, CutsArrayResultsStartColumn), _
        Cells(LastRowD, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutsArray                          ' Display CutsArray to column I range
'
'---------------------------------------------------------------------------------------------------------------
'
    ReDim OneDimensionCutsArray(1 To UBound(Column_D_Array))                                                        ' Resize OneDimensionCutsArray to proper size
'
    For CutsArrayRowNumber = LBound(Column_D_Array) To UBound(Column_D_Array)                                       ' Loop for CutsArrayRowNumber
        d1Arr = Application.Index(CutsArray, CutsArrayRowNumber, 0)                                                 '   1d array
'
        If CutsArrayRowString = "" Then                                                                             '   If CutsArrayRowString = blank then ...
            CutsArrayRowString = Join(d1Arr, ",")                                                                   '       add cut measurement and ',' to string
        Else                                                                                                        '   Else
            CutsArrayRowString = CutsArrayRowString & Join(d1Arr, ",")                                              '       add cut measurement and ',' to string
        End If
'
        If Right(CutsArrayRowString, 1) = "," Then CutsArrayRowString = Left(CutsArrayRowString, Len(CutsArrayRowString) - 1)   ' If string ends with',' remove it
'
        OneDimensionCutsArray(CutsArrayRowNumber) = CutsArrayRowString                                                  ' Save string to OneDimensionCutsArray
        CutsArrayRowString = vbNullString                                                                               ' erase CutsArrayRowString
    Next
'
    UniqueItems = 0                                                                                                     ' Initialize UniqueItems counter
'
    For OneDimensionCutsArrayRow = LBound(OneDimensionCutsArray) To UBound(OneDimensionCutsArray)                       ' OneDimensionCutsArrayRow loop
        If Not CutsDictionary.Exists(OneDimensionCutsArray(OneDimensionCutsArrayRow)) Then                  '   If string doesn't exist in CutsDictionary then ...
            CutsDictionary.Add OneDimensionCutsArray(OneDimensionCutsArrayRow), 1                                       '   add string to CutsDictionary
            UniqueItems = UniqueItems + 1                                                                               '   increment UniqueItems counter
        Else                                                                                                            ' Else
'           Increment duplicate counter
            CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) = CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) + 1
        End If
    Next
'
    UniqueCutsCountStartRow = TableStartRow + UBound(Column_D_Array) + 4                                                ' Establish UniqueCutsCountStartRow
    UniqueCutsCountEndRow = UniqueCutsCountStartRow + UniqueItems - 1                                                   ' Establish UniqueCutsCountEndRow
    H_Row_Counter = 0                                                                                                   ' Initialize H_Row_Counter
'
    wsDestination.Range("H" & UniqueCutsCountStartRow - 1) = "nr of patterns"                                           ' Display header
'
    wsDestination.Range("I" & UniqueCutsCountStartRow & ":I" & UniqueCutsCountEndRow).NumberFormat = "@"                ' Set range to be displayed to text
'
    For Each key In CutsDictionary.Keys                                                                                 ' CutsDictionary loop
        wsDestination.Range("H" & UniqueCutsCountStartRow + H_Row_Counter) = CutsDictionary(key) & "x"          ' display cut multiples and append 'x' to end
        wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter) = key                                        ' display cut measurements in one cell
'
        CutMeasurementArray = Split(wsDestination.Range("I" & UniqueCutsCountStartRow + H_Row_Counter).Value, ",")
        wsDestination.Range(Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountStartRow + H_Row_Counter, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutMeasurementArray ' display cut measurements across columns
'
        H_Row_Counter = H_Row_Counter + 1                                                                               ' Increment H_Row_Counter
    Next
'
    With wsDestination.Range(Cells(UniqueCutsCountStartRow, CutsArrayResultsStartColumn), _
            Cells(UniqueCutsCountEndRow, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1))                         ' Format the range ...
        .Replace "#N/A", ""                                                                                             ' Replace any '#N/A' with blank
        .NumberFormat = "General"                                                                                       ' Convert text value back to numeric
        .Value = .Value
    End With
'
    Application.UseSystemSeparators = True                                                                              ' Restore normal separators
End Sub
It did not help but i managed it other way.
Colud you please change last rows of the code so the results will be displayed in new sheet (let's say "Sheet2") starting at B2? I tried to do it but the results are displayed in one cell (separated by ",")
 
Upvote 0
If so, how about this:

VBA Code:
Option Explicit

Sub Test5()
'
    Dim SubtractTotal               As Double
    Dim A_ColumnLoopCounter         As Long, D_ColumnLoopCounter    As Long
    Dim B_Row_Counter               As Long
    Dim Column_E_Array_Slot         As Long
    Dim CutsArrayColumnCounter      As Long, CutsArrayMaxColumn     As Long, CutsArrayResultsStartColumn    As Long
    Dim CutsArrayRowNumber          As Long
    Dim LastRowD                    As Long, LastRowInSheet         As Long
    Dim MaxCutsArrayColumnNumber    As Long
    Dim OneDimensionCutsArrayRow    As Long
    Dim UniqueCutsCountStartRow     As Long, UniqueCutsCountEndRow  As Long
    Dim TableStartRow               As Long
    Dim UniqueItems                 As Long
    Dim CutsDictionary              As Object
    Dim CutsArrayRowString          As String
    Dim DestinationSheet            As String
    Dim MyTableName                 As String, MyTableRange         As String
    Dim StartingValue               As String
    Dim Columns_AB_Array            As Variant, Column_D_Array      As Variant, Column_E_Array              As Variant
    Dim CutMeasurementArray         As Variant
    Dim CutsArray                   As Variant
    Dim d1Arr                       As Variant
    Dim key                         As Variant
    Dim OneDimensionCutsArray       As Variant
    Dim wsDestination1              As Worksheet, wsDestination2    As Worksheet
'
    Dim Rng                         As Range
'
'
''    Set wsDestination1 = Sheets("Arkusz1")                                              ' <--- Set this to the proper sheet name
    Set wsDestination1 = Sheets("Sheet1")                                               ' <--- Set this to the proper sheet name
    Set wsDestination2 = Worksheets("Sheet2")                                           ' <--- Set this to the proper sheet name
    MyTableName = "Tabela3"                                                             ' <--- Set this to your Table Nam
'
    LastRowInSheet = wsDestination1.Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row    ' Find last used Row in sheet
    LastRowD = wsDestination1.Range("D" & Rows.Count).End(xlUp).Row                     ' Get Last used Row of column D
'
    MyTableRange = "D2:E" & LastRowInSheet                                              ' <--- Set this to the Range of the Table
    TableStartRow = 3                                                                   ' <--- Set this to start row of data in the Table
    StartingValue = wsDestination1.Range("B1")                                          ' <--- Set this to the Address of Value that will be subtracted from
'
    With Application
        .DecimalSeparator = "."                                                         ' Replace the commas with decimal points
        .ThousandsSeparator = ""                                                        ' Don't use thousands separator
        .UseSystemSeparators = False                                                    ' Tell excel not to use the normal system separators
    End With
'
    Column_E_Array_Slot = 0                                                             ' Initialize slot counter for Column_E_Array
    CutsArrayColumnCounter = 0                                                          ' Initialize CutsArrayColumnCounter
    CutsArrayMaxColumn = 0                                                              ' Initialize CutsArrayMaxColumn
    CutsArrayResultsStartColumn = 9                                                     ' Set start column number to display CutsArray
'
    Set CutsDictionary = CreateObject("Scripting.Dictionary")
'
    On Error Resume Next                                                                ' If Table doesn't exist then ignore error resulting from next line
    wsDestination1.ListObjects(MyTableName).Unlist                                      ' Temporarily turn Table back into a Range
    On Error GoTo 0                                                                     ' Resume Excel Error Handling
'
    Columns_AB_Array = wsDestination1.Range("A" & TableStartRow & ":B" & LastRowInSheet)    ' Load data from A&B columns into 2 dimensional 1 based array RC
    Column_D_Array = wsDestination1.Range("D" & TableStartRow & ":D" & LastRowD)        ' Load data from D column into 2 dimensional 1 based array RC
    ReDim Column_E_Array(1 To LastRowD)                                                 ' Set size of Column_E_Array 1 dimensional array 1 based
    ReDim CutsArray(1 To LastRowD, 1 To 50)                                             ' Set CutsArray to a 2 dimensional 1 based oversized array
'
    For D_ColumnLoopCounter = LBound(Column_D_Array) To UBound(Column_D_Array)                              ' Loop for the Column_D_Array
        For A_ColumnLoopCounter = LBound(Columns_AB_Array) To UBound(Columns_AB_Array)                      '   Loop for the Columns_AB_Array
            If Columns_AB_Array(A_ColumnLoopCounter, 1) = Column_D_Array(D_ColumnLoopCounter, 1) Then       '       If column A value = column D value then ...
                SubtractTotal = SubtractTotal + Columns_AB_Array(A_ColumnLoopCounter, 2)                    '           Keep total to subtract
'
                CutsArrayColumnCounter = CutsArrayColumnCounter + 1                                                 '   Increment CutsArrayColumnCounter
                If CutsArrayColumnCounter > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter     '   Keep track of CutsArrayMaxColumn
                CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter) = Columns_AB_Array(A_ColumnLoopCounter, 2)   '   Save cut value to CutsArray
            End If
        Next
'
        Column_E_Array_Slot = Column_E_Array_Slot + 1                                                               ' Increment Column_E_Array_Slot counter
        Column_E_Array(Column_E_Array_Slot) = StartingValue - SubtractTotal                                         ' Save result into Column_E_Array
        CutsArray(D_ColumnLoopCounter, CutsArrayColumnCounter + 1) = Column_E_Array(Column_E_Array_Slot)            ' Also Save result into CutsArray
        If CutsArrayColumnCounter + 1 > CutsArrayMaxColumn Then CutsArrayMaxColumn = CutsArrayColumnCounter + 1     ' If new CutsArrayMaxColumn, save it
        SubtractTotal = 0                                                                                           ' Reset SubtractTotal back to zero
        CutsArrayColumnCounter = 0                                                                                  ' Reset CutsArrayColumnCounter back to zero
    Next
'
    ReDim Preserve CutsArray(1 To LastRowD, 1 To CutsArrayMaxColumn)                                                ' Resize CutsArray to actual used size
'
    wsDestination1.Range("E" & TableStartRow & ":E" & LastRowD) = Application.Transpose(Column_E_Array)             ' Display Column_E_Array to column E
    wsDestination1.Range("H" & TableStartRow & ":H" & LastRowD) = Column_D_Array                                    ' Display Column_D_Array to column H
'
        With wsDestination1
            .Range(.Cells(TableStartRow, CutsArrayResultsStartColumn), .Cells(LastRowD, _
                CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutsArray                                  ' Display CutsArray to column I range
        End With

'
'---------------------------------------------------------------------------------------------------------------
'
    ReDim OneDimensionCutsArray(1 To UBound(Column_D_Array))                                                        ' Resize OneDimensionCutsArray to proper size
'
    For CutsArrayRowNumber = LBound(Column_D_Array) To UBound(Column_D_Array)                                       ' Loop for CutsArrayRowNumber
        d1Arr = Application.Index(CutsArray, CutsArrayRowNumber, 0)                                                 '   1d array
'
        If CutsArrayRowString = "" Then                                                                             '   If CutsArrayRowString = blank then ...
            CutsArrayRowString = Join(d1Arr, ",")                                                                   '       add cut measurement and ',' to string
        Else                                                                                                        '   Else
            CutsArrayRowString = CutsArrayRowString & Join(d1Arr, ",")                                              '       add cut measurement and ',' to string
        End If
'
        If Right(CutsArrayRowString, 1) = "," Then CutsArrayRowString = Left(CutsArrayRowString, Len(CutsArrayRowString) - 1)   ' If string ends with',' remove it
'
        OneDimensionCutsArray(CutsArrayRowNumber) = CutsArrayRowString                                                  ' Save string to OneDimensionCutsArray
        CutsArrayRowString = vbNullString                                                                               ' erase CutsArrayRowString
    Next
'
    UniqueItems = 0                                                                                                     ' Initialize UniqueItems counter
'
    For OneDimensionCutsArrayRow = LBound(OneDimensionCutsArray) To UBound(OneDimensionCutsArray)                       ' OneDimensionCutsArrayRow loop
        If Not CutsDictionary.Exists(OneDimensionCutsArray(OneDimensionCutsArrayRow)) Then                  '   If string doesn't exist in CutsDictionary then ...
            CutsDictionary.Add OneDimensionCutsArray(OneDimensionCutsArrayRow), 1                                       '   add string to CutsDictionary
            UniqueItems = UniqueItems + 1                                                                               '   increment UniqueItems counter
        Else                                                                                                            ' Else
'           Increment duplicate counter
            CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) = CutsDictionary.Item(OneDimensionCutsArray(OneDimensionCutsArrayRow)) + 1
        End If
    Next
'
    UniqueCutsCountStartRow = 2                                                                                         ' Establish UniqueCutsCountStartRow
    UniqueCutsCountEndRow = UniqueCutsCountStartRow + UniqueItems - 1                                                   ' Establish UniqueCutsCountEndRow
    B_Row_Counter = 0                                                                                                   ' Initialize B_Row_Counter
    CutsArrayResultsStartColumn = 3                                                                                     ' Set start column number to display CutsArray
'
    wsDestination2.Range("C" & UniqueCutsCountStartRow & ":C" & UniqueCutsCountEndRow).NumberFormat = "@"               ' Set range to be displayed to text
'
    For Each key In CutsDictionary.Keys                                                                                 ' CutsDictionary loop
        wsDestination2.Range("B" & UniqueCutsCountStartRow + B_Row_Counter) = CutsDictionary(key) & "x"                 ' display cut multiples and append 'x' to end
        wsDestination2.Range("C" & UniqueCutsCountStartRow + B_Row_Counter) = key                                       ' display cut measurements in one cell
'
        CutMeasurementArray = Split(Sheets("Sheet2").Range("C" & UniqueCutsCountStartRow + B_Row_Counter).Value, ",")
        With wsDestination2
            .Range(.Cells(UniqueCutsCountStartRow + B_Row_Counter, CutsArrayResultsStartColumn), .Cells(UniqueCutsCountStartRow + _
                B_Row_Counter, CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1)) = CutMeasurementArray             ' display cut measurements across columns
        End With
'
        B_Row_Counter = B_Row_Counter + 1                                                                               ' Increment B_Row_Counter
    Next
'
    MaxCutsArrayColumnNumber = CutsArrayResultsStartColumn + CutsArrayMaxColumn - 1
'
    With wsDestination2.Range(Split(Cells(1, CutsArrayResultsStartColumn).Address, "$")(1) & UniqueCutsCountStartRow & _
            ":" & Split(Cells(1, MaxCutsArrayColumnNumber).Address, "$")(1) & UniqueCutsCountEndRow)                    ' Format the range ...
        .Replace "#N/A", ""                                                                                             ' Replace any '#N/A' with blank
        .NumberFormat = "General"                                                                                       ' Convert text value back to numeric
        .Value = .Value
    End With
'
    Application.UseSystemSeparators = True                                                                              ' Restore normal separators
End Sub
 
Upvote 0
Solution
Are you referring to post #20 in this thread?
No, I just wanted results to be displayed in different Sheet starting at cell B2.

Like this:
 

Attachments

  • Zrzut ekranu (27).png
    Zrzut ekranu (27).png
    12.2 KB · Views: 4
Upvote 0
That is what the code from my last post does. It posts that 'table' that you just posted into a separate sheet.

Maybe you are saying you no longer need the previous code to fill in the other 'tables'? You are now just interested in the 'table' that lists the duplicate cuts and none of the previous results?
 
Last edited:
Upvote 0

Forum statistics

Threads
1,215,884
Messages
6,127,562
Members
449,385
Latest member
KMGLarson

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top