Jump to content
Maria_80

ANSWERED Macro que me da error al filtrar

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

Share this post


Link to post
Share on other sites

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.

Share this post


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

Share this post


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.

Share this post


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!

Share this post


Link to post
Share on other sites

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!

 

 

Share this post


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!

 

 

 

Share this post


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

Share this post


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!!!! ;).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

INFORMACIÓN BÁSICA SOBRE PROTECCIÓN DE DATOS

Responsable: Sergio Andrés Celemín

Finalidad: Moderar y responder comentarios de usuarios. Recuerda que la información que facilites es pública, y los datos que incluyas los leerá cualquier visitante de esta web, así como el avatar que poseas.

Legitimación: Consentimiento del interesado.

Destinatarios: Hetzner Online GmbH.

Derechos: Puedes ejercitar en cualquier momento tus derechos de acceso,
rectificación, supresión, oposición y demás derechos legalmente establecidos a
través del email sergio@ayudaexcel.com.

Información adicional: Encontrarás más información en la política de privacidad.




×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png