Jump to content

Macro que me da error al filtrar


Go to solution Solved by Luis paz,

Recommended Posts

Hola! Os adjunto un fichero con dos pestañas (ORIGEN Y DESTINO). En la pestaña origen pego una serie de datos cada día, PRODUCTOS y SERVICIOS. Lo que hago es crear un filtro para cada uno y pegarlo luego en la pestaña destino (FILA 7). Os envío un ejemplo donde le digo que filtre y no registros, así que al pegar en la pestaña destino a pesar de decirle que copie la celda dos, por alguna razón me pega el encabezado!!! No sé dónde está el problema! Alguna sugerencia? O idea para meterle algún filtro y que si no hay datos al filtrar no pegue en la pestaña destino? Gracias!!

 

Ejemplo.7z

Link to post
Share on other sites

@Maria_80 , en estos casos lo meor es depurar la macroen el VBE, paso a pasocon F8 para ver qué hace la macro. Entu caso (y en el archivo que has subido), filtras  el campo 6 por "SERVICIO"... ¡¡¡ pero no hay ningún SERVICIO en esa columna !!! :huh:

De esa manera al filtrar ocultas TODAS las filas, así que al calcular la última fila, pues esta es la primera, la de encabezado

Link to post
Share on other sites
15 hours ago, JSDJSD said:

Hola  Maria_80, sube un ejemplo con el antes y el después, es decir en hoja Origen los datos que quieres filtrar que por lo que veo estan claros, el criterio por el cual deseas filtrar y como debe quedar lo filtrado en hoja destino.

Hola! Os lo cuento abajo... Tengo una hoja ORIGEN con dos TIPOS: PRODUCTO Y SERVICIO. Luego tengo dos hojas DESTINO una para cada uno. El ejemplo que os adjunto es la hoja destino de uno de ellos para el que caso en el que en la hoja ORIGEN no exista nada al filtrar. No sé cómo añadir ahí una excepción, para cuando se de ese caso... Lo suyo sería un IF "no hay datos en el filtro" THEN "que se salte el proceso de pegar en hoja destino. No sé hacerlo. Lo intenté de mil maneras y no doy con la solución.

Link to post
Share on other sites
12 hours ago, Haplox said:

@Maria_80 , en estos casos lo meor es depurar la macroen el VBE, paso a pasocon F8 para ver qué hace la macro. Entu caso (y en el archivo que has subido), filtras  el campo 6 por "SERVICIO"... ¡¡¡ pero no hay ningún SERVICIO en esa columna !!! :huh:

De esa manera al filtrar ocultas TODAS las filas, así que al calcular la última fila, pues esta es la primera, la de encabezado

Hola, Haplox. Monté todo un proceso en el que en esa hoja de inicio hay dos tipos PRODUCTO Y SERVICIO, me encontré con el caso de que a veces no existe uno de los dos. Cuando eso sucede no he sabido cómo decirle que entonces no pegue nada en la hoja destino. El ejemplo que os adjunto es para el caso de que no tenga nada que filtrar. Qué hago en ese caso? 

Como no sé añadir ahí un IF si no hay datos que filtrar THEN no pegues en la hoja destino (lo intenté pero no doy con ello). Alguna sugerencia?

Gracias!

Link to post
Share on other sites
  • Solution

Hola Maria, Intenta con lo siguiente:

Sub prueba_filtro()
    Dim celda As Range, rng As Range
    Dim UFO As Variant, UFD As Variant
    Applicat False
    'Quitamos filtro si lo hay
    If Origen.FilterMode Then Origen.ShowAllData
    'filtramos
    Origen.Range("F1").AutoFilter Field:=6, Criteria1:="SERVICIO"
    'Para pegar los datos de LA FECHA
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    If UFO = 1 Then: GoTo Nada
    'Origen.Range("G2:G" & UltimaFila).Copy Destination:=Destino.Cells(7, 3)
    
    Set rng = Origen.Range("F2:F" & UFO)
    For Each celda In rng
        If celda.EntireRow.Hidden = False Then
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            Destino.Range("C" & UFD).Value = Origen.Range("G" & celda.Row).Value
        End If
    Next celda

Nada:
Applicat True
End Sub


Function Applicat(TrueFalse As Variant)
    Application.ScreenUpdating = TrueFalse
    If TrueFalse = False Then: Application.Calculation = xlCalculationManual: Else: Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = TrueFalse
    ActiveSheet.DisplayPageBreaks = TrueFalse
