2011-08-12 2 views
-2
UniqueID Description   ConsolidatedText 
Str1  Here is a sentence  Here is a sentence 
Str2  And another sentence. And another sentence. And some words      
Str2  And some words   
Str3  123     123 
Str4  abc     abC### 
Str4  ###      

OK - もう一度やり直してください。同じタイトルとフォーマットされていないコードで前の投稿を無視してください!vbaの複数のレコードのテキストを条件付きで連結します。

私はUniqueID値(テキスト)とデータ入力の説明であるテキストフィールド(潜在的にかなり長い)を持つ多数のレコード(〜4000)を持っています。 UniqueID値が複数存在する場合は、すべての説明を1つのレコードに連結してスプレッドシートを統合する必要があります。一般的に、私は潜在的な値の範囲をループして、 "UniqueIDが等しいならば、すべての説明の値を取り、単一の行(最初の行または新しい行のいずれか)で連結し、古い行。基本的には、このサンプルデータにConsolidatedTextフィールドを作成し、余分な行を削除したいと考えています。これは私のVBAプログラミング能力を超えており、このマクロの構造に関する助けがあれば幸いです。

+1

同じ質問を2回転記しないでください。将来的には、突然あなたのコンテンツについて心が変わったら、元の質問を編集してください。 –

答えて

2

以下のコードを試してみてください、それはあなたがヘッダを持っていると仮定して、そのユニークなIDが列Bの列Aと説明している

Option Explicit 
Sub HTH() 
    Dim vData As Variant 
    Dim lLoop As Long 
    Dim strID As String, strDesc As String 

    '// Original data sheet, change codename to suit 
    vData = Sheet1.UsedRange.Value 

    With CreateObject("Scripting.Dictionary") 
     .CompareMode = 1 

     For lLoop = 1 To UBound(vData, 1) 
      strID = vData(lLoop, 1):strDesc = vData(lLoop, 2) 

      If Not .exists(strID) Then 
       .Add strID, strDesc 
      Else 
       .Item(strID) = .Item(strID) & " " & strDesc 
      End If 
     Next 

     '// Data output, change sheet codename to suit 
     Sheet2.Range("a1").Resize(.Count).Value = Application.Transpose(.keys) 
     Sheet2.Range("b1").Resize(.Count).Value = Application.Transpose(.items) 
    End With 

End Sub 

EDIT

あなたが消去して上書きする場合元のデータを次に試してみてください:

Option Explicit 
Sub HTH() 
    Dim vData As Variant 
    Dim lLoop As Long 
    Dim strID As String, strDesc As String 

    '// Change all references of activesheet to your worksheet codename. 

    With ActiveSheet.UsedRange 
     vData = .Value 
     .Clear 
    End With 

    With CreateObject("Scripting.Dictionary") 
     .CompareMode = 1 

     For lLoop = 1 To UBound(vData, 1) 
      strID = vData(lLoop, 1):strDesc = vData(lLoop, 2) 

      If Not .exists(strID) Then 
       .Add strID, strDesc 
      Else 
       .Item(strID) = .Item(strID) & " " & strDesc 
      End If 
     Next 

     '// Data output, change sheet codename to suit 
     ActiveSheet.Range("a1").Resize(.Count).Value = Application.Transpose(.keys) 
     ActiveSheet.Range("b1").Resize(.Count).Value = Application.Transpose(.items) 
    End With 

End Sub 
+0

+1編集したコードが本当に好きです。辞書は驚くべきものであり、キーやアイテムをtrasponsingすることは非常に多くの状況で役に立ちます。 – aevanko

+0

Thanks Issun、コメントをいただければ幸いです。 – Reafidy

+0

+1辞書の使用は非常にいいです!あなたのコードは明確で清潔でいいショットです:) – JMax

0

(これはワンショットのためだけであれば)あなたはここで、VBAを行うにはしたくない場合は、あなたが何ができるかです:

  1. は一意IDによって自分の価値観を並べ替えるには、列「ConsolidatedText」
  2. を追加します。
  3. (C2及び抗力の最初のものとドロップ終了まで式)「をConsolidatedText」の式を作成する: =IF(A2=A3;B2&" "&B3;IF(A2=A1;"dupplicate";B2))
  4. フィルタConsolidatedTextの「dupplicate」の値を、すべてのこれらの行を削除

同じIDが2つ以上ある場合は、式を調整できます。

+0

助けてくれてありがとう、残念ながら、これは私が必要とするものではありません。説明カテゴリを、ユーザーが入力したテキストの段落として想像してください。一部のユーザーは、1つのUniqueIDを持つ1つのセルに段落全体を入力しました。他のユーザーは、それぞれの段落を別々の文章に分割しました。それぞれの文章は、個別のレコードに関連付けられていましたが、一般的な一意ID値を使用していました。私はこれらを単一のセル内の段落分のテキストに統合し、余分なレコードを削除して、最終的に各UniqueID値に対して単一の行と単一のDescriptionセルが終わるようにしたいと思います。 – cee

+0

次に、readifyソリューションを使用する必要があります。これは、これを処理する最善の方法です。 – JMax