Macro: Copiar y pegar de una hoja a otra

11/06/2007 - 00:28 por Bucanero | Informe spam
Hola,
Tengo un problemilla, y es que tengo una hoja en la que estan los datos
globales que obtengo todas las semanas, de los cuales al aplicales una serie
de filtros, voy obteniendo unos datos que copio y pego en otra hoja
manualmente. Esto lo quiero hacer con una macro, con la cual al aplicar el
primer filtro lo copia y lo pega en la otra hoja, pero al aplicar el
siguiente filtro lo copia y lo pega encima del anterior. lo que necesito es
saber como puedo identificar la primera celda de la fila que está vacía
despues de pegar la primera serie de filas obtenidas con el primer filtro
(utilizo 11 filtros y 20 columnas ).
Muchas gracia de antemano por vuestra ayuda.

Preguntas similare

Leer las respuestas

#16 Bucanero
17/06/2007 - 13:35 | Informe spam
Hola de nuevo,

Estoy a punto de acabar mi jornada laboral. He estado probando y probando
con ficheros mucho mayores (7560 filas) y que quieres que te diga.. que
es una maravilla. Lo que aún no he sido capaz de lograr es introducir los
filtro que te comente en las otras hojas, pero luego seguiré intentandolo.
Por lo demás, sobran los comentarios, la califico de maravilla o superior. de
verdad muchas gracias por tu ayuda.

Un saludo.

PD: No me enrrollo mucho aquí que tenemos los equipo y las lineas capadas.


"Bucanero" escribió:

Hola,
Tengo un problemilla, y es que tengo una hoja en la que estan los datos
globales que obtengo todas las semanas, de los cuales al aplicales una serie
de filtros, voy obteniendo unos datos que copio y pego en otra hoja
manualmente. Esto lo quiero hacer con una macro, con la cual al aplicar el
primer filtro lo copia y lo pega en la otra hoja, pero al aplicar el
siguiente filtro lo copia y lo pega encima del anterior. lo que necesito es
saber como puedo identificar la primera celda de la fila que está vacía
despues de pegar la primera serie de filas obtenidas con el primer filtro
(utilizo 11 filtros y 20 columnas ).
Muchas gracia de antemano por vuestra ayuda.
Respuesta Responder a este mensaje
#17 Bucanero
18/06/2007 - 19:03 | Informe spam
Hola, que tal.

Bueno quieo comentarte que funciona correctamente y als mil maravillas, lo
que no consigo es meter otros filtros para otras hojas. Necesitaria meter
filtros en tres hojas deferentes. Sabrias decirme como? Gracias

Un saludo

"Bucanero" escribió:

Buenos dias,

Siento no harberte dicho nada ayer, pero salí de cdasa a las 5:30 am y
regresé a las 22:30, (me super explotaron en el curro). En fin, he probado a
copiar la macro en el mismo libro, y empieza afuncionar pues ya no me dá el
error 9, pero al porer todos los elementos de filtrado, me dice: "Se ha
producido el error 13 en tienpo de ejecución. No coinciden los tipos."

Esto me aparece al llegar a la línea que te indico a continuación:

Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String, _
matrizCriterios, n As Integer
With ThisWorkbook
Set BD = .Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
.[v1:v2].ClearContents
End With
For Each hj In .Worksheets
With hj
If .Name <> "lanorf" Then
BD.[a1:t1].Copy .[a1]
If .Name = "A-320" Then _
matrizCriterios = Array(",e2>!5000,e2<!6100)", _
",e2>!3100,e2<!3900) ", _
",e2$2100)", _
",e2&1200)", _
",e2(4200)", _
",e2>61100,e261200)", _
",e262200)", _
",e2&1300)", _
",e2>I0000,e2<I9000)", _
",e2>p0000,e2<y0000)")

**==> For n = LBound(matrizCriterios) To UBound(matrizCriterios)
<==**