End Function

 

 

Aun que no entiendo porqué te complicas con el filtro. Lo que estás haciendo es pasar los datos que cumplen con una condición, que podrías conseguirlo de igual manera con un For

Sub ConFor()
    Dim UFO As Variant, UFD As Variant, i As Variant
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To UFO
        If Origen.Cells(i, 6).Value = "SERVICIO" Then
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            Destino.Cells(UFD, 3).Value = Origen.Cells(i, 7).Value
        End If
    Next i
End Sub

 

Saludos!

 

 

Link to post
Share on other sites
11 minutes ago, Luis paz said:

Hola Maria, Intenta con lo siguiente:


Sub prueba_filtro()
    Dim celda As Range, rng As Range
    Dim UFO As Variant, UFD As Variant
    Applicat False
    'Quitamos filtro si lo hay
    If Origen.FilterMode Then Origen.ShowAllData
    'filtramos
    Origen.Range("F1").AutoFilter Field:=6, Criteria1:="SERVICIO"
    'Para pegar los datos de LA FECHA
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    If UFO = 1 Then: GoTo Nada
    'Origen.Range("G2:G" & UltimaFila).Copy Destination:=Destino.Cells(7, 3)
    
    Set rng = Origen.Range("F2:F" & UFO)
    For Each celda In rng
        If celda.EntireRow.Hidden = False Then
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            Destino.Range("C" & UFD).Value = Origen.Range("G" & celda.Row).Value
        End If
    Next celda

Nada:
Applicat True
End Sub


Function Applicat(TrueFalse As Variant)
    Application.ScreenUpdating = TrueFalse
    If TrueFalse = False Then: Application.Calculation = xlCalculationManual: Else: Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = TrueFalse
    ActiveSheet.DisplayPageBreaks = TrueFalse
End Function

 

 

Aun que no entiendo porqué te complicas con el filtro. Lo que estás haciendo es pasar los datos que cumplen con una condición, que podrías conseguirlo de igual manera con un For


Sub ConFor()
    Dim UFO As Variant, UFD As Variant, i As Variant
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To UFO
        If Origen.Cells(i, 6).Value = "SERVICIO" Then
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            Destino.Cells(UFD, 3).Value = Origen.Cells(i, 7).Value
        End If
    Next i
End Sub

ey! muchas gracias! llevo solo unos meses con visual basic (lo había usado antes de forma puntual) y entonces para algunas cosas intento usar el lenguaje más simple posible para entenderlo. Pero la segunda solución que me diste, me parece increíble! Es plantearlo todo de otra manera y mola! Quizás más difícil de entender al principio, pero lo simplifica todo mucho más. Muchísimas gracias!

Saludos!

 

 

 

Link to post
Share on other sites

@Maria_80

Entiendo, todas pasamos por lo mismo al principio... Te explico un poco 

Sub ConFor()
    'Declaramos las variables
    Dim UFO As Variant, UFD As Variant, i As Variant
    'Para que funcione la macro debes cambiar el nombre de las Hojas. Ve la Imagen adjunta
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    'For es un repetidos o bucle, que va en función a los datos que señales, en este caso
    'le indicamos la variable i, pero podría ser cualquier otra como var, cel,dksn, etc.
    'la palabra "to UFO" hace referencia a que "i" irá desde el 2 (i=2) hasta UFO(10 por ejemplo).
    For i = 2 To UFO
    'Entonces el for acaba hasta Next y vuelve a empezar pero ahora con el siguiente valor,
    'si la primera vez i=2 entonces la segunda será i=3 y así hasta llegar a UFO
        'Aquí tenemos la condición Si tipo=Servicio entonces...
        If Origen.Cells(i, 6).Value = "SERVICIO" Then
            'Detectamos la última fila de la hoja destino para saber en donde colocamos el siguiente dato
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            'En lugar de copiar, sólo pasamos los valores de las celdas de Origen a Destino
            Destino.Cells(UFD, 3).Value = Origen.Cells(i, 7).Value
        End If
    Next i
End Sub

image.thumb.png.e1688464e9d99d99b81e698c2d4b70eb.png

Link to post
Share on other sites
20 minutes ago, Luis paz said:

@Maria_80

Entiendo, todas pasamos por lo mismo al principio... Te explico un poco 


