2011-12-19 14 views
13

Al momento ho questi dati in un foglioSplit separati da virgola voci di nuove righe

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

Quello che voglio fare è dividere i separati da virgola voci nella seconda colonna ed inserisci in nuove righe come di seguito:

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

Sono sicuro che questo può essere fatto con VBA ma non riuscivo a capirlo da solo.

+0

Sei provando a fare questo sul posto o stai bene con l'uso di un nuovo foglio? –

+0

Va bene in entrambi i casi. – redGREENblue

+3

E hai provato fino ad ora? Cosa ha funzionato? Cosa non ha? –

risposta

22

Si sta meglio utilizzando le matrici variante piuttosto che i cicli cellulari - sono il codice molto più veloce saggio una volta i set di dati sono significativi. Anche tu il codice è più lungo :)

Questo esempio di seguito riporta alla colonna C e D in modo da poter vedere i dati originali. Change [c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) a [a1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) per scaricare sui dati originali

[Aggiornato con regexp per eliminare eventuali spazi vuoti dopo , vale a dire "band" diventa "band"]

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 codice interessante. Bravo uomo. Se possibile, rimuovi gli spazi che vengono dopo la virgola. Ancora una volta, buon lavoro uomo. – Ian

+0

@kannans thx e buon suggerimento, in quanto il richiedente non ha risposto sulla query sollevata sul layout dei dati Aggiungerò il tuo suggerimento di miglioramento – brettdj

+0

Aggiornato con il regexp – brettdj

4

prende i dati nella colonna A e mette il risultato nella colonna 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, ho appena visto il collegamento fornito da Kannan S. Sembra che io abbia lavorato per niente. Ad ogni modo il mio codice è più corto :-)) –

+0

Sì, e il tuo codice divide solo la colonna A ..... ma i dati su cui lavorare sono stati la colonna B (con A come marker). Si tratta di un'uscita a due colonne. :) – brettdj

+0

Almeno questo sarà un bel piccolo esercizio per redGREENblue ;-) –

Problemi correlati