Excel 计算并显示行中唯一值的出现次数

Excel 计算并显示行中唯一值的出现次数,excel,vba,excel-formula,Excel,Vba,Excel Formula,我有托盘,可以容纳多达4个项目。有时同一个项目是一个托盘。要打印此托盘的装运标签,我需要列出托盘上的项目以及该项目的数量。我找到了一些公式和脚本来计算列的唯一实例,但不计算保存在同一行中的数据。以下是我对数据的了解: 我需要将其转换为以下格式: 我已经手动完成了上面的操作,以显示我需要一个公式或脚本来做什么。我一整天都在努力解决这个问题,所以非常感谢您的帮助。谢谢大家! 我想这就是你要找的 AA2 is=TRANSPOSEUNIQUETRANSPOSEFILTERG2:J2,G2:J2。转置是

我有托盘,可以容纳多达4个项目。有时同一个项目是一个托盘。要打印此托盘的装运标签,我需要列出托盘上的项目以及该项目的数量。我找到了一些公式和脚本来计算列的唯一实例,但不计算保存在同一行中的数据。以下是我对数据的了解:

我需要将其转换为以下格式:


我已经手动完成了上面的操作,以显示我需要一个公式或脚本来做什么。我一整天都在努力解决这个问题,所以非常感谢您的帮助。谢谢大家!

我想这就是你要找的

AA2 is=TRANSPOSEUNIQUETRANSPOSEFILTERG2:J2,G2:J2。转置是必要的,因为UNIQUE垂直工作。AB2:AD2中的值是从AA2溢出的

AE2 is=IFAA2=,COUNTIFG2:J2,AA2。AF2:AH2从AE2溢出

S2 is=IFINDEXAA2:AH2,{1,5,2,6,3,5,4,8}=0,INDEXAA2:AH2,{1,5,2,6,3,7,4,8}。T2:Z2从S2溢出


第3行和第4行是相似的。

我想这就是您要找的

AA2 is=TRANSPOSEUNIQUETRANSPOSEFILTERG2:J2,G2:J2。转置是必要的,因为UNIQUE垂直工作。AB2:AD2中的值是从AA2溢出的

AE2 is=IFAA2=,COUNTIFG2:J2,AA2。AF2:AH2从AE2溢出

S2 is=IFINDEXAA2:AH2,{1,5,2,6,3,5,4,8}=0,INDEXAA2:AH2,{1,5,2,6,3,7,4,8}。T2:Z2从S2溢出

第3行和第4行类似。

计数并重新排列 调整常量部分中的值。 代码

清点 调整常量部分中的值。 代码

您还可以使用Excel 2010中提供的Power Query执行此操作+

在表中选择一个单元格 数据=>Get&Transform=>fromtable/Range 电源查询UI打开时 Home=>高级编辑器并将M代码粘贴到打开的窗口中 更改第2行中的表名,以反映给定数据的实际表名 阅读代码中的注释,检查“应用的步骤”窗口以了解其工作原理 M码

您还可以使用Excel 2010中提供的Power Query执行此操作+

在表中选择一个单元格 数据=>Get&Transform=>fromtable/Range 电源查询UI打开时 Home=>高级编辑器并将M代码粘贴到打开的窗口中 更改第2行中的表名,以反映给定数据的实际表名 阅读代码中的注释,检查“应用的步骤”窗口以了解其工作原理 M码


这些工作表在同一个工作簿中吗?是的,理想情况下,我会创建一个包含公式的工作表。然后,在我得到新数据时,将其复制并粘贴到项目列中。这些工作表是否在同一工作簿中?是的,理想情况下,我会创建一个包含公式的工作表。然后在我得到新数据时将其复制并粘贴到项目列中。这非常有效,设置它也让我学到了很多有关Power Query窗口的知识。非常感谢你!这非常有效,设置它也教会了我很多关于Power Query窗口的知识。非常感谢你!
Option Explicit

