2

重複の可能性:
Excel 連結行

Excel VBA マクロを使用して複数行のデータを 1 行に結合し、出力を新しいワークシートに出力したいのですが、どこから始めればよいかわかりません。データは非常に単純で、ID の列と製品の列で構成されています。複数の製品エントリが存在する場合、同じ ID を持つ複数の行が存在する可能性があるため、データセットをループしてこれらの複数のエントリを 1 つにマージするマクロを探しています。行が一意である場合 (つまり、その ID に対する製品エントリが 1 つしかない場合)、その行はマージせずに出力シートにコピーできます。

データは次のようになります。


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として機能しません):

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)

等々。これの目的は何ですか?現在の行と同じであるが、前の行に表示される ID コードの数をカウントします。その数が 0 より大きい場合、以前に ID コードが発生したことがわかります。

次に、シートの UsedRange を反復処理するコードを作成します。各行の列 C を見てください。0 の場合は、ID と説明を新しいシートにコピーするだけです。そうでない場合は、Cells.Find メソッドを使用してターゲット シートの前のエントリを見つけ、そのセルに説明を追加します。

おそらく他にも方法はありますが、コードは簡単に記述でき、許容できる速度で実行できる必要があります。

試してみて、思いついたものを確認してください。行き詰まった場合は、必ず投稿してください。(私はここで就寝時間なので、数時間はそこにいませんが、世界中の他の多くの人が間違いなくそうするでしょう.

幸運を!

于 2012-11-09T11:45:42.157 に答える