Borrar datos filtrados con VBA al cambiar de hoja

Estoy intentando encontrar un código que me permita borrar los datos filtrados mediante un autofiltro al cambiar de hoja. He conseguido esto de momento...

Private Sub Worksheet_Deactivate()
    If FilterMode = True Then
    ShowAllData
    End If
End Sub

... Pero me da este fallo cuando cambio de hoja:

Se ha producido el error '1004' en tiempo de ejecución:

Error en el método 'ShowAllData' de objeto '_Worksheet'

¿Sabéis cómo puedo solucionarlo?

1 respuesta

Respuesta
1

[Hola 

prueba esto

Private Sub Worksheet_Deactivate()
Set h1 = Sheets("Hoja1") ' nombre de la hoja
    If h1.FilterMode Then
    h1.ShowAllData
    End If
End Sub

Muchas gracias. Me sigue dando el mismo fallo, pero en la siguiente línea:

h1.ShowAllData

Prueba así

Private Sub Worksheet_Deactivate()
Set h1 = Sheets("Hoja1") ' nombre de la hoja
    On Error Resume Next
    If h1.FilterMode Then
    h1.ShowAllData
    End If
End Sub

Vale, me funciona. Pero ahora, ¿por qué no me lo aplica cuando lo copio en otra hoja distinta? Tengo tres hojas, cada una con su autofiltro, y quiero que esto funcione cuando cambio a otra hoja distinta del libro.

¿Entonces estas trabajando con 2 libros?

Usa esto

Private Sub Worksheet_Deactivate() ' código en Libro2 en Hoja1
    Set l1 = Workbooks("Libro1.xlsm")
    Set h1 = l1.Sheets("Hoja1") ' nombre de la hoja
    On Error Resume Next
    If h1.FilterMode Then
    h1.ShowAllData
    End If
End Sub

valora la respuesta para finalizar

No trabajo con dos libros, sino uno. Lo que pasa es que en este tengo tres hojas en que, en cada una, tengo un autofiltro. Y quiera que al salir de cada una de ellas, me limpie el filtro. Ya te he valorado, disculpa. Siempre valoro en la primera respuesta, y esta vez se me ha pasado.

La macro en hoja1 tienes poner así

Private Sub Worksheet_Deactivate() ' Código en Hoja1
    Set h2 = Sheets("Hoja2") '
    Set h3 = Sheets("Hoja3") '
    On Error Resume Next
    If h2.FilterMode Then h2.ShowAllData
    If h3.FilterMode Then h3.ShowAllData
End Sub

Hoja2

Private Sub Worksheet_Deactivate() ' Código en Hoja2
    Set h1 = Sheets("Hoja1") '
    Set h3 = Sheets("Hoja3") '
    On Error Resume Next
    If h1.FilterMode Then h1.ShowAllData
    If h3.FilterMode Then h3.ShowAllData
End Sub

Hoja3

Private Sub Worksheet_Deactivate() ' Código en Hoja3
    Set h1 = Sheets("Hoja1") '
    Set h2 = Sheets("Hoja2") '
    On Error Resume Next
    If h1.FilterMode Then h1.ShowAllData
    If h2.FilterMode Then h2.ShowAllData
End Sub

Hola, Adriel. Gracias.

A ver, si el primer código, este:

Private Sub Worksheet_Deactivate()
Set h1 = Sheets("Hoja1") ' nombre de la hoja
    On Error Resume Next
    If h1.FilterMode Then
    h1.ShowAllData
    End If
End Sub

debería funcionar, pero no sé por qué en una hoja lo coje; y en las siguientes, si aplico el autofiltro, me dice que nanay. Yo si quieres te dejo aquí un enlace con el archivo para que tú lo veas. Son las hojas "Pendiente", "Comprar" y "Libros leídos". Quiero que si yo filtro, por ejemplo, en la hoja "Pendiente", cualquier salga de ella (bien porque cierro el libro, bien porque me voy a otra hoja dentro del mismo libro), me borre el filtro que tenga aplicado. Pero que si otro día, me da por filtrar en "Libros leídos", cuando proceda de la forma señalada anteriormente, también me lo borre. Como ves, no son acciones encadenadas.

Hoja de cálculo

Te paso la macro, no te funcionaba porque tienes hojas protegidas

Pon esto en un modulo

Sub quitarfiltro()
On Error Resume Next
For Each Hoja In Array("Resumen por leer", "Pendientes", "Libros leídos")
    If Sheets(Hoja).AutoFilterMode Then
        Sheets(Hoja).Unprotect
        Sheets(Hoja).AutoFilterMode = 0
    End If
Next
End Sub

'

y en las hojas señaladas pon esto en el evento deactivate 

Private Sub Worksheet_Deactivate()
Call quitarfiltro
End Sub

Resuelto con el siguiente código

Private Sub Worksheet_Deactivate()
Set h1 = Sheets("Hoja1")
    On Error Resume Next
    If h1.FilterMode Then
    h1.Unprotect
    h1.ShowAllData
    h1.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowSorting:=True, AllowFiltering:=True
    End If
End Sub

Muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas