jueves, 17 de marzo de 2016

VBA: Eliminar columnas específicas con macros en Excel.

Veremos un caso interesante propuesto por un lector, y es que se plantea la posibilidad de eliminar fácilmente una serie de columnas concretas dentro de un rango especificado.

Por ejemplo, partamos del siguiente modelo de 11 columnas (A:F), donde únicamente queremos eliminar las columnas: A, D y F.

VBA: Eliminar columnas específicas con macros en Excel.



Sabemos lo complejo que suele ser trabajar e identificar columnas, ya que éstas aparecen nombradas con letras, y normalmente los bucles se realizan con valores numéricos.
En la explicación siguiente aprovecharemos las ventajas de las matrices (Array) para salvar esta dificultad, y homgeneizar los valores a comparar.


Insertamos el siguiente código dentro de la ventana de código de un módulo estándar desde el editor de VB:

Sub ElimnarColumnas()
'Columnas a eliminar
matriz = Array("A", "D", "F")
nUltCol = Range("A1:K1").Columns.Count

'recorremos de izquierda a derecha las columnas del rango
For i = (nUltCol - 1) To 0 Step -1
    'comparamos cada columna del rango
    'con la matrriz de columnas a eliminar
    For x = 0 To UBound(matriz)
        'identificamos el número de columna a eliminar
        NumCol = Cells(1, matriz(x)).Column
        'y comparamos con la posición de columna en que estamos..
        If i = NumCol Then
            'si coincide, estamos posicionados en una columna a eliminar
            ActiveSheet.Columns(i).Delete Shift:=xlShiftToLeft
        End If
    Next x
Next i

End Sub



El proceso es simple, identificamos qué columnas deseamos eliminar con la matriz de constantes:
matriz = Array("A", "D", "F")
y luego realizamos un proceso de loop de izquierda a derecha entre las columnas del rango a tratar, para evitar errores en la eliminación. en ese recorrido comparamos si la columna coincide con alguna de las indicadas a eliminar.

El proceso acaba con el resultado esperado, con las columnas A, D y F eliminadas:

VBA: Eliminar columnas específicas con macros en Excel.


10 comentarios:

  1. Muy bien explicado. Puede modicar el codigo para que pregunte las columnas que se desean borrar y también tenga la opción de salir,saludos,johnmor41

    ResponderEliminar
    Respuestas
    1. Hola,
      en realidad habría que preguntar dos cosas, el rango sobre el que trabajar:
      nUltCol = Range("A1:K1").Columns.Count
      para determinar la última columna y el listado de columnas..

      La idea es algo larga, pero habría que generar un UserForm con las diferentes opciones, para luego recuperar los valores seleccionados como variables y emplearlos en el código de arriba...
      También se podría intentar con algún INPUTBOX.

      Creo lo más sencillo sería modificar la línea de código ;-)
      Saludos

      Eliminar
  2. Hola, buen dia, excelente foro. No soy muy experto en programacion de VB y he tratado de basarme en esta rutina para eliminar columnas de una hoja de excel donde hay 7 columnas ocultas que no requiero y el archivo es bastante extenso en numero de columnas.
    Es decir que la rutina debe eliminar 7 colunnas y luego se salta una y elimina otras 7 teniendo como limite e inicio una ubicacion especifica.
    En la rutina anterior esta la base pero no logro decifrar como puedo organizar lo que necesito.

    Agradezco toda ayuda que me puedan dar.

    Saludos
    Gonzalo

    ResponderEliminar
    Respuestas
    1. Hola Gonzalo,
      el asunto no es sencillo, ya que primero habría que cargar en alguna Array cuáles son las columnas a eliminar, mediante un bucle por las columnas de tu rango de datos...
      una vez identificadas, habría que realizar un recorrido inverso (como el del ejemplo) para ir eliminando dichas columnas.
      Una forma de identificar las columnas a eliminar para la primera carga podría ser comparar el resultado de la función múltiplo con el número de columna...

      Escribiré y subiré al post una posible solución en cuanto me sea posible.
      Slds

      Eliminar
  3. Muy bueno.

    una pregunta, me da error al poner un rango de columnas juntas. No sería así?: "CD: FF" EJEMPLO

    ResponderEliminar
    Respuestas
    1. Hola Alfredo,
      para eliminar columnas seguidas no hace falta la macro anterior (está pensada para columnas discontinuas), en tu caso basta:
      Columns("CD:FF").Delete Shift:=xlToLeft

      saludos

      Eliminar
    2. Gracias Ismael, pero en el mismo excel tengo que eliminar muchas que están continuas aparte de las discontinuas. ¿no se puede mezclar en la misma línea.

      Eliminar
    3. varias columnas continuas y discontinuas
      Range("B:D,G:G,J:J,M:M").Delete Shift:=xlToLeft

      saludos

      Eliminar
  4. Una consulta, necesitaría el paso inverso, el paso serçia seleccionar las columnas que me interesan por nombre; ya que lo extraigo de una base de datos que va cambiando el orden, pero no el nombre de las columnas.

    ResponderEliminar
    Respuestas
    1. supongo tendrás una Tabla en una hoja...
      En ese caso tendrás que borrar una por una:
      Range("Tabla1").ListObject.ListColumns("campo3").Delete
      así solo borrarás el campo completo de esa tabla
      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.