Sub ConFor()
    'Declaramos las variables
    Dim UFO As Variant, UFD As Variant, i As Variant
    'Para que funcione la macro debes cambiar el nombre de las Hojas. Ve la Imagen adjunta
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    'For es un repetidos o bucle, que va en función a los datos que señales, en este caso
    'le indicamos la variable i, pero podría ser cualquier otra como var, cel,dksn, etc.
    'la palabra "to UFO" hace referencia a que "i" irá desde el 2 (i=2) hasta UFO(10 por ejemplo).
    For i = 2 To UFO
    'Entonces el for acaba hasta Next y vuelve a empezar pero ahora con el siguiente valor,
    'si la primera vez i=2 entonces la segunda será i=3 y así hasta llegar a UFO
        'Aquí tenemos la condición Si tipo=Servicio entonces...
        If Origen.Cells(i, 6).Value = "SERVICIO" Then
            'Detectamos la última fila de la hoja destino para saber en donde colocamos el siguiente dato
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            'En lugar de copiar, sólo pasamos los valores de las celdas de Origen a Destino
            Destino.Cells(UFD, 3).Value = Origen.Cells(i, 7).Value
        End If
    Next i
End Sub

image.thumb.png.e1688464e9d99d99b81e698c2d4b70eb.png

mil gracias! qué apañao! pues mira! eso de las hojas alguna vez he tenido problemas y seguramente tuviera el mismo tipo de error! Gracias por todo!!!! ;).

Link to post
Share on other sites
  • 2 weeks later...
On 5/21/2020 at 4:51 PM, Luis paz said:

@Maria_80

Entiendo, todas pasamos por lo mismo al principio... Te explico un poco 


Sub ConFor()
    'Declaramos las variables
    Dim UFO As Variant, UFD As Variant, i As Variant
    'Para que funcione la macro debes cambiar el nombre de las Hojas. Ve la Imagen adjunta
    UFO = Origen.Cells(Rows.Count, 1).End(xlUp).Row
    'For es un repetidos o bucle, que va en función a los datos que señales, en este caso
    'le indicamos la variable i, pero podría ser cualquier otra como var, cel,dksn, etc.
    'la palabra "to UFO" hace referencia a que "i" irá desde el 2 (i=2) hasta UFO(10 por ejemplo).
    For i = 2 To UFO
    'Entonces el for acaba hasta Next y vuelve a empezar pero ahora con el siguiente valor,
    'si la primera vez i=2 entonces la segunda será i=3 y así hasta llegar a UFO
        'Aquí tenemos la condición Si tipo=Servicio entonces...
        If Origen.Cells(i, 6).Value = "SERVICIO" Then
            'Detectamos la última fila de la hoja destino para saber en donde colocamos el siguiente dato
            UFD = Destino.Cells(Rows.Count, 3).End(xlUp).Row + 1
            'En lugar de copiar, sólo pasamos los valores de las celdas de Origen a Destino
            Destino.Cells(UFD, 3).Value = Origen.Cells(i, 7).Value
        End If
    Next i
End Sub

image.thumb.png.e1688464e9d99d99b81e698c2d4b70eb.png

Hola, Luis. Necesito abrir de nuevo el hilo para hacerte una consulta. Sigo con esto! al fin lo conseguí adaptar a lo mío, pero no consigo que los datos se peguen correctamente en las hojas de destino. Bueno! He conseguido que se peguen a partir de C5 pero el problema es que solo me pega una línea! Podrías echarle un ojo? Gracias! Ej_foro.xlsm

 

 

Link to post
Share on other sites

Te interesaría este tipo de formulario, en el cual puedes filtrar por cualquier campo que desees e incluso concatenar varios filtros, es decir que si filtras por campo1 te mostraría en el listbox lo filtrado y eso mismo lo puedes volver a filtrar por cualquiera otrocampo y así cuantas veces necesites.

Este formulario y código es del Maestro Cacho Rodríguez.Video.mkv

Link to post
Share on other sites
En 1/6/2020 at 10:19 , Maria_80 dijo:

Hola, Luis. Necesito abrir de nuevo el hilo para hacerte una consulta. Sigo con esto! al fin lo conseguí adaptar a lo mío, pero no consigo que los datos se peguen correctamente en las hojas de destino. Bueno! He conseguido que se peguen a partir de C5 pero el problema es que solo me pega una línea! Podrías echarle un ojo? Gracias! Ej_foro.xlsm

 

 

Hola @Maria_80 no estoy seguro de haber entendido bien, pero adjunto tu archivo,Ej_foro.xlsm

Saludos 

Link to post
Share on other sites
×
×
  • Create New...

Important Information

Privacy Policy