在Excel中将具有相同值的多个行合并为一个加上更多…

我有一个产品ID和订单号码的列表。 每个订单号可以有多个产品ID(因为一个人可以购买多个产品)。 我的目标是将每个订单号和与其关联的产品ID组合成一行。 如果每个订单有多个产品ID,则将它们分隔开我的逗号。 请参阅下图。 我想避免使用手动方法,因为我有大约13000行。 请指教。 谢谢。

隐瞒这一点:
订购产品
 158 866
 161 960
 163 976
 163 884
 164 1010
 173 834
 174 981
 177 935
 177 832
 177 934

对此:
订购产品
 158 866
 161 960
 163 976 884
 164 1010
 173 834
 174 981
 177 935,832,934

由@Nick提供的链接提供了一个非常好的非VBA解决scheme,用于保持原始数据完好无损的位置。

如果要修改数据以仅保留合并的行,则将需要VBA解决scheme。

这是一个将进行合并的macros。

笔记:

  1. 它假设在表单上没有其他有用的数据。 如果有,将被删除或覆盖。

  2. 它在活动工作表上工作

  3. 它在内存不同的arrays合并提供合理的速度。 循环遍历单元格/行将产生更简单的代码,但会运行得更慢

 Sub MergeRows() Dim rng As Range Dim vSrc As Variant Dim vDst() As Variant Dim i As Long, j As Long ' Assumes data starts at cell A2 and extends down with no empty cells Set rng = Range([A2], [A2].End(xlDown)) ' Count unique values in column A j = Application.Evaluate("SUM(IF(FREQUENCY(" _ & rng.Address & "," & rng.Address & ")>0,1))") ReDim vDst(1 To j, 1 To 2) j = 1 ' Get original data into an array vSrc = rng.Resize(, 2) ' Create new array, one row for each unique value in column A vDst(1, 1) = vSrc(1, 1) vDst(1, 2) = "'" & vSrc(1, 2) For i = 2 To UBound(vSrc, 1) If vSrc(i - 1, 1) = vSrc(i, 1) Then vDst(j, 2) = vDst(j, 2) & "," & vSrc(i, 2) Else j = j + 1 vDst(j, 1) = vSrc(i, 1) vDst(j, 2) = "'" & vSrc(i, 2) End If Next ' Remove old data rng.EntireRow.Delete ' Put new data in sheet Set rng = [A2].Resize(j, 2) rng = vDst End Sub 

如果您想保留原始数据并将其汇总到其他地方,可以使用上一篇文章中详细介绍的方法。 这将要求您在某个地方列出所有唯一订单号,然后在相邻列中使用CCARRAY UDF。 如果原始数据位于Sheet1上,并且新汇总列表位于Sheet2上,则可以使用以下公式获取Sheet2上A2中订单号的产品信息:

 {=CCARRAY(IF(Sheet1!$A$1:$A$13000=$A2,Sheet1!$B$1:$B$13000),",")} 

只需填写这个公式,你就完成了。

要获取Sheet2上唯一订单号的列表,只需执行如下操作:将Sheet1的订单列表复制到Sheet2,然后删除Sheet2上的重复项。