jueves, 8 de diciembre de 2016

VBA: Eliminando Columnas en Excel

Un lector preguntaba por una forma de eliminar columnas por grupos en Excel de manera masiva:
[...]No soy muy experto en programación 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 columnas 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 descifrar como puedo organizar lo que necesito.

Agradezco toda ayuda que me puedan dar[...]


La solución la obtendremos con una sencilla macro de Excel, que nos permitirá eliminar esos grupos de 7 en 7 columnas indicadas por el usuario empezando por la derecha o por la izquierda.

En la ventana de código de nuestra hoja de trabajo incluimos el siguiente evento:

Sub ElimnarColumnas()
Dim ColEliminar() As Integer    'definimos la Matriz/Array
Dim Start As Integer, Final As Integer
Dim col As Integer

'Preguntamos por el rango de columnas...
Set Rango = Application.InputBox("Selecciona el rango (fila) de análisis", "Selecciona rango", Selection.Address, , , , Type:=8)
'identificamos el número de columna de Inicio y Final
Start = Rango.Item(1).Column
Final = Rango.Columns.Count + Start - 1
 
'redimensionamos el tamaño de la Array
ReDim ColEliminar(1 To Final - Start + 1) As Integer

'comprobamos se ha seleccionado un rango continuo y único.
If Rango.Areas.Count > 1 Then
 MsgBox "No es posible seleccionar un rango discontinuo!!."
 Exit Sub
End If

inicio:
'preguntamos por el sentido del barrido
Sentido = InputBox("Indica el sentido o inicio del rango (Izda-Dcha o Dcha-Izda)", "Inicio del borrado", "Izda-Dcha")

If Sentido = "Izda-Dcha" Then
    'en primer lugar identificamos los números de columna a eliminar
    x = 0
    For i = Start To Final Step 1
    x = x + 1
        If (x Mod 8) <> 0 Then
            ColEliminar(x) = i
        End If
    Next i
    'recorremos los valores de la matriz de derecha a izquierda
    For col = (Final - Start + 1) To 1 Step -1
            On Error Resume Next
            ActiveSheet.Columns(ColEliminar(col)).Delete Shift:=xlShiftToLeft
            On Error GoTo 0
    Next col

ElseIf Sentido = "Dcha-Izda" Then
    x = 1
    For i = Final To Start Step -1
        If (x Mod 8) <> 0 Then
            ActiveSheet.Columns(i).Delete Shift:=xlShiftToLeft
        End If
    x = x + 1
    Next i

Else
    'en caso de no coincidir la respuesta con nada
    'volvemos a preguntar
    GoTo inicio
End If

End Sub



Podemos comprobar como para los datos del ejemplo, seleccionando las columnas E:Y, según la selección de Izda-Dcha o bien Dcha-Izda, el resultado de las columnas eliminadas (o que permanecen) es diferente.

VBA: Eliminando Columnas en Excel



Si elegimos Izda-Dcha deberán permanecer las columnas L y T (con valores 8 y 16):

VBA: Eliminando Columnas en Excel



Si elegimos de Dcha-Izda deberían permanecer las columnas J y R (con valores 6 y 14):

VBA: Eliminando Columnas en Excel

No hay comentarios:

Publicar un comentario

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