Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何基于同一sku连接不同的单元_Excel_Csv_Concatenation_Vlookup_Openoffice Calc - Fatal编程技术网

Excel 如何基于同一sku连接不同的单元

Excel 如何基于同一sku连接不同的单元,excel,csv,concatenation,vlookup,openoffice-calc,Excel,Csv,Concatenation,Vlookup,Openoffice Calc,我有一个有两列的csv sku,color 001,blue 001,red 001,pink 001,yellow 002,blue 002,red 002,pink 002,yellow etc.. 如何创建新单元格并根据sku编号组合颜色?像这样: sku,combinedColors 001,"blue,red,pink,yellow" 002,"blue,red,pink,yellow" 谢谢您可以使用VBA宏执行此操作。要输入此宏(Sub),alt-F11打开Visual Bas

我有一个有两列的csv

sku,color
001,blue
001,red
001,pink
001,yellow
002,blue
002,red
002,pink
002,yellow
etc..
如何创建新单元格并根据sku编号组合颜色?像这样:

sku,combinedColors
001,"blue,red,pink,yellow"
002,"blue,red,pink,yellow"

谢谢

您可以使用VBA宏执行此操作。要输入此宏(Sub),alt-F11打开Visual Basic编辑器。 确保项目在“项目资源管理器”窗口中高亮显示。 然后,从顶部菜单中选择插入/模块和 将下面的代码粘贴到打开的窗口中

您可能需要根据源数据的位置以及结果的写入位置进行一些更改。宏假定源数据位于带有标题行的A:B列中,并且结果将写入D:E列

我还假设,因为这是用Excel标记的,所以您已经将csv数据导入Excel,并且希望结果分为两列

要使用此宏(Sub),alt-F8打开宏对话框。按名称选择宏,然后单击

Option Explicit
Sub ConcatColorsBySKU()
    Dim colSKU As Collection
    Dim vSrc As Variant, vRes() As Variant
    Dim I As Long, J As Long
    Dim rRes As Range
vSrc = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Resize(columnsize:=2)
Set rRes = Range("D1")

'Unique SKU's
Set colSKU = New Collection
On Error Resume Next
For I = 2 To UBound(vSrc)
    colSKU.Add Item:=CStr(vSrc(I, 1)), Key:=CStr(vSrc(I, 1))
Next I
On Error GoTo 0

'Results Array
ReDim vRes(1 To colSKU.Count + 1, 1 To 2)
vRes(1, 1) = "SKU"
vRes(1, 2) = "Combined Colors"
For I = 1 To colSKU.Count
    vRes(I + 1, 1) = colSKU(I)
    For J = 2 To UBound(vSrc)
        If vSrc(J, 1) = vRes(I + 1, 1) Then _
            vRes(I + 1, 2) = vRes(I + 1, 2) & ", " & vSrc(J, 2)
    Next J
    vRes(I + 1, 2) = Mid(vRes(I + 1, 2), 2)
Next I

Set rRes = rRes.Resize(UBound(vRes, 1), UBound(vRes, 2))
rRes.NumberFormat = "@"
rRes = vRes
rRes.EntireColumn.AutoFit

End Sub

没有一个公式可以做到这一点,宏是最好的方法。 但是有一种方法可以通过两个公式来实现。

在Excel中打开CSV,必须对列进行升序/降序排序

然后在C2中,添加此公式并将其向下拖动

=IF(A2<>A1,B2,C1 & "," & B2)
=IF(A2<>A3,CONCATENATE(A2,",""",C2,""""),"")
=IF(A2A1、B2、C1和“,”和B2)

在D2中,添加此公式并将其向下拖动

=IF(A2<>A1,B2,C1 & "," & B2)
=IF(A2<>A3,CONCATENATE(A2,",""",C2,""""),"")
=IF(A2A3,连接(A2,“,”,C2,”)

将自动筛选放在第1行,并在D列中选择非空白。 然后可以根据需要复制D列