Sub countRearrange()
    
    ' Define constants.
    Const srcName As String = "Sheet1"
    Const srcAddress As String = "G2:J4"
    Const dstName As String = "Sheet2"
    Const dstAddress As String = "S2:Z4"
    
    ' Define workbook.
    Dim wb As Workbook: Set wb = ThisWorkbook ' Workbook containing this code.
    
    ' Write values from Source Range to Data Array.
    Dim Data As Variant: Data = wb.Worksheets(srcName).Range(srcAddress).Value
    Dim cCount As Long: cCount = UBound(Data, 2)
    
    ' Define Destination Range.
    Dim rg As Range: Set rg = wb.Worksheets(dstName).Range(dstAddress)
    
    ' Define Result Array.
    Dim Result As Variant
    ReDim Result(1 To rg.Rows.Count, 1 To rg.Columns.Count)
    
    ' Declare additional variables.
    Dim Key As Variant ' Current Data Array Value
    Dim i As Long ' Data Array Row Counter, Result Array Row Counter
    Dim j As Long ' Data Array Column Counter
    Dim n As Long ' Dictionary Element Counter, Result Array Column Counter
    Dim x As Long ' Result Array Column Counter
    
    ' Write values from Data Array to Result Array.
    With CreateObject("Scripting.Dictionary")
        .CompareMode = vbTextCompare
        For i = 1 To UBound(Data, 1)
            For j = 1 To cCount
                Key = Data(i, j)
                If Not IsError(Key) Then
                    If Len(Key) > 0 Then
                        If Not .Exists(Key) Then
                            n = n + 1
                            .Item(Key) = n
                            Result(i, 2 * n - 1) = Key
                            Result(i, 2 * n) = 1
                        Else
                            x = .Item(Key)
                            Result(i, 2 * x - 1) = Key
                            Result(i, 2 * x) = Result(i, 2 * x) + 1
                        End If
                    End If
                End If
            Next j
        Next i
    End With
        
    ' Write values from Result Array to Destination Range.
    rg.Value = Result
    
End Sub
let
    Source = Excel.CurrentWorkbook(){[Name="Table11"]}[Content],

#"Changed Type" = Table.TransformColumnTypes(Source,{{"Item #1", type text}, {"Item #2", type text}, {"Item #3", type text}, {"Item #4", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Index"}, {
        {"Grouped", each _, type table [#"Item #1"=nullable text, #"Item #2"=nullable text, #"Item #3"=nullable text, #"Item #4"=nullable text, Index=number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "uniqueItemList", each 
        let 
            //Get list of relevant column Names for grouping of each subTable
            colNames = Table.ColumnNames(Source),
            tbl1 = Table.SelectColumns([Grouped],colNames),

            //Transpose the table
            transp = Table.Transpose(tbl1),

            //Get a count of each unique Item
            grp = Table.Group(transp,"Column1",{"count", each List.Count([Column1])}),

            //create Lists of the items and their count and "Zip" them together
            col1 = Table.Column(grp,"Column1"),
            count = Table.Column(grp,"count"),
            zip = List.Zip({col1,count}),

            //create the Label string
            label = List.Accumulate(zip,"", (state, current)=> 
                if state = ""
                    then current{0} & ";" & Text.From(current{1}) 
                    else 
                        if List.NonNullCount(current) = 2 
                            then state & ";" & current{0} & ";" & Text.From(current{1})
                            else state)
        in 
            label),

    //split the label string into separate columns
    #"Split Column by Delimiter" = Table.SplitColumn(#"Added Custom", "uniqueItemList", Splitter.SplitTextByDelimiter
        (";", QuoteStyle.Csv), {"Slot #1", "Slot #1 Qty", "Slot #2", "Slot #2 Qty", "Slot #3", "Slot #3 Qty","Slot #4", "Slot #4 Qty"}),

    //Delete unneeded columns    
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Delimiter",{"Index", "Grouped"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"Slot #1", type text}, {"Slot #1 Qty", Int64.Type}, {"Slot #2", type text}, {"Slot #2 Qty", Int64.Type}, {"Slot #3", type text}, {"Slot #3 Qty", Int64.Type}, {"Slot #4", type text}, {"Slot #4 Qty", Int64.Type}})
in
    #"Changed Type1"