2011-12-19 3 views
13

私は現在、シートにこのデータを持っているに項目を分け、私は2番目の列にカンマ区切りのエントリを分割して、以下のように新しい行に挿入されて何をしたいのかスプリットコンマは新しい行

Col A Col B 
1  angry birds, gaming 
2  nirvana,rock,band 

Col A Col B 
1 angry birds 
1 gaming 
2 nirvana 
2 rock 
2 band 

これはVBAで行うことはできますが、自分では理解できないと確信しています。

+0

[ "バンド" が "バンドは、" ,すなわち後に空白を取り除くために正規表現を更新しました]あなたがいますこれを現場でやろうとしているのですか、新しいシートを使っても問題ありませんか? –

+0

いずれにしても大丈夫です。 – redGREENblue

+3

これまでに試してみましたか?何がうまかった?どうしたの? –

答えて

22

バリアント配列ではなく、セルのループを使用して、より良いオフになっている - データセットは意味がある一度、彼らははるかに速く、コードが賢明です。あなたのコードはもっと長くなります:)

このサンプルは、元のデータを見ることができるように、CとDの列にダンプします。 変更[a1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)元のデータ

を超えるダンプする

Sub SliceNDice() 
Dim objRegex As Object 
Dim X 
Dim Y 
Dim lngRow As Long 
Dim lngCnt As Long 
Dim tempArr() As String 
Dim strArr 
Set objRegex = CreateObject("vbscript.regexp") 
objRegex.Pattern = "^\s+(.+?)$" 
'Define the range to be analysed 
X = Range([a1], Cells(Rows.Count, "b").End(xlUp)).Value2 
Redim Y(1 To 2, 1 To 1000) 
For lngRow = 1 To UBound(X, 1) 
    'Split each string by "," 
    tempArr = Split(X(lngRow, 2), ",") 
    For Each strArr In tempArr 
     lngCnt = lngCnt + 1 
     'Add another 1000 records to resorted array every 1000 records 
     If lngCnt Mod 1000 = 0 Then Redim Preserve Y(1 To 2, 1 To lngCnt + 1000) 
     Y(1, lngCnt) = X(lngRow, 1) 
     Y(2, lngCnt) = objRegex.Replace(strArr, "$1") 
    Next 
Next lngRow 
'Dump the re-ordered range to columns C:D 
[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) 
End Sub 

enter image description here

+1

+1クールなコード。良い人。可能であれば、カンマの後に続く空白を削除します。もう一度、良い仕事の男。 – Ian

+0

@kannans thxと良い提案、質問者がデータレイアウトで作成されたクエリに返信していないので、私は提案された改善を追加します – brettdj

+0

regexp – brettdj

4

列Aにデータを取り、列に結果を置くC.

Sub SplitAll() 
    Dim src As Range 
    Dim result As Variant 
    For Each src In Range("A:A").SpecialCells(xlCellTypeConstants) 
     result = Split(src, ",") 
     'last cell in column C 
     With Cells(Rows.Count, 3).End(xlUp) 
      Range(.Offset(1, 0), .Offset(1 + UBound(result, 1), 0)) = Application.WorksheetFunction.Transpose(result) 
     End With 
    Next src 
End Sub 
+0

Ooops、私はただKannan S.が提供したリンクを見ました。とにかく私のコードは短く:-)) –

+0

あなたのコードは列Aを分割するだけですが、作業するデータは列B(マーカーとしてA)です。その2列の出力です。 :) – brettdj

+0

少なくともそれはredGREENblue ;-)のための素敵な小さなエクササイズになります –