1. AyudaExcel utiliza cookies. Si continuas utilizando AyudaExcel, estás aceptando la utilización de nuestras cookies. Más información.
  2. ¡Bienvenid@ a AyudaExcel! El foro más visitado sobre Excel en habla hispana.

    Si esta es tu primera visita, asegúrate de revisar los temas de la sección Utilización y Funcionamiento para familiarizarte con las funciones del foro. Si deseas publicar mensajes, será necesario que te Registres para que puedas dejar respuestas y crear tus propios mensajes, recuerda que es gratuito.

Filtrar datos mediante macros (pero de varias hojas)

Tema publicado en 'Macros y programación VBA' iniciado por DaneryAngel, 20 Nov 2009.

  1. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Hola ahora me toca preguntar... sobre esto de macros que no manejo mucho!

    Resulta que tengo un libro con dos hojas (BD) y la otra donde hago las consultas, hasta ahi funciona muy bien!

    Pero debo ir agregando mas hojas similares y lo que deseos es que cuando consulte desde el filtro, me refleje la informacion de todas las hojas en el mismo orden que se van creando... no se si me explico bien...

    Este es el codigo
    HTML:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:E2")) Is Nothing Then
            Me.Range("A4").CurrentRegion.Clear
            Sheets("Enero").Range("BD").AdvancedFilter Action:=xlFilterCopy, _
             CriteriaRange:=Me.Range("A1:E2"), CopyToRange:=Me.Range("A4"), Unique:=False
        End If
    End Sub
    Lo que busco es como agregar en el codigo las hojas que ire agregando en el libro???

    Gracias por la ayuda!
  2. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola de nuevo!
    Para extender mi idea de lograr lo que les mencione arriba, vean el archivo que subi

    http://rapidshare.com/files/310337334/Filtrar_con_macro__pero_varias_hojas_.xls.html

    Veran que lo que pretendo es que cada vez que filtre por un criterio, el resultado se vaya reflejando de forma horizontal, ya lo logre de forma vertical, muy sencillo, solo copie el mismo codigo pero le cambie algunas coordenadas, pero lo que necesito es que me lo refleje como una sola Base de datos, desde Enero hasta Febrero y asi sucesivamente... espero haberme explicado un poco mas, talvez alguien me pueda guiar u orientar para seguir con este reto

    Gracias por sus ayudas o comentarios y si hay alguna forma diferente de aplicarlo en codigo VBA
    Última edición: 22 Nov 2009
  3. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola DaneryAngel,

    no sé si sea algo así lo que quieres, bueno de pronto te puede dar una idea, yo es que no estoy seguro de entenderte:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2")) Is Nothing Then
        
            Range("A5").CurrentRegion.Clear
            
            Sheets("Enero").Range("BD").AdvancedFilter xlFilterCopy, _
                Range("A1:C2"), Range("A5")
            
            Sheets("Febrero").Range("BD").AdvancedFilter xlFilterCopy, _
                Range("A1:C2"), Range("A" & Rows.Count).End(xlUp).Offset(1)
    
        End If
        
    End Sub
    o así tal vez:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2")) Is Nothing Then
        
            Range("A5").CurrentRegion.Clear
            
            Sheets("Enero").Range("BD").AdvancedFilter xlFilterCopy, _
                Range("A1:C2"), Range("A5")
                
            With Range("A" & Rows.Count).End(xlUp).Offset(1)
            
                Sheets("Febrero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range(.Address)
                
                .EntireRow.Delete
                
            End With
        
        End If
        
    End Sub
    bueno, no sé, tu irás diciendo si estoy totalmente perdido o por dónde es a ver si le vamos encontrando forma.
  4. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Como estas mjrofra!

    Esta excelente tu macro, ya la aplique y quedo bien en mi archivo, pero es posible borrar los datos cuando no estoy haciendo ninguna consulta, lo que te quiero decir es que no presente todos los datos abajo, a menos que haga alguna consulta, no se si me se explicar

    Es posible que solo desee filtrar la consulta por un mes determinado, se podra poner el titulo "MES" en una celda (H1) y en H2 escribir el mes y que te filtre los datos solamente de ese mes? se puede?


    Te agradezco toda tu ayuda!
  5. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola de nuevo,

    bueno, a ver cómo va saliendo así:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then Exit Sub
    
        If Not Intersect(Target, Range("A2:C2")) Is Nothing Then
            
            Range("A5").CurrentRegion.Clear
                
            If Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                    
            Else
                
                Sheets("Enero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                
                Sheets("Febrero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A" & Rows.Count).End(xlUp).Offset(1)
                    
                
                'Sheets("Marzo").....
    
            End If
    
        End If
        
    End Sub
  6. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    si eso quiere decir que dejarás en blanco las celdas A2:C2 entonces la primera línea del código hará eso:

    If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then Exit Sub

    pues creo que se puede, si tienes los datos como dices, seleccionando el mes en H2, entonces la macro que te pasé arriba lo hará. Si dejas en blanco H2, traerá todos los meses.
  7. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola mjrofra esta magnifica la macro!!! gracias por tu tiempo

    Pero fíjate que probando la consulta por mes, no me funciona, según lo que veo en tu código es que busca la hoja para poder mostrar los datos de la misma, pero no ocurre asi? si me ayudas a revisarlo por favor... (solo te aclaro que mes para mi no es sinónimo de fechas sino referencia de hojas en el libro)

    Y sobre el asunto que cuando no consulto, lo que entiendo de la macro es que se sale del ciclo, pero si por ejemplo hago una consulta y me muestra la informacion... y luego borro manualmente los criterios en"A2:C2", todavía sigue reflejada la informacion filtrada... a eso me refiero que borre la informacion filtrada, en resumen si no consulto que abajo no aparezca nada y si hice una consulta pero después borro los criterios (quedan en blanco) abajo también quede en blanco, no se si me he explicado bien


    Nuevamente te agradezco por toda la ayuda que me brindas
  8. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola otra vez,

    disculpa, creo que tu te habías explicado muy bien, yo fui el que me enredé...

    prueba esta macro:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2")) Is Nothing Then
            
            Range("A5").CurrentRegion.Clear
            
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                Exit Sub
                
            ElseIf Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                    
            Else
                
                Sheets("Enero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                
                Sheets("Febrero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A" & Rows.Count).End(xlUp).Offset(1)
                    
                
                'Sheets("Marzo").....
    
            End If
    
        End If
        
    End Sub
    subo el archivo para que verifiques su funcionamiento en él, a mi me ha funcionado correctamente ahí según lo que pides, cualquier inconveniente acá seguimos todos pendientes a ver cómo podemos irle dando forma.

    Adjuntos:

  9. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    y acabo de hacerle un ligero cambio en una línea, que de pronto se ajuste más a lo que buscas (en rojo la línea que he modificado):

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        [COLOR="red"]If Not Intersect(Target, Range("A2:C2,H2")) Is Nothing Then[/COLOR]
            
            Range("A5").CurrentRegion.Clear
            
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                Exit Sub
                
            ElseIf Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                    
            Else
                
                Sheets("Enero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A5")
                
                Sheets("Febrero").Range("BD").AdvancedFilter xlFilterCopy, _
                    Range("A1:C2"), Range("A" & Rows.Count).End(xlUp).Offset(1)
                    
                
                'Sheets("Marzo").....
    
            End If
    
        End If
        
    End Sub
  10. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    mjrofra realmente agradezco tu ayuda!

    Era por lo que te iba a consultar (por tu nuevo cambio) ya no necesito re-escribir los criterios, para que me filtre por mes (ahora lo filtra automáticamente (gracias a tu cambio en esa linea), parece que comienzo a entenderle a esto de macros (que sin duda es algo muy amplio y extenso) pero poco a poco creo que entenderé esto, por lo que acudire a ti, si me lo permites

    Mi BD original tiene varios formatos y colores... etc!, lo cual lo quiero eliminar una vez filtre la informacion que busco, en realidad quiero dejarlo con letra Arial, fuente sin color, bien alineado (en columnas y filas) y algo mas no quiero que copie los encabezados de cada hoja (como le hago?), arriba me enviaste un ejemplo pero no pude ver cual es la diferencia...... (en donde me dices tu "o talvez asi") esa macro no me copia los encabezados

    Este es el codigo que logre para la apariencia, es muy posible que tu me lo puedas depurar/limpiar

    Columns("A:p").Select
    With Selection.Font
    .Name = "Arial"
    .Size = 10
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
    .Underline = xlUnderlineStyleNone
    End With

    Selection.Font.Bold = False
    Selection.Interior.ColorIndex = 2
    Selection.Font.ColorIndex = 0
    Columns("A:p").EntireColumn.AutoFit
    Rows("1:500").EntireRow.AutoFit
    ActiveWindow.Zoom = 80
    Range("A1").Select

    Porfavor si no me entiendes en algo, estare pendiente para aclarartelo mas

    Gracias por tu tiempo y tu amabilidad en ayudar!!!
  11. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola, revisa el adjunto a ver si por ahí puede ser... como verás pues yo voy haciendo esto sobre ciertas suposiciones, pues no conozco la estructura de tu archivo original, por lo que estoy suponiendo que es como el que adjunto, si es así, probablemente yo usaría algo parecido a esto:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2,H2")) Is Nothing Then
            
            Range("A5").CurrentRegion.Clear
            
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                Exit Sub
                
            ElseIf Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("A1").CurrentRegion. _
                    AdvancedFilter xlFilterCopy, Range("A1:C2"), Range("A5")
                    
                RestablecerFormato
                    
            Else
                
                Dim Hoja As Worksheet, Fila#
                
                For Each Hoja In Worksheets
                
                    If Hoja.Name <> "Consulta" Then
                    
                        Hoja.Range("A1").CurrentRegion.AdvancedFilter _
                            xlFilterCopy, Range("A1:C2"), Cells(5 + Fila, 1)
                            
                        If Fila <> 0 Then Rows(Fila + 5).Delete
                            
                        Fila = Range("A" & Rows.Count).End(xlUp).Row - 4
    
                    End If
                    
                Next Hoja
                
                RestablecerFormato
                
            End If
    
        End If
        
    End Sub
    Private Sub RestablecerFormato()
    
        With Range("A5").CurrentRegion
        
            .Font.Name = "Arial"
            .Font.Bold = False
            .Font.ColorIndex = 0
            .Interior.ColorIndex = 2
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            
        End With
        
    End Sub

    Adjuntos:

  12. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    y quizás le añadiría la desactualización de pantalla para evitar parpadeos durante el filtrado, así:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2,H2")) Is Nothing Then
        
            [COLOR="red"]Application.ScreenUpdating = False[/COLOR]
            
            Range("A5").CurrentRegion.Clear
            
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                Exit Sub
                
            ElseIf Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("A1").CurrentRegion. _
                    AdvancedFilter xlFilterCopy, Range("A1:C2"), Range("A5")
                    
                RestablecerFormato
                    
            Else
                
                Dim Hoja As Worksheet, Fila#
                
                For Each Hoja In Worksheets
                
                    If Hoja.Name <> "Consulta" Then
                    
                        Hoja.Range("A1").CurrentRegion.AdvancedFilter _
                            xlFilterCopy, Range("A1:C2"), Cells(5 + Fila, 1)
                            
                        If Fila <> 0 Then Rows(Fila + 5).Delete
                            
                        Fila = Range("A" & Rows.Count).End(xlUp).Row - 4
    
                    End If
                    
                Next Hoja
                
                RestablecerFormato
                
            End If
            
            [COLOR="red"]Application.ScreenUpdating = True[/COLOR]
    
        End If
        
    End Sub
    Private Sub RestablecerFormato()
    
        With Range("A5").CurrentRegion
        
            .Font.Name = "Arial"
            .Font.Bold = False
            .Font.ColorIndex = 0
            .Interior.ColorIndex = 2
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            
        End With
        
    End Sub
    si pudieras subir tu archivo, no con los datos originales, pero con la estructura... hojas, formatos.... creo que ganaríamos tiempo, que no soy muy bueno intuyendo :D.

    igual creo que te da una idea y no te será difícil adaptar la macro, igual seguimos acá pendientes.
  13. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    ... jejej, y tal vez quede mejor así la macro para restablecer el formato:

    CÓDIGO:
    Private Sub RestablecerFormato()
    
        With Range("A5").CurrentRegion
        
            .Font.Name = "Arial"
            .Font.Bold = False
            .Font.ColorIndex = xlAutomatic
            .Interior.ColorIndex = xlNone
            .Borders.LineStyle = xlNone
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            
        End With
        
    End Sub
    pero como te digo, esto es intuyendo, que en realidad no sé cómo es el formato final que quieres y cómo es el formato original que tienes. De nuevo, revisa el adjunto nuevamente para que veas lo que yo estoy suponiendo y en realidad creo que no será a partir de eso adaptarlo a tu archivo.

    Adjuntos:

  14. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola mjrofra espero que estés bien!

    Realmente me quito el sombrero, me pongo de pie y te aplaudo por un buen rato!!!
    Mire tu archivo y lo aplique al mio y quedo como anillo al dedo, eres lo máximo, como le haces para saber tanto de VBA???, y si pudieras recomendarme por donde empezar para ir aprendiendo... y quien sabe en un futuro pueda ayudar a los demás en esto de macro ya que de funciones las manejo en un buen porcentaje (pero nunca dejamos de aprender)

    Me has motivado para estudiar este lenguaje de VBA, y comenzare por estudiar la macro que me regalaste, desde ya te digo tendré dudas y si me lo permites te consultare mas adelante.

    La voy a adaptar bien a mi libro y te lo enviare para que lo veas a ver que te parece!

    Nuevamente gracias por tu interés en ayudarme, y que por lo cual a mas de uno este archivo seguramente lo bajaran para modelo y aplicarlos en sus archivos

    No cierro el tema hasta que finalice con mi libro, pero lo hare cuando todo me quede claro
  15. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    mjrofra como te va! mira yo aquí de nuevo, buscando de tu ayuda incondicional

    Ya aplique el codigo, funciono perfecto, pero las hojas en mi libro, su informacion o sea las tablas cada una comienzan en A5 y no en A1 como lo indica tu codigo original

    "busque, modifique y trate de adaptarlo a mis BDs, pero sin éxito" cambiando algunos parámetros pero nada "confieso que si funciona perfecto cuando mis hojas comienzan en A1 c/u pero cuando comienzan en A5 (por ejempo) deja de funcionar el código

    Según tu donde debo modificar o cambiar para que me funcione si mis hojas c/u de ellas comienzan en A5, te repito funciona todo bien pero mis hojas tienen informacion desde A1 hasta I4, y las tablas comienzan en A5


    Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A2:I2,J2")) Is Nothing Then

    Application.ScreenUpdating = False

    Range("A4").CurrentRegion.Clear

    If WorksheetFunction.CountA(Range("A2:I2")) = 0 Then

    Exit Sub

    ElseIf Range("J2") <> Empty Then

    Sheets(Range("J2").Value).Range("A1").CurrentRegion. _
    AdvancedFilter xlFilterCopy, Range("A1:I2"), Range("A4")

    RestablecerFormato

    Else

    Dim Hoja As Worksheet, Fila#

    For Each Hoja In Worksheets

    If Hoja.Name <> "Consulta" Then

    Hoja.Range("A1").CurrentRegion.AdvancedFilter _
    xlFilterCopy, Range("A1:H2"), Cells(5 + Fila, 1)

    If Fila <> 0 Then Rows(Fila + 5).Delete

    Fila = Range("A" & Rows.Count).End(xlUp).Row - 4

    End If

    Next Hoja

    RestablecerFormato

    Application.ScreenUpdating = True

    End If

    End If

    End Sub
    Private Sub RestablecerFormato()

    With Range("A4").CurrentRegion

    .Font.Name = "Arial"
    .Font.Bold = False
    .Font.ColorIndex = xlAutomatic
    .Interior.ColorIndex = xlNone
    .Borders.LineStyle = xlNone
    .EntireColumn.AutoFit
    .EntireRow.AutoFit

    End With

    End Sub

    El error me lo marca en estas lineas, pero no soy capaz de modificarlo para que me funcione

    Hoja.Range("A1").CurrentRegion.AdvancedFilter _
    xlFilterCopy, Range("A1:H2"), Cells(5 + Fila, 1)


    Espero haberme explicado bien... cualquier consulta estaré muy pendiente! para aclararte mas si lo necesitas

    Gracias de antemano
    Última edición: 30 Nov 2009
  16. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    a ver si te entendí bien, prueba así:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Intersect(Target, Range("A2:C2,H2")) Is Nothing Then
        
            Application.ScreenUpdating = False
            
            Range("A5").CurrentRegion.Clear
            
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                Exit Sub
                
            ElseIf Range("H2") <> Empty Then
                
                Sheets(Range("H2").Value).Range("[COLOR="red"]A5[/COLOR]").CurrentRegion. _
                    AdvancedFilter xlFilterCopy, Range("A1:C2"), Range("A5")
                    
                RestablecerFormato
                    
            Else
                
                Dim Hoja As Worksheet, Fila#
                
                For Each Hoja In Worksheets
                
                    If Hoja.Name <> "Consulta" Then
                    
                        Hoja.Range("[COLOR="red"]A5[/COLOR]").CurrentRegion.AdvancedFilter _
                            xlFilterCopy, Range("A1:C2"), Cells(5 + Fila, 1)
                            
                        If Fila <> 0 Then Rows(Fila + 5).Delete
                            
                        Fila = Range("A" & Rows.Count).End(xlUp).Row - 4
    
                    End If
                    
                Next Hoja
                
                RestablecerFormato
                
                Application.ScreenUpdating = True
                
            End If
    
        End If
        
    End Sub
    Private Sub RestablecerFormato()
    
        With Range("A5").CurrentRegion
        
            .Font.Name = "Arial"
            .Font.Bold = False
            .Font.ColorIndex = xlAutomatic
            .Interior.ColorIndex = xlNone
            .Borders.LineStyle = xlNone
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            
        End With
        
    End Sub
    mira el adjunto, ahí he modificado las tablas de cada mes para que inicien en A5 y no en A1.

    Adjuntos:

  17. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Que tal Mauricio!
    No lo puedo creer! casi te puedo jurar que esas lineas fueron las primeras que modifique pero por alguna razon no me funcionaron... lo bueno es que ahora si funciona tal como yo lo requeria, la verdad es que no habra duda de que los demas van a aplicar este codigo para consultas de todas sus paginas que sea similar a mi libro

    Una vez mas te agradezco toda la paciencia que tiviste para ayudarme, solo falta algo que es costumbre mia, preguntar al final si es posible pudieras explicarnos, fase por fase tu grandioso codigo, algunas lineas las comprendo totalmente pero en otras quedo como perdido en el espacio para comprenderlas, se de entrada que como no manejo VBA es por eso que no entiendo al 100%, pero si fueras mas amable... esperare tu explicacion, cuando tengas algun tiempo en hacerlo

    Te envio un gran saludo y que viva la bella Colombia!!!
    Última edición: 1 Dic 2009
  18. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    Hola de nuevo,

    me alegra que haya funcionado bien la macro, copio acá el código comentando cada línea... espero que sea claro. En todo caso lo mejor es ir viendo cómo se ejecuta el código línea a línea. Esto lo puedes hacer poniendo un punto de interrupción al inicio del código y luego cambiando las celdas de la hoja. Así el código quedará interrumpido y podrás ejecutarlo línea a línea presionando F8.

    Para insertar un punto de interrupción al inicio del código, te paras en cualquier parte de la primera línea de la macro:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
    y presionas F9. Entonces quedará resaltada en rojo la primera línea, con un punto rojo a la izquierda. Luego vas a la hoja y cambias una celda, ya sea de las del criterio de autofiltro o no... el código quedará interrumpido en la primera línea y ahora podrás avanzar paso a paso por él presionando F8 y podrás ir viendo lo que hace cada línea.

    espero que la explicación sea clara.

    acá está el código con los comentarios:

    CÓDIGO:
    Private Sub Worksheet_Change(ByVal Target As Range)
        
        'Si la celda que se modifica es A2, B2, C2 o H2 entonces...
        If Not Intersect(Target, Range("A2:C2,H2")) Is Nothing Then
        
            'desactiva la actualización de pantalla
            Application.ScreenUpdating = False
            
            'limpia todo el rango de datos usados adyacentes a A5
            Range("A5").CurrentRegion.Clear
            
            'Si A2, B2 y C2 están vacias entonces...
            If WorksheetFunction.CountA(Range("A2:C2")) = 0 Then
            
                'termina la macro
                Exit Sub
            
            'de lo contrario, si H2 no está vacia entonces...
            ElseIf Range("H2") <> Empty Then
                
                'Aplica el autofiltro a la hoja cuyo nombre coincida con
                'el mes ingresado en H2
                Sheets(Range("H2").Value).Range("A5").CurrentRegion. _
                    AdvancedFilter xlFilterCopy, Range("A1:C2"), Range("A5")
                    
                'ejecuta la macro RestablecerFormato
                RestablecerFormato
                    
            'si H2 está vacia y hay datos en A2, B2 o C2, entonces...
            Else
                
                'dimensiona la variable Hojo y la variable fila
                Dim Hoja As Worksheet, Fila#
                
                'por cada una de las hojas en el libro
                For Each Hoja In Worksheets
                
                    'si el nombre de la hoja es diferente a "Consulta" entonces...
                    If Hoja.Name <> "Consulta" Then
                    
                        'aplica el autofiltro
                        Hoja.Range("A5").CurrentRegion.AdvancedFilter _
                            xlFilterCopy, Range("A1:C2"), Cells(5 + Fila, 1)
                            
                        'si la variable fila es distinta a 0 entonces borra la
                        'de encabezados. Al dimensionar la variable fila como double
                        '(#) esta asume el valor de 0 a menos que se le asigne otro valor
                        If Fila <> 0 Then Rows(Fila + 5).Delete
                            
                        'le asigna el valor de la última fila de datos a la variable fila
                        'y le resta 4 (para que al sumarle 5 dé la fila de encabezados)
                        Fila = Range("A" & Rows.Count).End(xlUp).Row - 4
    
                    End If
                    
                'continua con la siguiente hoja.
                Next Hoja
                
                'ejecuta la macro RestablecerFormato
                RestablecerFormato
                
                'activa la actualizació de pantalla
                Application.ScreenUpdating = True
                
            End If
    
        End If
        
    End Sub
    Private Sub RestablecerFormato()
        
        'toma todo el rango de datos adyacentes a A5
        With Range("A5").CurrentRegion
            
            'aplica el formato deseado...
            .Font.Name = "Arial"
            .Font.Bold = False
            .Font.ColorIndex = xlAutomatic
            .Interior.ColorIndex = xlNone
            .Borders.LineStyle = xlNone
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            
        End With
        
    End Sub
  19. DaneryAngel

    DaneryAngel Usuario

    Registrado:
    11 Ago 2009
    Mensajes:
    78
    Me Gusta recibidos:
    3
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    De nuevo gracias por tu ayuda y enseñanzas ! ahora si comprendo mas el código... y creo que los demás en el foro lo entenderán

    Trate de cerrar el tema, pero en Menu/Herramientas... la opcion "Dar como tema resuelto" ya no esta


    Un fuerte abrazo y muchos saludos
  20. mjrofra

    mjrofra Moderador Staff AyudaExcel

    Registrado:
    28 May 2009
    Mensajes:
    2.686
    Me Gusta recibidos:
    93
    Género:
    Masculino
    Respuesta: Filtrar datos mediante macros (pero de varias hojas)

    con el filtro avanzado no deberías tener problemas con el asterísco para hacer búsquedas... en nombre, por ejemplo, puedes escribir *1 y te traerá todos los nombres terminados en 1. Si es para edad, no deberás usar el * si no los operadores >, <, >=. >=... si quieres buscar todos los nombres terminados en 1 y que tengan de 10 a 19 años, deberás ingresar en los criterios:

    CÓDIGO:
    Nombre	Edad	Edad	Ciudad
    *1	>=10	<20	
    fíjate que he añadido un nuevo criterio de edad, es decir, la edad tiene dos celdas para criterios y por lo tanto el rango de los criterios ya no será A1:c2 si no A1:d2... revisa el adjunto, ahí lo he modificado para que lo revises.

    en el filtro avanzado puedes generar busquedas con el operador "y" y con el operador "o"... si añades criterios de manera horizontal (como en el caso de la edad) estarás haciendo uso del operador "o", es decir, estarás buscando mayores o iguales a 10 y edades menores a 20. Si los usas de manera vertical, estarás usando el operador "o". Para ello tendrás que definir nuevamente los rangos de búsqueda.. pues, por ejemplo, buscar nombres terminados en 1 o en 4 y con edades entre 10 y 19 años, así:

    CÓDIGO:
    Nombre	Edad	Edad	Ciudad
    *1	>=10	<20	
    *4	>=10	<20	
    ahí estarás buscando todos los nombres terminados en 1 con edades entre 10 y 19 años, y todos los nombres terminados en 4 con edades entre 10 y 19 años.

    espero sea de ayuda. revisa el archivo y revisa en la ayuda de excel el filtro avanzado que todo esto está mucho mejor explicado ahí.

    Adjuntos:

Compartir esta página