sábado, 9 de marzo de 2013

Separar un lista de datos en filas duplicadas

Hace ya varias semanas una persona que visita mi blog me preguntó como poder separar una columna que contiene una lista de datos, en filas separadas. Ya que hace algún tiempo realice una publicación en donde indicaba como combinar datos de filas duplicadas.

No le había contestado hasta ahora ya que además de la cantidad de trabajo que he tenido, estaba buscando una respuesta sencilla a su pregunta.

Sin embargo, la respuesta mas sencilla que he encontrado hasta ahora es utilizando una macros... pero seguiré investigando, pues espero encontrar una respuesta mas sencilla aun.

Una macros, es una secuencia de pasos, una pequeña aplicación que realiza operaciones de manera automática dentro de Excel. Las macros se escriben en leguaje VBA (Visual Basic for Application), y es la herramienta mas poderosa del Excel, pues es que conoce Macros puede fácilmente automatizar procesos.

Para poder realizar una Macros vamos a seguir los siguientes pasos:

1. Estando en la hoja donde tenemos la tabla, presionamos las teclas ALT+F11 para poder activar el entorno de Visual Basic.

2. En el menú del Visual Basic vamos a insertar un módulo

3. En el módulo insertado copiamos el siguiente código:

Sub SeparaDatos()

    'Primero me posiciono en la primera celda que quiero separar
    'Claro si los datos a separar estan en otra columna...
    '...entonces deberiamos cambiar la letra C
    Range("C2").Select
    'Esto es un bucle Do While (Hacer mientras la condicion sea verdad)
    ' Es decir, mientras la celda actual no este vacia
    Do While ActiveCell <> Empty
        'Esta es una variable cualquiera (que le puse por nombre posicion)...
        '..que le doy un valor inicial 0
        posicion = 0
        'Voy a buscar una coma (,) si no la encuentra me daria error...
        '... por eso esta indicacion, si da error que continue (On error resume next)
        On Error Resume Next
        'Aqui busco una coma en la celda y la posicion de la coma a la variable posicion
        'Si no la encuentra la variable posicion seguira teniendo un 0
        posicion = Application.WorksheetFunction.Find(",", ActiveCell)
        'Desactivo la captura de error
        On Error GoTo -1
        'Si posicion es mayor a 1, significa que si encontro una coma
        If posicion > 1 Then
            'inserto una fila en blanco
            Selection.EntireRow.Insert
            'capturo la fila en la que estoy
            fila = ActiveCell.Row
            'le asigno en la columna A el mismo valor de la fila siguiente
            Cells(fila, 1) = Cells(fila + 1, 1)
            'le asigno en la columna B el mismo valor de la fila siguiente
            Cells(fila, 2) = Cells(fila + 1, 2)
            'Si hubiesen mas columnas se seguiria colocando el mismo codigo...
            '...cambiando el numero de columan
            '...
            'Ahora coloco la letra antes de la coma en la celda actual
            ActiveCell = Left(ActiveCell.Offset(1, 0), posicion - 1)
            'En la siguiente fila quito el primer dato y la coma
            ActiveCell.Offset(1, 0) = Right(ActiveCell.Offset(1, 0), Len(ActiveCell.Offset(1, 0)) - posicion)
            'Me muevo una fila hacia abajo
            ActiveCell.Offset(1, 0).Select
        Else
            'Me muevo una fila hacia abajo
            ActiveCell.Offset(1, 0).Select
        End If
    Loop
    'Me muestra el mensaje listo
    MsgBox "Listo"
End Sub

4. Las filas que he colocado una comilla simple al principio son comentarios, para que se entienda un poco el código que hemos elaborado.

5. Cerramos el Visual Basic y regresamos a la hoja de Excel donde tenemos la tabla.

6. Ejecutamos la macros en Excel (Etiqueta Vista, Botón Macros, Ver Macros), y observaremos como automáticamente se empiezan a separar las filas.



Espero que les haya servido, cualquier consulta no duden en indicarmelo y con gusto los ayudo.

Mas vale tarde que nunca.

Ing. Enrique Neciosup Morales