2

可能重复:
Excel 连接行

我想使用 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 排序的,但很容易做到。
  • 用逗号分隔产品会很棒。
  • 我想在另一个工作表上输出宏。

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

4

2 回答 2

2

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

之后,只需做类似的事情(伪代码,最初你有工作要做的 vba 不会像 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

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

于 2012-11-09T11:47:08.120 回答
1

iDevelop 的评论非常正确;该网站鼓励更多“尝试然后仅在遇到困难时发布”类型的问题。但是,我确实知道,当您甚至不知道从哪里开始时,这可能会很困难!

这就是我想要的地方。

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

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

然后将其复制下来成为

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

等等。这样做的目的是什么?它计算与您所在行相同但出现在 EARLIER 行上的 ID 代码数量。如果该数字大于 0,则您知道之前出现过 ID 代码。

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

可能还有其他方法可以做到这一点,但代码应该足够容易编写并以可接受的速度运行。

试一试,看看你想出了什么,如果你遇到困难,一定要回复。(虽然我不会在这里待几个小时,因为这里是睡觉时间;不过,世界上很多其他人无疑会。)

祝你好运!

于 2012-11-09T11:45:42.157 回答