【问题标题】:Understanding How Many Configurations of Product are Sold了解销售了多少种产品配置
【发布时间】:2021-11-16 03:22:38
【问题描述】:

每个配置都设置为组成一个完整设备的不同部件号。我们想了解我们已售出的每种完整配置的数量,以了解销量最高的组合。配置编号与产品的一个选项有关,例如 12345-W 表示无线。

我们需要找出每个配置字符串中有多少我们必须计算它们。这有几列有助于查找配置。您可以查看行号和销售号,以确保它们在销售订单上的同一组中。例如,构成成品的一个完整配置将具有与成品相关的所有部件的第 1 行,以数字方式沿销售订单向下。我们可以将其与销售订单结合使用以提供配置字符串。然后我们可以查看 config 列和 part 列来区分基本配置和选项。 Config 列中的“C”告诉我们它是基本模型,“X”告诉我们它是一个选项。

有了这些信息,我们需要创建配置字符串,在蓝色/紫色列中显示为手动示例,照片链接如下。一旦我们有了字符串,它只是计算“C”配置选项以避免重复计算,然后我们可以制作一个数据透视表来告诉有多少相同选项的重复项并仅过滤 C。这些是多种不同的产品,以及不同产品的多种不同配置。

这里是设置:

数据示例:蓝色列是手动需要的示例

我的一些想法是 If、then 语句、连接 IF 或宏。但到目前为止还没有任何结果。任何建议将不胜感激!

【问题讨论】:

    标签: excel vba if-statement concatenation


    【解决方案1】:

    为了能够高效地执行此操作,您需要确保数据按以下方式排序:

    1. Sales
    2. linenum
    3. Config
    4. Part

    它需要同时按所有 4 列按此顺序排序,否则您可能会得到混乱的数据!

    还假设选项编号总是以相应的基数加破折号作为前缀。

    然后我们将需要的列读入数组中(以加快处理速度)。我们逐行遍历该数据。当我们在配置中找到C 时,我们会记住该行号(用于比较X 选项和写入输出)。我们继续下一行并检查它是否是一个选项以及它是否属于 rembered 基本配置。如果是这样,我们将选项部分编号附加到基本配置。

    最后我们将数组数据写回单元格。

    Option Explicit
    
    Public Sub GetFullConfigFromOptions()
        Dim ws As Worksheet  ' define your sheet here
        Set ws = ThisWorkbook.Worksheets("Sheet1")
        
        Dim LastRow As Long
        LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        
        ' read data columns into array
        Dim ArrSalesNo() As Variant   'define Sales column
        ArrSalesNo = ws.Range("A1").Resize(RowSize:=LastRow).Value
    
        Dim ArrConfig() As Variant   'define Config column
        ArrConfig = ws.Range("B1").Resize(RowSize:=LastRow).Value
    
        Dim ArrPartNo() As Variant   'define Part column
        ArrPartNo = ws.Range("C1").Resize(RowSize:=LastRow).Value
    
        Dim ArrLineNo() As Variant   'define Linenum column
        ArrLineNo = ws.Range("E1").Resize(RowSize:=LastRow).Value
        
        ' create output array
        Dim ArrOut() As Variant   'define String column
        ArrOut = ws.Range("D1").Resize(RowSize:=LastRow).Value
        
        
        Dim CurrentConfigRow As Long
        
        Dim iRow As Long
        For iRow = 2 To LastRow
            If ArrConfig(iRow, 1) = "C" Then
                ' is config line …
                CurrentConfigRow = iRow  ' remember line number for output
                If iRow = LastRow Then
                    ' base without options (in last row)
                    ArrOut(CurrentConfigRow, 1) = ArrPartNo(CurrentConfigRow, 1) ' write base part number to output (without dash)
                ElseIf Not ArrSalesNo(CurrentConfigRow + 1, 1) = ArrSalesNo(CurrentConfigRow, 1) Or _
                       Not ArrLineNo(CurrentConfigRow + 1, 1) = ArrLineNo(CurrentConfigRow, 1) Or _
                       Not ArrConfig(CurrentConfigRow + 1, 1) = "X" Then
                    ' base without options
                    ArrOut(CurrentConfigRow, 1) = ArrPartNo(CurrentConfigRow, 1) ' write base part number to output (without dash)
                Else
                    ' base with options
                    ArrOut(CurrentConfigRow, 1) = ArrPartNo(CurrentConfigRow, 1) & "-" ' write base part number to output  (including dash)
                End If
            Else
                ' check if it is an option line of the remebered config line
                If ArrSalesNo(iRow, 1) = ArrSalesNo(CurrentConfigRow, 1) And _
                   ArrLineNo(iRow, 1) = ArrLineNo(CurrentConfigRow, 1) And _
                   ArrConfig(iRow, 1) = "X" Then
                    ' is option line (so append to output)
                    ArrOut(CurrentConfigRow, 1) = ArrOut(CurrentConfigRow, 1) & Mid$(ArrPartNo(iRow, 1), Len(ArrPartNo(CurrentConfigRow, 1)) + 2)
                End If
            End If
        Next iRow
        
        ' write ouput to cells
        ws.Range("D1").Resize(RowSize:=LastRow).Value = ArrOut
    End Sub
    

    输出看起来像

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2019-08-17
      • 1970-01-01
      相关资源
      最近更新 更多