Copiar filas pero si reunen una condicion
Me gustaria una macro para copiar filas determinadas siempre y cuando reunan una condicion. Seria copiar de Una Hoja y pegar en Otra distinta. El unico problema que no son filas consecutivas y al pegar deben quedar de forma consecutiva, sin filas en blanco.
En la tabla (Hoja1) existen datos (bombero, apellidos, rango... Etc), lo que ocurre, es que no todos trabajan para la mismo compañia y por ese motivo cuando los quiero pegar en la Hoja2, solo quiero pasar los de una compañia.
1 Respuesta
Deja una imagen de la hoja de origen donde se vean los encabezados de filas y col.
Si no se van a pegar en la misma ubicación (es decir que los datos de origen están en ciertas col y en destino estarán en otras col) debes dejar también imagen de la hoja destino.
Y también aclara cómo le vas a indicar la condición (con un InputBox, seleccionando alguna compañia,¿...?
Como se muestra en las imagenes, en la primera, en la columna B, pone “Comp”, entonces quiero que si pone “FRS” toda la fila desde C hasta L se copie en la segunda Hoja (imagen 2)
Eso si, teniendo en cuenta que como se ve no va de forma continua. En la imagen 2, dichas filas seleccionadas se copiar a partir de C12:L12 y va copiando hacia abajo.
¿Qué ya hayas valorado la consulta significa que ya no te interesa seguir con el tema? ¿O prefieres esperar la respuesta? (Te recuerdo que hoy es domingo! ! ! !)
Sdos!
No quedó aclarado cómo solicitarás el criterio a filtrar, así que la macro lo solicita con un InputBox.
Entrá al Editor de macros (atajo de teclado: ALT y F11).
Insertá un módulo y allí copiá lo siguiente:
Sub PaseFiltrado() 'x Elsamatilde 'se establece la hoja destino y se guarda la primer fila para el pegado Set ho2 = Sheets("Hoja2") ini = ho2.Range("C" & Rows.Count).End(xlUp).Row + 1 'si la hoja no tiene filtros aplicados se los coloca If ActiveSheet.AutoFilterMode = False Then [A1:L1].AutoFilter Else 'se quitan los posibles filtros If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If 'se solicita el criterio crit = InputBox("Ingresa el criterio") If IsEmpty(crit) Then Exit Sub Application.ScreenUpdating = False 'se establece el fin de rango total x = Range("A" & Rows.Count).End(xlUp).Row 'se filtra x col B ActiveSheet.Range("$A$1:$L$" & x).AutoFilter Field:=2, Criteria1:=crit 'se mira si hay registros filtrados y = Range("A" & Rows.Count).End(xlUp).Row 'se copia el rango ubicándolo en col correspondientes If y > 1 Then 'por col 'Range("A2:A" & y).Copy Destination:=ho2.Range("B" & ini) 'por rango Range("C2:K" & y).Copy Destination:=ho2.Range("C" & ini) Else MsgBox "No hay datos con este criterio" End If 'se quitan los filtros de hoja activa If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData MsgBox "Registros pasados." End Sub
Fijate que dejé 2 tipos de pase luego de la línea que dice: If y > 1
Esto es porque parece que la col de Nros no se pasa... y si se pasa tiene que ser de modo individual, no por rango porque los datos no caen en las mismas columnas. Cualquier duda me comentas.
Para ejecutarlo podés llamar a la macro desde la ficha Desarrollador, o desde el mismo Editor. Otros modos de llamar a una macro los tengo explicados en la sección Macros de mi sitio que dejo al pie.
Probala y comentame. Si el tema queda resuelto espero mejores tu valoración.
Intentare explicarme mejor:
En la Hoja “Data” yo introduzco una serie de datos a partir de la fila 65. Lo que hice fue asignar a cada empleado un numero, por eso en la columna A (Nr.) introduje el numero de empleado y automáticamente los coloca. Lo que ocurre que la columna B (Comp) tiene dos opciones “Armas” o “FRS”. Lo que necesito que la Hoja “Data”, de la fila 2 hasta la fila 62, los empleados de la compañía “FRS” los pegue en la Hoja “FRS Crew List” a partir de la fila C12. Lo que puedes ver que se pasa parte de los datos, las columna (Hoja “Data”) no pega la columna F (Code) y la columna L (Tipo Doc), debe pegar las columnas C, DE, E, G, I, J, K.
Gracias.
¿La pregunta sigue siendo cuándo vas a pasar estos datos?
- Recorriendo la tabla como está la macro ahora parece que no te satisface.
- Al colocar el nro de empleado tampoco puede ser porque aún NO tendrías las otras celdas rellenas... o tus celdas desde B hasta L tienen fórmulas?
Ah... por eso solicito los libros. No se ve cómo llenas las celdas en rango B:L
- Si es por ingreso manual, recién se puede pasar a la otra hoja al finalizar la carga de ese registro, ya sea con un atajo de teclado o algún otro modo que ya veremos.
- Si es por fórmula se pasará al momento de ingresar ese nro.
Confirma
Imagen 1, Como se puede ver en la columna A pongo el numero de empleado y el programa coloca los datos siguiendo la fórmula que se muestra en la imagen.
Posteriormente es la macro que estoy buscando, si la compañía es FRS (columna B) pasa a otra hoja.
Estoy intentando preparar un Word con las imágenes y flechas pero dado que el PC del trabajo se encuentra bloqueado me Cuesta bastante
Oh... qué pena no haberme comentado o mostrado desde un inicio que se rellena con fórmulas. Toda aclaración es necesaria para saber dónde y cómo ejecutar una macro.
Entonces cuando rellenas la col A es cuando debe ejecutarse la macro.
Dame un tiempito para cambiar la macro enviada por otra ;(
Sdos!
Afirmativamente. Esa tabla la uso como base de datos, por llamarlo así. Y de ahí reparto los datos que me hagan falta a las otras hojas
gracias
En el Editor, selecciona desde el margen izquierdo, el objeto HOJA que tiene la Data.
Y allí copiá este código. Ajusta el nombre de tu hoja destino.
Private Sub Worksheet_Change(ByVal Target As Range) 'x Elsamatilde 'se ejecuta al ingresar datos en col A, a partir de fila 2 If Target.Value = "" Then Exit Sub If Target.Column <> 1 Or Target.Row = 1 Then Exit Sub 'solo se ejecuta si el resultado en col B es FRS If Target.Offset(0, 1) = "FRS" Then 'pase de datos ---- AJUSTAR EL NOMBRE DE LA HOJA DE DESTINO Set ho2 = Sheets("Hoja2") ini = ho2.Range("C" & Rows.Count).End(xlUp).Row + 1 Application.ScreenUpdating = False 'pase de la col C ....> a col C 'Range("C" & Target.Row).Copy 'ho2.Range("C" & ini).PasteSpecial (xlValues) 'pase de la col C:E y luego G:K ...> a las mismas Range("C" & Target.Row & ":E" & Target.Row).Copy ho2.Range("C" & ini).PasteSpecial (xlValues) Range("G" & Target.Row & ":K" & Target.Row).Copy ho2.Range("G" & ini).PasteSpecial (xlValues) Application.CutCopyMode = False End If End Sub
Se ejecutará cada vez que ingreses manualmente un dato en col A de tu hoja Data y si en B aparece el texto FRS.
Observa que dejé 2 líneas inhabilitadas y es para realizar un pase solo de una columna. La dejo para que la tengas presente si necesitas completar alguna otra col que no está contemplada en la macro o imagen.
PD) No responderé más sobre esta misma consulta... fuiste agregando o aclarando de a un detalle por vez. Si ahora, todavía hay algo que no se contempló te pediré que valores hasta aquí y dejes una nueva consulta. Con mucho gusto te seguiré asistiendo.
Sdos!
- Compartir respuesta