2011-12-19 22 views
13

Actualmente tengo estos datos en una hoja dede Split separados por comas entradas a las nuevas filas

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

Lo que quiero hacer es dividir las entradas separados por comas en la segunda columna y insertas de nuevas filas, como a continuación:

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

Estoy seguro de que esto se puede hacer con VBA pero no pude resolverlo por mi cuenta.

+0

¿Estás tratando de hacer esto en el lugar o ¿está bien con el uso de nueva hoja? –

+0

Está bien de cualquier manera. – redGREENblue

+3

¿Y lo has intentado hasta ahora? ¿Qué funcionó? ¿Qué no? –

Respuesta

22

Usted es mejor usar arreglos variantes en lugar de bucles de células - que son mucho más rápidos código sabia una vez que los conjuntos de datos son significativos. Aunque el código es más largo :)

Este ejemplo a continuación se carga en la columna C y D para que pueda ver los datos originales. Cambio [c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) a [a1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) para volcar sobre sus datos originales

[Actualizado con expresión regular para eliminar cualquier espacio en blanco después de , es decir, "banda" se convierte en "banda"]

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 código genial. Buen hombre. Si es posible, elimine los espacios que vienen después de la coma. Una vez más, buen hombre de trabajo. – Ian

+0

@kannans thx y buena sugerencia, como el asker no ha respondido sobre la consulta planteada en el diseño de datos, agregaré su mejora sugerida – brettdj

+0

Actualizado con la expresión regular – brettdj

4

Toma sus datos en la columna A y pone el resultado en la columna 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, acabo de ver el enlace proporcionado por Kannan S. Parece que trabajé para nada. De todos modos, mi código es más corto :-)) –

+0

Sí, y su código solo divide la columna A ..... pero los datos que se trabajarán fueron la columna B (con A como marcador) Es un resultado de dos columnas. :) – brettdj

+0

Al menos ese será un buen ejercicio pequeño para redGREENblue ;-) –

Cuestiones relacionadas