Macro para eliminar ciertas columnas de una tabla filtrada:

A toda la comunidad, quisiera saber como hacerle para crear una macro que haga lo siguiente:

1-Dentro de una tabla me filtre por fechas (hecho)

2-De los resultados se posicione en la primera celda con valor después del titulo de la columna (hecho)

3-Poder seleccionar todos los datos filtrados dentro de esa columna seleccionada, aunque haya celdas sin datos (solo he podido seleccionar con la función "Range(Selection, Selection.End(xlDown)).Select", pero solo selecciona las celdas hasta donde deja de haber datos.

4-Con ese mismo criterio poder eliminar el contenido por ejemplo, de los datos filtrados de las columnas A, C, E.

Por otra parte quisiera saber como hacerle para: por ejemplo, filtro datos numéricos en la columna B, poder cambiar esos datos que ya tienen las celdas a una sucesión numérica 1,2,3... Hasta la ultima celda del filtrado.

Espero me pudieran ayudar, se los agradecería mucho, y cualquier info extra que necesite proporcionar para un mejor entendimiento del problema, con todo gusto.

1 Respuesta

Respuesta
1

H o la: Según tus comentarios, primer realizar un filtro por fecha, entonces, en la siguiente macro cambia la letra "D" por la columna donde tienes esas fechas. También cambia el 1 por el número de fila donde tienes los encabezados

En estas líneas realiza los cambios

    fila = 1    'fila de encabezados
    col = "D"   'columna de fecha

La macro completa

Sub BorrarCeldas()
'---
'   Por.Dante Amor
'---
    fila = 1    'fila de encabezados
    col = "D"   'columna de fecha
    '
    u = Range(col & Rows.Count).End(xlUp).Row
    If u = fila Then Exit Sub
    '
    'Borrar celdas
    Range("A2:A" & u). ClearContents
    Range("C2:C" & u). ClearContents
    Range("E2:E" & u). ClearContents
    '
    'sucesión numérica
    n = 1
    For i = fila + 1 To u
        If Cells(i, "B").EntireRow.Hidden = False Then
            Cells(i, "B") = n
            n = n + 1
        End If
    Next
    MsgBox "Fin"
End Sub
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Gracias por tu respuesta!

Para más información, lo que tengo es esto:

Sub fechaplan()
'
' fechaplan Macro
'

'
ActiveSheet.ListObjects("Tabla4").Range.AutoFilter Field:=3, Criteria1:= _
xlFilterLastMonth, Operator:=xlFilterDynamic
ActiveSheet.ListObjects("Tabla4").Range.AutoFilter Field:=2, Criteria1:= _
xlFilterLastMonth, Operator:=xlFilterDynamic
Range("a2", Cells(Rows.Count, "a").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
Range(Selection, Selection.Offset(, 3)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("f2", Cells(Rows.Count, "f").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
Range(Selection, Selection.Offset(, 3)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("l2", Cells(Rows.Count, "l").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
Range(Selection, Selection.Offset(, 5)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
ActiveSheet.ListObjects("Tabla4").Range.AutoFilter Field:=3
ActiveSheet.ListObjects("Tabla4").Range.AutoFilter Field:=2
ActiveWorkbook.Worksheets("Planeacion ").ListObjects("Tabla4").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("Planeacion ").ListObjects("Tabla4").Sort.SortFields. _
Add Key:=Range("Tabla4[[#All],[Orden]]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Planeacion ").ListObjects("Tabla4").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A2").Select
End Sub

Con esto me filtra de la tabla según 2 fechas, selecciona la primera celda de la columna que quiero borrar, y me selecciona, dentro de los resultados, las celas de las columnas que quiero borrar, y al final solo vuelve a quitar los filtros y se selecciona la celda A2.

Te comento que si funciona, pero creo que que puede optimizar el código, el problema es que si hay algún celda sin datos borra hasta una antes.

Como puedo cambiar eso y que me borre TODAS aunque este vacía alguna en medio, ¿y cómo agrego lo de la numeración a este código?

Igual te agradezco de nuevo por tu respuesta.

Saludos.

Para probar tu macro y corregir la falla "el problema es que si hay algún celda sin datos borra hasta una antes", necesitaría revisarla con datos.

Envíame tu archivo con datos y me explicas qué tienes, en otra hoja me pones la información que debería quedar después de ejecutar la macro.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Luis Abugaber” y el título de esta pregunta.

Ya te lo mande Dante, Gracias.

Ya funciona bien en un archivo, pero en otro lo único que no funciona bien es la sucesión numérica, ya que nunca acaba de agregar números, el chiste es que solo cambie los números de la columna DE de los datos filtrados.

Con esta parte se realiza la numeración. Cambia 1 por la fila donde tienes los encabezado y D por la columna que estás filtrando

    fila = 1    'fila de encabezados
    col = "D"   'columna de fecha
    '
    u = Range(col & Rows.Count).End(xlUp).Row
    If u = fila Then Exit Sub
    '
    '
    'sucesión numérica
    n = 1
    For i = fila + 1 To u
        If Cells(i, "B").EntireRow.Hidden = False Then
            Cells(i, "B") = n
            n = n + 1
        End If
    Next

R ecuerda valorar la respuesta

Te anexo la macro, primero ordena los datos que quedaron y después numera del 1 al n

Sub fechaplan2()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h = ActiveSheet     'Sheets("Planeacion")
    h.ListObjects("Tabla4").Range.AutoFilter Field:=2, _
        Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
    h.ListObjects("Tabla4").Range.AutoFilter Field:=3, _
        Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
    '
    fila = 1                'fila de encabezados
    u = h.Range("B" & Rows.Count).End(xlUp).Row
    existe = False
    For i = fila + 1 To u
        If h.Cells(i, "B").EntireRow.Hidden = False Then
            existe = True
            Exit For
        End If
    Next
    If existe = False Or u = fila Then
        MsgBox "No hay datos"
        If h.FilterMode Or h.AutoFilterMode Then h.ShowAllData
        Exit Sub
    End If
    '
    'Borrar celdas
    h.Range("A2:D" & u & ", F2:I" & u & ",M2:Q" & u).ClearContents
    If h.FilterMode Or h.AutoFilterMode Then h.ShowAllData
    'Ordenar
    With h.ListObjects("Tabla4").Sort
        .SortFields.Clear
        .SortFields.Add Key:=h.Range("Tabla4[[#All],[Orden]]"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
        .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom
        .SortMethod = xlPinYin: .Apply
    End With
    'sucesión numérica
    n = 1
    For i = fila + 1 To u
        h.Cells(i, "D") = n
        n = n + 1
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

La siguiente macro no ordena, solamente te pone la numeración del 1 al n

Sub fechaplan3()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h = ActiveSheet     'Sheets("Planeacion")
    h.ListObjects("Tabla4").Range.AutoFilter Field:=2, _
        Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
    h.ListObjects("Tabla4").Range.AutoFilter Field:=3, _
        Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
    '
    fila = 1                'fila de encabezados
    u = h.Range("B" & Rows.Count).End(xlUp).Row
    existe = False
    For i = fila + 1 To u
        If h.Cells(i, "B").EntireRow.Hidden = False Then
            existe = True
            Exit For
        End If
    Next
    If existe = False Or u = fila Then
        MsgBox "No hay datos"
        If h.FilterMode Or h.AutoFilterMode Then h.ShowAllData
        Exit Sub
    End If
    '
    'Borrar celdas
    h.Range("A2:D" & u & ", F2:I" & u & ",M2:Q" & u).ClearContents
    If h.FilterMode Or h.AutoFilterMode Then h.ShowAllData
    'sucesión numérica
    n = 1
    For i = fila + 1 To u
        h.Cells(i, "D") = n
        n = n + 1
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

¡Gracias!

Con unas ligeras modificaciones logre el resultado que deseaba! Sigue así ayudando a la comunidad, se aprecia demasiado tu tiempo y ganas, llevaba mucho tiempo atorado y fuiste clave en la resolución!

Gracias de nuevo!

Hola de nuevo, me surgió una pequeña duda:

Como puedo hacer para por ejemplo, tengo la celda A2 y quiero que cada que introduzca un numero ahí, se vaya sumando en B2 y se se borre de A2 cuando se sume, ¿me podrías ayudar?

Con mucho gusto te ayudo con todas tus peticiones.

Crea una nueva pregunta en Todoexpertos.com dentro del tema de microsoft excel. En el desarrollo de la pregunta escribe: "para Dante Amor". Ahí me describes con ejemplos y detalle lo que necesitas.

Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas