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

#1 Ivan
11/06/2007 - 02:09 | Informe spam
On 11 jun, 00:28, Bucanero wrote:
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.



hola,

no se como sera la macro que utilizas, pero (creo que) deberias
cambiar la instruccion donde indica el rango de destino por algo asi,
que te devuelve la primera celda 'libre' de la columna que le indiques
(en este ej. la 'a')

Worksheets("<NombreHojaDestino>").[a65536].End(xlUp).Offset(1)

OJO: si lo aplicas desde el primer filtrado/pegado, la fila 1 te la
dejara vacia y empezara a pegarte desde la 2.

de todas formas, si expones la macro que estas usando (o al menos la
parte referida al tema) y quizas los criterios de filtrado, creo que
seria mas facil darte una respuesta concreta

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Bucanero
11/06/2007 - 19:08 | Informe spam
Muchas gracias Ivan por tu interés, pero no me ha funcionado.Los filtros que
aplico primero son sobre una referencia determinada (columna 3) y luego voy
aplicando otro filtro (columna 5) que es que me da un rango de datos. Mejor
verlo sobre el propio código.

'Filtrar segun referencia y pegar en su hoja'

'PACKS'

Sheets("lanorf").Select
Selection.AutoFilter Field:=3, Criteria1:="A-300"
Selection.AutoFilter Field:=5, Criteria1:=">!5000", Operator:=xlAnd, _
Criteria2:="<!6100"
Rows("2:100").Select
Selection.Copy
Sheets("A-300").Select
Range("A2").Select
ActiveSheet.Paste

'PRESS'

Sheets("lanorf").Select
Selection.AutoFilter Field:=5, Criteria1:=">!3100", Operator:=xlAnd, _
Criteria2:="<!3900"
Rows("2:100").Select
Selection.Copy
Sheets("A-300").Select
Range("").Select
ActiveSheet.Paste
Worksheets("A-300").[a65536].End(xlUp).Offset (1)->Esta es la línea de
codigo que me has dado

'CSD'

Sheets("lanorf").Select
Selection.AutoFilter Field:=5, Criteria1:=">!3100", Operator:=xlAnd, _
Criteria2:="<!3900"
Rows("2:100").Select
Selection.Copy
Sheets("A-300").Select
Range("A2").Select
ActiveSheet.Paste

Donde: lanorf = la hoja donde tengo todos los datos.
A-300 = la hoja de destino de esta referencia, (Hay 18
referencias diferentes, y cada una va en una hoja, es decir, esta es A-300,
otra es B-12A, etc.).
Y los criterios de busqueda siempre son los mismos, menos en una de las
hojas, que varia en un filtro más.

Espero que esta explicación sea de ayuda aclaratoria, y muchas gracias por
las molestias.


"Ivan" escribió:

On 11 jun, 00:28, Bucanero wrote:
> 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.

hola,

no se como sera la macro que utilizas, pero (creo que) deberias
cambiar la instruccion donde indica el rango de destino por algo asi,
que te devuelve la primera celda 'libre' de la columna que le indiques
(en este ej. la 'a')

Worksheets("<NombreHojaDestino>").[a65536].End(xlUp).Offset(1)

OJO: si lo aplicas desde el primer filtrado/pegado, la fila 1 te la
dejara vacia y empezara a pegarte desde la 2.

de todas formas, si expones la macro que estas usando (o al menos la
parte referida al tema) y quizas los criterios de filtrado, creo que
seria mas facil darte una respuesta concreta

un saludo
Ivan


Respuesta Responder a este mensaje
#3 Ivan
11/06/2007 - 22:56 | Informe spam
Hola,

menos en el 1er codigo, que pegas en A2 prueba a cambiar todo esto en
los demas:

Selection.Copy
Sheets("A-300").Select
Range("").Select
ActiveSheet.Paste
Worksheets("A-300").[a65536].End(xlUp).Offset (1



cambialo por esto:=>

Selection.Copy _
Sheets("A-300").[a65536].End(xlUp).Offset (1)


ojo, esto te pega todo, tal cual este en el origen (fijate en el
espacio y el guion bajo que hay tras copy, aunque si quieres puedes
ponerlo en una sola linea dejando un espacio (sin guion) entre Copy y
Sheets

si, pej. quieres pegar solo los valores cambialo por algo asi


Selection.Copy
Sheets("A-300").[a65536].End(xlUp).Offset (1).PasteSpecial
xlPasteValues


fijate en que aqui no lleva guion bajo, y debe ir en 2 lineas (en una
Selection.Copy y en la otra el resto)

prueba a copiarlo tal cual estan aqui


en cualquier caso no he tenido tiempo de 'comprender' el 'sentido' de
los codigos y el filtrado para luego pegar un rango fijo. Si lo que
quieres es pegar solo las celdas resultantes del filtrado creo que
habria otras opciones. En cualquier caso prueba la sugerencia a ver si
te hace el apaño y si quieres comentas

un saludo
Ivan
Respuesta Responder a este mensaje
#4 Ivan
12/06/2007 - 03:16 | Informe spam
hola de nuevo,

aunque no acabo de estar seguro de lo que quieres hacer, si mas o menos te he entendido, prueba a ver si te vale algo
parecido a esto.

lo 1º te explico los supuestos para los que esta hecha la macro (los que he creido entender) y despues, como no se tu
nivel en VBA, espero que no te moleste que te lo explique como si estos fueran minimos. Si no es asi, prescinde de lo
que sepas. Por otro lado, y como yo tampoco soy un experto, si alguien viera que digo alguna burrada, o algo mejorable,
algun error u otras alternativas, por mi parte serian bien recibidas las rectificaciones.

1ª) si no me equivoco, en tu libro tienes una hoja ("lanorf") que hace las veces de base de datos (BD en adelante). En
esta hoja tienes:

a) en la columna C una serie de referencias (hasta 18) que se pueden repetir un nº indeterminado de veces.

b) a su vez por cada una de estas referencias diferentes tienes una hoja cuyo nombre es el de dicha referencia

c) en la columna E (de la BD) tienes unas cantidades

2º) quieres filtrar los registros de la BD que coincidan en la columna C con cada referencia y a su vez, estos por una
serie de intervalos (>= / <=), hasta 10 u 11, buscados en la columna E y pegar el resultado en las sucesivas filas
libres de la hoja con el mismo nombre que la referencia (nota: creo que se podria realizar un solo filtrado por hoja con
todos los criterios de una vez, pero no lo he probado y he seguido tu planteamiento)

3º) los titulos de la BD estan en la fila 1, los datos empiezan en la 2, las columnas son de la A a la T y a partir de
aqui estan vacias (es importante que al menos la U, la V y la W si lo esten). Los titulos de las hojasRef son los
mismos que llos de la BD


bueno, si esto es asi, paso a explicarte los 'detalles' de la macro que deberias adaptar a la situacion real de tu
archivo (prueba con copias):

1º.- Nombre de las hojas: asegurate de qu los nombres de las hojas son correctos.

1.1.-El de la BD puedes cambiarlo en: 'Set BD = .Worksheets("lanorf")' poniendolo entre parentesis como esta en
el codigo
1.2.-Fijate en que los nombres de las hojas (en el libro) son 'exactamente' iguales que las referencias que
quieres buscar, y de que haya una hoja por cada una de ellas.
1.3.-Si existen mas hojas en el libro aparte de la BD y las de Referencias, debes añadir el nombre de cada una
de ellas de esta forma.Cambiando esta instruccion:=>> If .Name <> "lanorf" Then
por algo mas o menos asi =>>>

If .Name <> "lanorf" And .Name <> "nombre_otra_hj" And .Name <> "nombre_otra_hj_mas" And
Then

1.4.-Si el nombre de la hoja que lleva un filtro mas no es A-300, cambialo en =>> If .Name = "A-300" Then
_ ,ya sabes, tambien poniendolo entre las comillas

2º.- Criterios de filtrado: vamos a utiliar como criterio la funcion de hoja 'Y' concatenandola con el nombre de cada
ref/hoja y cada uno de tus (dobles) criterios de filtrado por cantidad. Como vamos a utilizar los filtros avanzados en
vez de autofiltros, usaremos el rango V1:V2 como rango de criterios. En v2 pondremos la formula resultante de un bucle
por una matriz en la que tienes que poner todos los criterios de la manera que ahora te explico:

2.1.-fijate en la variable 'matrizCriterios' dentro de esta expresion (en el codigo esta 'partida por un espacio y
un guion bajo/salto de linea, para evitar que se trabe en el editor del foro, pero es lo mismo)=>>>

matrizCriterios = Array(",e2>!5000,e2<!6100)", ",e2>!3100,e2<!3900)")
dentro de los parentesis que hay tras Array veras que realmente solo hay dos 'elementos', los que estan
contenidos entre comillas dobles:

1er elemento: ",e2>!5000,e2<!6100)"
2º elemento: ",e2>!3100,e2<!3900)"

estos son los elementos que debes de poner (hasta los once, o los que sean) dentro de los parentesis del
array separados por una coma. Ten cuidado de ponerlos tal cual estan estos, es decir: (dentro de las comillas) empezar
con una coma(',') + E2>= + minimo + otra coma (',') + E2<= maximo + cierre de parentesis (')')

asimismo si te fijas en el siguiente condicional, el primer array seria el caso de la hoja con un filtro mas
y el 2º para el resto (en el 1º deberias poner pej. 11 elementos y en el 2º 10)

If .Name = "A-300" Then _
matrizCriterios = Array(",e2>!5000,e2<!6100)", _
",e2>!3100,e2<!3900)") _
Else matrizCriterios = Array(",e2>!5000,e2<!6100)")

bueno, creo que ya te habre mareado/liado demasiado, pero si te animas a probarlo, solo ten cuidado con rectificar
correctamente tandto las hojas, rangos etc, como los criterios.por los reales (aunque puede parecer complicado en
relalidad no lo es tanto)

' copia/pega en un modulo normal del editor de VBA, desde aqui *******************

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-300" Then _
matrizCriterios = Array(",e2>!5000,e2<!6100)", _
",e2>!3100,e2<!3900)") _
Else matrizCriterios = Array(",e2>!5000,e2<!6100)")
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

' hasta aqui **************************

puedes ejecutarlo desde el cuadro macros, asignarlo a un boton 8pej.) o directamente con F5 desde el editor.

si quieres comentas como te ha ido o lo que creas

un saludo
Ivan
Respuesta Responder a este mensaje
#5 Bucanero
13/06/2007 - 00:13 | Informe spam
Hola, que tal,

Gracias de nuevo por las molestias y el tiempo que me dedicas.
Yo soy realmente nuevo en el mundo de las macros, por lo que cualquier
explicación es de agredecer.

Bueno entrando en materia. He visto que has entendido la filosofia de lo que
tengo que hacer con este fichero, y creo haber seguido bien tus instrucciones
y después de las modificaciones hechas con mis datos, al ejecutar la macro
paso a paso, siempre me ocurre lo siguiente:

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

2- Al pasar a la siguiente linea Set BD = .Worksheets("lanorf") sale
una ventana con el mensaje de error 9

Asi que me estoy volviendo loco (he tenido un dia muy malo) pero sigo
intentandolo. De todas formas, en una de las copias de prueba,he reducido el
numero de columnas dejando solo los datos realmente importastes para mi,
quedando reducido a nueve columnas (A:I), y estando las dos columnas a las
que aplicamos los filtros en le mismo lugar que en el fichero original.

Bueno, estoy abierto a cualquier tipo de ayuda, modificaciones, etc,.. y
gracias.




"Ivan" escribió:

hola de nuevo,

aunque no acabo de estar seguro de lo que quieres hacer, si mas o menos te he entendido, prueba a ver si te vale algo
parecido a esto.

lo 1º te explico los supuestos para los que esta hecha la macro (los que he creido entender) y despues, como no se tu
nivel en VBA, espero que no te moleste que te lo explique como si estos fueran minimos. Si no es asi, prescinde de lo
que sepas. Por otro lado, y como yo tampoco soy un experto, si alguien viera que digo alguna burrada, o algo mejorable,
algun error u otras alternativas, por mi parte serian bien recibidas las rectificaciones.

1ª) si no me equivoco, en tu libro tienes una hoja ("lanorf") que hace las veces de base de datos (BD en adelante). En
esta hoja tienes:

a) en la columna C una serie de referencias (hasta 18) que se pueden repetir un nº indeterminado de veces.

b) a su vez por cada una de estas referencias diferentes tienes una hoja cuyo nombre es el de dicha referencia

c) en la columna E (de la BD) tienes unas cantidades

2º) quieres filtrar los registros de la BD que coincidan en la columna C con cada referencia y a su vez, estos por una
serie de intervalos (>= / <=), hasta 10 u 11, buscados en la columna E y pegar el resultado en las sucesivas filas
libres de la hoja con el mismo nombre que la referencia (nota: creo que se podria realizar un solo filtrado por hoja con
todos los criterios de una vez, pero no lo he probado y he seguido tu planteamiento)

3º) los titulos de la BD estan en la fila 1, los datos empiezan en la 2, las columnas son de la A a la T y a partir de
aqui estan vacias (es importante que al menos la U, la V y la W si lo esten). Los titulos de las hojasRef son los
mismos que llos de la BD


bueno, si esto es asi, paso a explicarte los 'detalles' de la macro que deberias adaptar a la situacion real de tu
archivo (prueba con copias):

1º.- Nombre de las hojas: asegurate de qu los nombres de las hojas son correctos.

1.1.-El de la BD puedes cambiarlo en: 'Set BD = .Worksheets("lanorf")' poniendolo entre parentesis como esta en
el codigo
1.2.-Fijate en que los nombres de las hojas (en el libro) son 'exactamente' iguales que las referencias que
quieres buscar, y de que haya una hoja por cada una de ellas.
1.3.-Si existen mas hojas en el libro aparte de la BD y las de Referencias, debes añadir el nombre de cada una
de ellas de esta forma.Cambiando esta instruccion:=>> If .Name <> "lanorf" Then
por algo mas o menos asi =>>>

If .Name <> "lanorf" And .Name <> "nombre_otra_hj" And .Name <> "nombre_otra_hj_mas" And
Then

1.4.-Si el nombre de la hoja que lleva un filtro mas no es A-300, cambialo en =>> If .Name = "A-300" Then
_ ,ya sabes, tambien poniendolo entre las comillas

2º.- Criterios de filtrado: vamos a utiliar como criterio la funcion de hoja 'Y' concatenandola con el nombre de cada
ref/hoja y cada uno de tus (dobles) criterios de filtrado por cantidad. Como vamos a utilizar los filtros avanzados en
vez de autofiltros, usaremos el rango V1:V2 como rango de criterios. En v2 pondremos la formula resultante de un bucle
por una matriz en la que tienes que poner todos los criterios de la manera que ahora te explico:

2.1.-fijate en la variable 'matrizCriterios' dentro de esta expresion (en el codigo esta 'partida por un espacio y
un guion bajo/salto de linea, para evitar que se trabe en el editor del foro, pero es lo mismo)=>>>

matrizCriterios = Array(",e2>!5000,e2<!6100)", ",e2>!3100,e2<!3900)")
dentro de los parentesis que hay tras Array veras que realmente solo hay dos 'elementos', los que estan
contenidos entre comillas dobles:

1er elemento: ",e2>!5000,e2<!6100)"
2º elemento: ",e2>!3100,e2<!3900)"

estos son los elementos que debes de poner (hasta los once, o los que sean) dentro de los parentesis del
array separados por una coma. Ten cuidado de ponerlos tal cual estan estos, es decir: (dentro de las comillas) empezar
con una coma(',') + E2>= + minimo + otra coma (',') + E2<= maximo + cierre de parentesis (')')

asimismo si te fijas en el siguiente condicional, el primer array seria el caso de la hoja con un filtro mas
y el 2º para el resto (en el 1º deberias poner pej. 11 elementos y en el 2º 10)

If .Name = "A-300" Then _
matrizCriterios = Array(",e2>!5000,e2<!6100)", _
",e2>!3100,e2<!3900)") _
Else matrizCriterios = Array(",e2>!5000,e2<!6100)")

bueno, creo que ya te habre mareado/liado demasiado, pero si te animas a probarlo, solo ten cuidado con rectificar
correctamente tandto las hojas, rangos etc, como los criterios.por los reales (aunque puede parecer complicado en
relalidad no lo es tanto)

' copia/pega en un modulo normal del editor de VBA, desde aqui *******************

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-300" Then _
matrizCriterios = Array(",e2>!5000,e2<!6100)", _
",e2>!3100,e2<!3900)") _
Else matrizCriterios = Array(",e2>!5000,e2<!6100)")
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

' hasta aqui **************************

puedes ejecutarlo desde el cuadro macros, asignarlo a un boton 8pej.) o directamente con F5 desde el editor.

si quieres comentas como te ha ido o lo que creas

un saludo
Ivan



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