如何在Excel中的特定单元格中组合列值?

时间:2016-04-24 14:37:31

标签: excel vba function excel-vba

我有这张桌子;

Table enter image description here

我希望能够通过选项列出这些选项'每个给定产品ID的单个单元格中的值,如下所示:Image enter image description here

另请注意,我在该表中列出了1800个产品ID,因此手动提取数据非常困难。

谢谢。

3 个答案:

答案 0 :(得分:0)

此UDF将为您提供特定产品ID的特定选项所需的输出:

Function UDF_ListValues(prodId As Variant, attrib As String, R As Range)

    Dim colValues As Collection
    Dim curRow As Range
    Dim found As Boolean
    Dim value As Variant
    Dim first As Boolean

    If R.Columns.Count <> 3 Then
        UDF_ListValues = xlErrNA
    Else
        Set colValues = New Collection
        For Each curRow In R.Rows
            If curRow.Cells(1, 1).value = prodId And curRow.Cells(1, 2).value = attrib Then
                found = False
                For Each value In colValues
                    If curRow.Cells(1, 3).value = value Then
                        found = True
                        Exit For
                    End If
                Next
                If Not found Then colValues.Add curRow.Cells(1, 3)
            End If
        Next

        first = True
        For Each value In colValues
            If first Then
                UDF_ListValues = attrib & ":"
                first = False
            Else
                UDF_ListValues = UDF_ListValues & "¦"
            End If

            UDF_ListValues = UDF_ListValues & value
        Next

        Set colValues = Nothing
    End If

End Function

要获得如示例中的确切输出,您可以在单元格F2中调用此函数,如下所示:

= UDF_ListValues( E2, "Size", $A$2:$C$22 ) & ";" & UDF_ListValues( E2, "Colour", $A$2:$C$22 )

或者您可以轻松修改代码以自动列出所有出现的选项。

答案 1 :(得分:0)

如果您拥有Office 365中的最新更新或正在使用在线应用程序,则可以使用以下数组公式:

="Size:" & TEXTJOIN("|",TRUE,IF(($A$2:$A$12=E2)*($B$2:$B$12="Size"),$C$2:$C$12,"")) & ";Colour:" & TEXTJOIN("|",TRUE,IF(($A$2:$A$12=E2)*($B$2:$B$12="Colour"),$C$2:$C$12,""))

作为数组公式,必须在退出编辑模式而不是Enter或Tab时使用Ctrl-Shift-Enter确认。如果操作正确,Excel会将{}放在公式周围。

enter image description here

答案 2 :(得分:0)

请尝试这种方法。

Sub Macro()
Dim lngRow As Long
For lngRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
If StrComp(Range("A" & lngRow), Range("A" & lngRow - 1), vbTextCompare) = 0 Then
If Range("B" & lngRow) <> "" Then
Range("B" & lngRow - 1) = Range("B" & lngRow - 1) & "|" & Range("B" & lngRow)
End If
Rows(lngRow).Delete
End If
Next
End Sub