Excel VBA将多行数据连接成一行

时间:2012-11-09 11:06:26

标签: excel vba excel-vba

  

可能重复:
  Excel Concatenate Rows

我想使用Excel VBA宏将多行数据合并为一行,并且输出要在新工作表上,但我不知道从哪里开始。数据非常简单,由一列ID和一列产品组成。如果存在多个产品条目,则可能有多个具有相同ID的行,因此我正在寻找一个宏来循环遍历数据集并将这些多个条目合并为一个。如果该行是唯一的(即,只有一个产品条目针对该ID),则可以将该行复制到输出工作表而不进行任何合并。

数据如下所示:


ID          PRODUCT

1-10OOMD6   Product SKU1 (9000)

1-10PQFV3   Product SKU2 (7000)

1-10QSCSB   Product SKU3 (50)

1-10RWX7L   Product SKU4 (2)

1-10TKZQJ   Product SKU5 (1)

1-10UROIL   Product SKU3 (12000)

1-10UROIL   Product SKU7 (12000)

1-10UROIL   Product SKU8 (12000)

1-10UW6KU   Product SKU9 (1000)

1-10UW6KU   Product SKU10 (6500)

1-10W5HR9   Product SKU11 (80)

1-10XZWX7   Product SKU12 (1)

1-10ZRXVJ   Product SKU5 (70)

1-10ZV49V   Product SKU3 (250)

1-110RQQN   Product SKU13 (1)

1-110RQQN   Product SKU2 (600)

1-110RQQN   Product SKU14 (1)

1-110RQQN   Product SKU4 (600)

1-112DJ2N   Product SKU15 (5)

1-112EWRQ   Product SKU16 (3000)

我希望它最终会像这样:


ID  PRODUCT

1-10OOMD6   Product SKU1 (9000)

1-10PQFV3   Product SKU2 (7000)

1-10QSCSB   Product SKU3 (50)

1-10RWX7L   Product SKU4 (2)

1-10TKZQJ   Product SKU5 (1)

1-10UROIL   Product SKU3 (12000), Product SKU7 (12000), Product SKU8 (12000)

1-10UW6KU   Product SKU9 (1000),Product SKU10 (6500)

1-10W5HR9   Product SKU11 (80)

1-10XZWX7   Product SKU12 (1)

1-10ZRXVJ   Product SKU5 (70)

1-10ZV49V   Product SKU3 (250)

1-110RQQN   Product SKU13 (1), Product SKU2 (600), Product SKU14 (1), Product SKU4 (600)

1-112DJ2N   Product SKU15 (5)

1-112EWRQ   Product SKU16 (3000)

因此输出表上的每个ID都是唯一的。

几点:

  • 我无法粘贴图片,所以要澄清:这是一个ID:1-10OOMD6,这是一个产品:产品SKU1(9000)
  • 数据集很大,至少35,000行
  • 数据最初不按ID排序,但很容易。
  • 用逗号分隔产品会很棒。
  • 我想在另一张工作表上输出宏。

任何帮助将不胜感激!这将为我节省大量时间! 谢谢。

2 个答案:

答案 0 :(得分:2)

作为一个起点: 使用字典 - 如何做到这一点,请看这篇文章:http://www.techbookreport.com/tutorials/vba_dictionary.html

在那之后,做一些类似的事情(Pseudocode,最初你有工作要做的不会像vba一样):

Dim dict as new dictionary.

for i=1 to activesheet.rows.count
Dim Key= activesheet.cells(i,1).value 'get the unique product-id
Dim Product = activesheet.cells(i,2).value  'get the product-sku

If dic.exists(Key)=false then 'the heart of this program: if key doenst exist, add a new one, if it alreadys exits, append data
dict.add(Key, Product)
else
 dict.Item(Key) = dict.Item(Key) & " " & Product
end if

next

    For Each v In dict.Keys
      'write it to your sheet
    Next

我猜这种方法比另一种方法更快,只是因为字典很快而且不涉及多个查找循环。

答案 1 :(得分:1)

iDevelop的评论非常正确;该网站鼓励更多“尝试,然后只有当你卡住”类型问题后发布。但是我知道,当你甚至不知道从哪里开始时会很难!

这就是我想去的地方。

首先,我会在您的产品右侧添加一列额外的公式。我将放在单元格C2中的公式为:

=COUNTIF($A$1:A1,A2)

然后将被复制成

=COUNTIF($A$1:A2,A3)
=COUNTIF($A$1:A3,A4)

等等。这是为了什么目的?它计算ID代码的数量,它与您所在的行相同,但显示在EARLIER行上。如果该数字> 0,那么您就知道之前出现过ID代码。

接下来,我将构建一些代码来迭代工作表的UsedRange。查看每行的C列。如果为0,则只需将ID和描述复制到新工作表即可。如果不是,则使用Cells.Find方法在目标工作表中找到较早的条目,并将描述附加到该单元格。

可能有其他方法可以做到,但代码应该很容易编写和运行速度可以接受。

试一试,看看你想出了什么,如果你遇到困难,请务必回复。 (虽然我在这里睡觉时间不会有几个小时;但是世界上很多其他人无疑会这样做。)

祝你好运!