ultF = .[c65536].End(xlUp).Row + 1
rngDestino = "a" & ultF & ":t" & ultF
criterio = "=and(c2=""" & .Name & """" & matrizCriterios(n)
With BD
.[v2].Formula = criterio
ultF_BD = .[c65536].End(xlUp).Row
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, _
criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), _
unique:=False
.[v2].Clear
End With
.Rows(ultF).Delete
Next
.Columns.AutoFit
End If
End With
Next
End With
Set BD = Nothing
End Sub

Te la he copiado completa por si tu ves alguna que otra metedura de pata que
haya podido cometer (cosa muy normal en mi).

En fin, no puedo continuar en este momento pues tengo que seguir currando.

Gracias otra vez.

"Ivan" escribió:

> On 13 jun, 23:26, Bucanero wrote:
> > Hola, ya estoy aquí, soy el pesado de siempre.
> >
> > He probado lo que me has dicho y sigo igual. No obstante creo que también se
> > podria filtar por la columna "E" que es la que tiene más criterios de
> > filtrado y luego por la columna "C" que son criterios fijos y quizas más
> > facil de copiar y pegar en las otras hojas.
> >
> > Seguiré intentandolo y te lo comento.
> >
> > Si quieres que te envie el famoso fichero dimelo. Mi correo es:
> >
> >
> >
> > Gracias.
> >
> > "Ivan" escribió:
> >
> >
> >
> > > hola,
> >
> > > aunque ahora no tengo mucho tiempo (hasta dentro de un ratillo, je,
> > > je..) prueba una cosa:
> >
> > > en =>> Set BD = .Worksheets("lanorf")
> >
> > > reescribe el nombre de la hoja (entre las comillas) y prueba de
> > > nuevo . El rror nueve suele querer decir que no se encuentra el
> > > elemento mencionado, y puede que aunque no lo parezca, el nombre de la
> > > hoja este mal escrito. Escribe el que pone en la pestalña de la hoja y
> > > tal y como este (copialo si quieres y pegalo entre las comillas)
> >
> > > tambien asegurate de que las ref esten en la columna C y los
> > > intervalos numericos en la E. El resto, creo, deberia dar lo mismo.
> >
> > > si pruebas, si quieres comentas. En un rato volvere ante el trasto
> > > este y le echo un ojo con mas calma.
> >
> > > un saludo
> > > Ivan
> >
> > > PD:
> > > > 1- Salta de la primera linea de tu código a la quinta sin leer las
> > > > intermedias, es decir de Sub FiltrarPorRefYCantidad()
> >
> > > > a With ThisWorkbook
> >
> > > no te preocupes, (creo que) es normal, pues las lineas intermedias es
> > > la declaracion de variables- Ocultar texto de la cita -
> >
> > - Mostrar texto de la cita -
>
> hola,
>
> es extraño que te siga dando el error 9 en ese punto, sobre todo si te
> has asegurado de volver a escribir el nombre de la hoja. Solo un par
> de pruebas/preguntas/comentarios antes de buscar otras vias:
>
> 1ª) el libro en que has pegado la macro se supone que es el mismo que
> el que contiene la hoja ("lanorf").
>
> De no ser asi, deberias cambiar esto=>>
>
> With ThisWorkbook
>
> por algo parecido a esto=>>
>
> With Workbooks("<aqui_nombre_del_libro_que_contiene_la_lista>")
>
> 2ª)tienes en uso el nombre BD en alguna otra parte del archivo? y el
> de 'Ianorf'?
>
> 3º) aunque no se hasta que punto podria influir ¿tienes algun objeto
> (graficos, etc) incrustado en la hoja?
>
>
> 4ª ¿donde has pegado el codigo? debe (o al menos creo que seria mejor)
> de ir en un modulo 'normal'. Si no lo tienes claro ve al menu insertar
> del editor de VBA y elige Modulo a secas (o no se si existe la
> posibilidad de que ponga Modulo Standard, normal, etc, ¡¡¡ pero NO
> 'Modulo de clase'!!!) y traslada el codigo a este nuevo modulo.
>
> Nota: los modulos Thisworkbook, Hoja1, Hoja2, etc, NO son normales,
> son modulos de clase
>
> ..en fin, el problema es que, si el error te lo diera en algun
> sitio posterior, habria bastantes posibilidades de error, pero en este
> punto, y que yo sepa, ese error lo que viene a decir es que no existe
> una hoja con ese nombre en el libro que tiene el codigo.
>
> de todas formas, y aunque no creo que cambie la cosa, prueba a cambiar
> la expresion Worksheets por Sheets a secas (con el punto delante)
>
> bueno, si ves que siguen los errores tras +/- comprobar estos puntos,
> comentas
>
> un saludo
> Ivan
>
> PD: en cuanto a esto:
>
> >. No obstante creo que también se
> > podria filtar por la columna "E" que es la que tiene más criterios de
> > filtrado y luego por la columna "C" que son criterios fijos
>
> aunque no estoy del todo seguro, la verdad es que en este ejemplo el
> filtro es 'unico', por decirlo de alguna manera e implica el
> cumplimiento de todas las condiciones a la vez, aunque es cierto que a
> lo mejor se deberia poner 1º el que menos posibilidades tenga de
> coincidir para asi ir descartando al no cumplirse la primera parte de
> la funcion 'Y'. en estre caso seria cuestion de ir probando cambiando
> el orden de los criterios a ver cual es mas rapido, pero si no son
> exageradamente muchos registros, no creo que la diferencia fuera
> significativamente perceptible
>
>
> PPD: > Si quieres que te envie el famoso fichero dimelo. Mi correo es:
>
> aunque no te puedo asegurar que te responda y tampoco soy ningun
> experto si ves que no encuentras la solucion, quita lo evidente de mi
> correo y le echo un ojo
>
>
Respuesta Responder a este mensaje
#18 Ivan
18/06/2007 - 21:09 | Informe spam
hola,

no estoy muy seguro de lo que quieres decir con =>>>

...meter otros filtros para otras hojas. Necesitaria meter filtros en tres hojas deferentes



si te refieres a filtrar 3 hojas como 'Ianorf', con los mismos campos y criterios, que estan en el mismo libro que el
resto de las hojas, puedes probar esta adaptacion llamandola con cada una de las 3 hojas activas (OJO: asegurate de
poner bien el nombre de las hojas que quieres filtrar tanto en el 1er If Then (tras with activesheet) como al principio
del bucle (tras For Each ). Tambien deberias incluir cualquier otra hoja cuyo nombre no se corresponda con una ref.
a filtrar)

Sub Filtrar_Ref_Cantidad()
Dim hj As Worksheet, Criterio As String, ultF As Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
With ActiveSheet
if .name <> "nombre_una_hoja" and .name <> "nombre_otra_hoja" and _
.name <> "nombre_otra_hoja" then exit sub
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e2<61200)," & _
"e262200,and(e2>I0000,e2<I9000)"
For Each hj In ThisWorkbook.Worksheets
If hj.name <> "nombre_una_hoja" and hj.name <> "nombre_otra_hoja" and _
hj.name <> "nombre_otra_hoja" then Then
.[a1:t1].Copy hj.[a1]: ultF = hj.[c65536].End(xlUp).Row + 1
rngDestino = "a" & ultF & ":t" & ultF
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>p0000,e2<y0000)" Else _
Criterio = Criterio1
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & "))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: End With
End If
Next
.[v2].Clear
End With
End Sub

con esto, aunque no esta probado, te deberia filtrar cualquiera de esas hojas que hayas incluido donde te he comentado y
hacer lo mismo que con Ianorf, pero solo cuando llames a la macro siendo una de ellas la activa.(podrias llamr a la
macro con el mismo boton, atajo de teclado, etc). Solo filtra una por vez(evidentemente la activa) y tendrias que ir
manualmente a cada una y llamar a la macro.

tambien podrias incluir otro bucle que encerrara a este bien con for each y si el nombre de la hoja es el correcto
filtrarla, o pej. con una matriz con el nombre de las hojas que quieras filtrar y recorriendolo con un bucle for next
(acuerdate de For n = lbound(matriz) to Ubound(matriz))estos bucles podrias abrirlos antes del with activesheet( que
tendrias que cambiar por algo como 'With Worksheets(matriz(n))' o en el caso de for each algo tipo 'If hjBD.Name = tal o
hjbd.name=cual etc .. entonces(then)') y cerrarlo despues del ultimo End with. Esto te las filtraria todas de una vez.

de todas formas, estoy practicando un poco con tu archivo (por cierto, ¿es un archivo ficticio o tu trabajo va por los
derroteros que este parece indicar(reparacion y/o mantenimiento de 'altos vuelos')? si es asi habra que hilar fino, no
vaya a ser que algun dia se me ocurra echar a volar.) y quizas te interese echarle un ojo a lo que estoy haciendo. En
cuanto acabe de pulirlo te lo devuelvo con alguna sorpresa (espero que util). Intentare añadir esto ultimo que comentas.

aun asi, te recomendaria que intentes hacer algunas pruebas con lo comentado ( y la 'ayuda' de F1 cuando estes en el
editor) pues realmente no es muy complicado adaptarlo.
un saludo
Ivan

PD: hay una 'errata' en uno de los criterios (falta un <). Creo que era aqui (ya esta orregido pero comptruebalo en tu
codigo) =>>

and(e2>61100,e2<61200),"
Respuesta Responder a este mensaje
#19 Bucanero
19/06/2007 - 23:29 | Informe spam
Hola,

Creo que me he explicado mal. Lo que necesito es dentro de la misma macro
anterior, si recuerdas despues de filtrar por un monton de referencias, luego
haciamos otro filtro para otro criterio dela hoja A-320 es decir el codigo
era el siguiente:

For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "lanorf" Then
.[a1:t1].Copy hj.[a1]: ultF = hj.[c65536].End(xlUp).Row + 1
rngDestino = "a" & ultF & ":t" & ultF
Criterio = ",or(and(e2>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e261200)," & _
"e262200,and(e2>I0000,e2<I9000"


aqui es donde añadimos el criterio de la hoja que tiene un criterio
mas (A-320) Y que necesiteria que fuesen otros criterios más (
A321,A-319,B-XXX,M-XX y M-X1)
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>p0000,e2<y0000"
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & ")))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[v2].Clear: End With
End If



Pues lo que quisiera es poder añadir otros más como el que tengo pero con
los valores "<= y >=" diferentes o y en otras valores iguales.

No sé si me habré explicado bien, (pero llevo un dia... muy espeso), "no doy
pié con bola", vamos un caos. En fin, gracias por tu ayuda.

Saludos

PD: Mi trabajo se basa en "los altos Vuelos", asi que si algun día necesitas
algo dimelo, que haré todo lo que esté en mi mano. De todas formas si quieres
más detalles dimelo y te lo comunico de forma privada.

"Ivan" escribió:

hola,

no estoy muy seguro de lo que quieres decir con =>>>

>...meter otros filtros para otras hojas. Necesitaria meter filtros en tres hojas deferentes

si te refieres a filtrar 3 hojas como 'Ianorf', con los mismos campos y criterios, que estan en el mismo libro que el
resto de las hojas, puedes probar esta adaptacion llamandola con cada una de las 3 hojas activas (OJO: asegurate de
poner bien el nombre de las hojas que quieres filtrar tanto en el 1er If Then (tras with activesheet) como al principio
del bucle (tras For Each ). Tambien deberias incluir cualquier otra hoja cuyo nombre no se corresponda con una ref.
a filtrar)

Sub Filtrar_Ref_Cantidad()
Dim hj As Worksheet, Criterio As String, ultF As Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
With ActiveSheet
if .name <> "nombre_una_hoja" and .name <> "nombre_otra_hoja" and _
.name <> "nombre_otra_hoja" then exit sub
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e2<61200)," & _
"e262200,and(e2>I0000,e2<I9000)"
For Each hj In ThisWorkbook.Worksheets
If hj.name <> "nombre_una_hoja" and hj.name <> "nombre_otra_hoja" and _
hj.name <> "nombre_otra_hoja" then Then
.[a1:t1].Copy hj.[a1]: ultF = hj.[c65536].End(xlUp).Row + 1
rngDestino = "a" & ultF & ":t" & ultF
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>p0000,e2<y0000)" Else _
Criterio = Criterio1
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & "))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: End With
End If
Next
.[v2].Clear
End With
End Sub

con esto, aunque no esta probado, te deberia filtrar cualquiera de esas hojas que hayas incluido donde te he comentado y
hacer lo mismo que con Ianorf, pero solo cuando llames a la macro siendo una de ellas la activa.(podrias llamr a la
macro con el mismo boton, atajo de teclado, etc). Solo filtra una por vez(evidentemente la activa) y tendrias que ir
manualmente a cada una y llamar a la macro.

tambien podrias incluir otro bucle que encerrara a este bien con for each y si el nombre de la hoja es el correcto
filtrarla, o pej. con una matriz con el nombre de las hojas que quieras filtrar y recorriendolo con un bucle for next
(acuerdate de For n = lbound(matriz) to Ubound(matriz))estos bucles podrias abrirlos antes del with activesheet( que
tendrias que cambiar por algo como 'With Worksheets(matriz(n))' o en el caso de for each algo tipo 'If hjBD.Name = tal o
hjbd.name=cual etc .. entonces(then)') y cerrarlo despues del ultimo End with. Esto te las filtraria todas de una vez.

de todas formas, estoy practicando un poco con tu archivo (por cierto, ¿es un archivo ficticio o tu trabajo va por los
derroteros que este parece indicar(reparacion y/o mantenimiento de 'altos vuelos')? si es asi habra que hilar fino, no
vaya a ser que algun dia se me ocurra echar a volar.) y quizas te interese echarle un ojo a lo que estoy haciendo. En
cuanto acabe de pulirlo te lo devuelvo con alguna sorpresa (espero que util). Intentare añadir esto ultimo que comentas.

aun asi, te recomendaria que intentes hacer algunas pruebas con lo comentado ( y la 'ayuda' de F1 cuando estes en el
editor) pues realmente no es muy complicado adaptarlo.
un saludo
Ivan

PD: hay una 'errata' en uno de los criterios (falta un <). Creo que era aqui (ya esta orregido pero comptruebalo en tu
codigo) =>>

and(e2>61100,e2<61200),"



Respuesta Responder a este mensaje
#20 Ivan
21/06/2007 - 02:41 | Informe spam
hola Manuel, disculpa la tardanza, pero entre que ando un poco liado, y que, justo cuando estaba 'acabando' las pruebas
con tu archivo me ocurrio algo extraño con el y he tenido que replantearlo, no he tenido tiempo de asomarme demasiado.

en cuanto a lo que comentas, eso era lo que yo creia en un principio, pero tu anterior mensaje me descoloco, de ahi mis
dudas.

no he tenido tiempo de prepara nada, pero mientras tanto puedes hacer algo parecido a lo que te comento: (1º otra
cosilla: te recomiendo que uses mejor el ultimo codigo, el que tiene Criterio1 antes del bucle)

1ª .- pon todos los criterios comunes a todas las ref. en la primera carga de 'Criterio' ( o si te decides por el ultimo
codugo, cargas 'Criterio1' con ellas)

2º .- cambia el =>> If hj.Name = "A-320" Then Criterio = Criterio & ",and(e2>p0000,e2<y0000"
por una estructura If .Then ...ElseIf...Then , o por un Select Case

podrias hacer algo mas o menos asi (te pongo un ej. con select case):

Select Case hj.Name
Case "A-320"
Criterio = Criterio & ",and(e2>p0000,e2<y0000"
Case "Otra_Referencia"
Criterio = Criterio & "el/los criterio/s que sea/n"
Case "Otra Referncia mas"
Criterio = Criterio & "el/los criterio/s que sea/n"
Case "Otra r.
Criterio=...
..
End Select

bueno, si quieres haz unas pruebas a ver que tal. En cuanto acabe tu archivo te lo mando ( es una pena lo que me ha
ocurrido, me da la impresion de que se ha debido corromper,< por cierto, la copia que me mandaste ¿era nueva o llevaba
ya mucho trajin?>. Bueno, he estado a punto de enviar una consulta al respecto, y posiblemente acabe haciendolo.

un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida