Macro. Copiar filas según condición.
Agradecería también que me ayudara en este otro macro, he separado los dos mensajes para que la respuesta no sea demasiado compleja.
Tengo una hoja en la que se han introducido una serie de registros.
Quisiera copiar en otra hoja sólo aquellas filas que cumplan una condición (La cual aparece en una celda) y que las copie en la hoja cuyo nombre también aparece en una celda.
Tengo una hoja en la que se han introducido una serie de registros.
Quisiera copiar en otra hoja sólo aquellas filas que cumplan una condición (La cual aparece en una celda) y que las copie en la hoja cuyo nombre también aparece en una celda.
Respuesta de Eduard Caballero
3
3
Eduard Caballero, Usuario a nivel Intermedio/Avanzado de Excel
Tus datos son muy escasos pero te coloco este ejemplo.
Acá tienes este ejemplo. Los datos serian nombre y empresa. La condición que pertenezcan a la empresa a
Sub copia()
Sheets(1).Select
Range("B2").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = "a" Then
nombre = ActiveCell
empresa = ActiveCell.Offset(0, 1)
Sheets(2).Select
Range("A65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = nombre
ActiveCell.Offset(0, 1) = empresa
Sheets(1).Select
ActiveCell.Offset(1, 0).Select
Acá tienes este ejemplo. Los datos serian nombre y empresa. La condición que pertenezcan a la empresa a
Sub copia()
Sheets(1).Select
Range("B2").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = "a" Then
nombre = ActiveCell
empresa = ActiveCell.Offset(0, 1)
Sheets(2).Select
Range("A65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveCell = nombre
ActiveCell.Offset(0, 1) = empresa
Sheets(1).Select
ActiveCell.Offset(1, 0).Select
Hola otra vez,
Antes que nada, gracias por ayudarme de manera desinteresada.
Voy a intentar dar los datos exactos de la macro que quiero conseguir:
1. Me encuentro en una hoja inicial en la cual hay una celda "D2" que tiene un número que será la condición.
2. El nombre de la hoja inicial desde donde se ejecuta la macro, varía. Por lo tanto no se como añadir a la macro que no tenga en cuenta el nombre de la hoja desde donde se ejecuta para luego, al final del proceso, vuelva a ella sin tener en cuenta el nombre.
3. Quisiera que al ejecutar la macro, fuese a la hoja "01.Entrada" y en el rango "B13:M500" copiase sólo las filas en las cuales la columna "B13:B500" cumpla la condición, la cual se encuentra en la hoja inicial del proceso, en la celda "D2".
4.Para terminar, que vuelva a la hoja inicial sin importar como se llame y que pegue las filas desde la celda "B11" en adelante.
Trato de restarle importancia al nombre de la hoja porque la macro se va a ejecutar en hojas de diferentes nombres y quiero evitar crear 100 macros, una para cada hoja cumpliendo el nombre exacto de la hoja.
Había pensado que estando en la hoja activa, copiase las filas deseadas pero sin activar ninguna otra hoja para evitar el lío de los nombres, pero no se si eso será posible, porque no se si se puede seleccionar un rango de una hoja sin desplazarse a ella.
Pido disculpas por la extensión de la cuestión, pero sólo llevo dos días en esto de las macros y es un proyecto que llevo entre manos mucho tiempo.
Espero haberme explicado lo suficiente, si no es así dímelo por favor.
Infinidad de gracias de nuevo.
Un saludo!
Antes que nada, gracias por ayudarme de manera desinteresada.
Voy a intentar dar los datos exactos de la macro que quiero conseguir:
1. Me encuentro en una hoja inicial en la cual hay una celda "D2" que tiene un número que será la condición.
2. El nombre de la hoja inicial desde donde se ejecuta la macro, varía. Por lo tanto no se como añadir a la macro que no tenga en cuenta el nombre de la hoja desde donde se ejecuta para luego, al final del proceso, vuelva a ella sin tener en cuenta el nombre.
3. Quisiera que al ejecutar la macro, fuese a la hoja "01.Entrada" y en el rango "B13:M500" copiase sólo las filas en las cuales la columna "B13:B500" cumpla la condición, la cual se encuentra en la hoja inicial del proceso, en la celda "D2".
4.Para terminar, que vuelva a la hoja inicial sin importar como se llame y que pegue las filas desde la celda "B11" en adelante.
Trato de restarle importancia al nombre de la hoja porque la macro se va a ejecutar en hojas de diferentes nombres y quiero evitar crear 100 macros, una para cada hoja cumpliendo el nombre exacto de la hoja.
Había pensado que estando en la hoja activa, copiase las filas deseadas pero sin activar ninguna otra hoja para evitar el lío de los nombres, pero no se si eso será posible, porque no se si se puede seleccionar un rango de una hoja sin desplazarse a ella.
Pido disculpas por la extensión de la cuestión, pero sólo llevo dos días en esto de las macros y es un proyecto que llevo entre manos mucho tiempo.
Espero haberme explicado lo suficiente, si no es así dímelo por favor.
Infinidad de gracias de nuevo.
Un saludo!
Acá tienes
Sub copia()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("b" & i & ":" & "m" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Recuerda finalizar la respuesta
Sub copia()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("b" & i & ":" & "m" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Recuerda finalizar la respuesta
Hola de nuevo,
Debe de tener algún ligero problema, dentro del rango de selección "B13", me copia sólo la primera fila que cumple la condición de la columna B. He probado cambiar ese rango B13 por B13:B100000, y me copia la primera fila pero 100.000 veces la misma. Debe ser algún pequeño error, pero ya está cerca.
Pego la macro con mis datos modificados:
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("b" & i & ":" & "m" & i).Copy
Sheets(hoja).Select
Range("B11:B100000").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Muchísimas gracias de nuevo.
Un saludo!
Debe de tener algún ligero problema, dentro del rango de selección "B13", me copia sólo la primera fila que cumple la condición de la columna B. He probado cambiar ese rango B13 por B13:B100000, y me copia la primera fila pero 100.000 veces la misma. Debe ser algún pequeño error, pero ya está cerca.
Pego la macro con mis datos modificados:
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("b" & i & ":" & "m" & i).Copy
Sheets(hoja).Select
Range("B11:B100000").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Muchísimas gracias de nuevo.
Un saludo!
Eso no es el rango de selección este es el rango de selección a copiar
Range("b" & i & ":" & "m" & i).Copy
B13 es la celda donde se sitúa para comenzar a analizar los datos de la hoja de entrada.
Ese código esta probado con la hoja activa que debe ser donde vas a copiar los datos. Algo estar haciendo mal
Range("b" & i & ":" & "m" & i).Copy
B13 es la celda donde se sitúa para comenzar a analizar los datos de la hoja de entrada.
Ese código esta probado con la hoja activa que debe ser donde vas a copiar los datos. Algo estar haciendo mal
No se que está mal:
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("B13" & i & ":" & "M100000" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Lo que hace la macro ahora es que en la hoja "01.Entrada", se queda en la primera celda vacía que encuentra en el rango B13:B65000.
Gracias de nuevo!
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("B13" & i & ":" & "M100000" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Lo que hace la macro ahora es que en la hoja "01.Entrada", se queda en la primera celda vacía que encuentra en el rango B13:B65000.
Gracias de nuevo!
Amigo no modifiques el rango, tal cual como te pase el código funciona
Range("B13" & i & ":" & "M100000" & i).Copy Esto esta mal
Range("b" & i & ":" & "m" & i).Copy Asi esta bien
Range("B13" & i & ":" & "M100000" & i).Copy Esto esta mal
Range("b" & i & ":" & "m" & i).Copy Asi esta bien
No me funciona. Dentro del rango donde debe de buscar la condición, se para en la primera celda vacía que encuentra.
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("B13" & i & ":" & "M100000" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Debe de ser una tontería.
Gracias por el tiempo que me dedicas.
Un saludo!
Sub ImportarDatos()
Application.ScreenUpdating = False
Range("D2").Select
hoja = ActiveSheet.Name
valor = Range("D2")
Sheets("01.Entrada").Select
Range("B13").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = valor Then
i = Selection.Row
Range("B13" & i & ":" & "M100000" & i).Copy
Sheets(hoja).Select
Range("B11").Select
If ActiveCell = "" Then
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
Else
Range("B65000").End(xlUp).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("01.Entrada").Select
End If
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Sheets(hoja).Select
Application.ScreenUpdating = True
End Sub
Debe de ser una tontería.
Gracias por el tiempo que me dedicas.
Un saludo!
Creo que ya se donde esta el problema.
Resulta que en el rango B13:B500, hay celdas vacías entre medio y la macro esta diseñada para una columna sin celdas vacías en medio y que se pare cuando encuentre una celda vacía, es decir, la última, por eso se detenía a la tercera fila de la base de datos.
No se si es muy complicado introducir esa variable en la macro, en caso de serlo, no te preocupes, en lugar de dejarlas vacías, pondré un "-" o un "0".
Muchísimas gracias por dedicarme tu tiempo. Perdón por las molestias.
No finalizo la pregunta hasta que me contestes por si después de finalizarla no pudieras hablarme.
De todas formas un 10 sobre 10 para tu aportación!
Un saludo!
Resulta que en el rango B13:B500, hay celdas vacías entre medio y la macro esta diseñada para una columna sin celdas vacías en medio y que se pare cuando encuentre una celda vacía, es decir, la última, por eso se detenía a la tercera fila de la base de datos.
No se si es muy complicado introducir esa variable en la macro, en caso de serlo, no te preocupes, en lugar de dejarlas vacías, pondré un "-" o un "0".
Muchísimas gracias por dedicarme tu tiempo. Perdón por las molestias.
No finalizo la pregunta hasta que me contestes por si después de finalizarla no pudieras hablarme.
De todas formas un 10 sobre 10 para tu aportación!
Un saludo!
Eso es correcto se para en la celda vacia. Prefiero usar while eso un for.
Si se sale del while no hay forma de volver a comenzar el ciclo a menos que coloques un go to para iniciar nuevamente en una linea pero entraría en un loop cuando verdaderamente finalice los datos.
Podrías modificarlo con un for si es tu necesidad pero yo eliminarías las filas en blanco
Finaliza la pregunta si el objetivo esta cumplido
Si se sale del while no hay forma de volver a comenzar el ciclo a menos que coloques un go to para iniciar nuevamente en una linea pero entraría en un loop cuando verdaderamente finalice los datos.
Podrías modificarlo con un for si es tu necesidad pero yo eliminarías las filas en blanco
Finaliza la pregunta si el objetivo esta cumplido
- Compartir respuesta
4 comentarios
Ocultar comentarios
Hola, me podrían ayudar quiero hacer una macro en donde el registro general se capturan todos los datos del trabajador, pero quiero que en las siguientes hojas por ejemplo en la hoja "alta" se copien todos los datos de los empleados clasificados como alta, en la hoja "baja" todos los empleados dados de baja pero que se copien automáticamente al capturarse en el registro general - Naxhiely Morales
Si te es posible realiza un bosquejo o un pequeño ejemplo. Recuerda que no vemos las estructura de tu archivo y así es difícil. - Eduard Caballero
Buenas tardes, estoy intentando copiar la fórmula tal cual y no la hago funcionar. - Pablo Vidal
Pablo que error tienes? - Eduard Caballero