Discussion:
Macro: Copiar y pegar de una hoja a otra
(demasiado antiguo para responder)
Bucanero
2007-06-10 22:28:00 UTC
Permalink
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.
Ivan
2007-06-11 00:09:50 UTC
Permalink
Post by Bucanero
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
Bucanero
2007-06-11 17:08:05 UTC
Permalink
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:=">=215000", Operator:=xlAnd, _
Criteria2:="<=216100"
Rows("2:100").Select
Selection.Copy
Sheets("A-300").Select
Range("A2").Select
ActiveSheet.Paste

'PRESS'

Sheets("lanorf").Select
Selection.AutoFilter Field:=5, Criteria1:=">=213100", Operator:=xlAnd, _
Criteria2:="<=213900"
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:=">=213100", Operator:=xlAnd, _
Criteria2:="<=213900"
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.
Post by Ivan
Post by Bucanero
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
Ivan
2007-06-11 20:56:59 UTC
Permalink
Hola,

menos en el 1er codigo, que pegas en A2 prueba a cambiar todo esto en
Post by Bucanero
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
Ivan
2007-06-12 01:16:53 UTC
Permalink
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>=215000,e2<=216100)", ",e2>=213100,e2<=213900)")
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>=215000,e2<=216100)"
2º elemento: ",e2>=213100,e2<=213900)"

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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900)") _
Else matrizCriterios = Array(",e2>=215000,e2<=216100)")

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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900)") _
Else matrizCriterios = Array(",e2>=215000,e2<=216100)")
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
Bucanero
2007-06-12 22:13:00 UTC
Permalink
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.
Post by Ivan
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
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
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
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>=215000,e2<=216100)", ",e2>=213100,e2<=213900)")
dentro de los parentesis que hay tras Array veras que realmente solo hay dos 'elementos', los que estan
1er elemento: ",e2>=215000,e2<=216100)"
2º elemento: ",e2>=213100,e2<=213900)"
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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900)") _
Else matrizCriterios = Array(",e2>=215000,e2<=216100)")
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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900)") _
Else matrizCriterios = Array(",e2>=215000,e2<=216100)")
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
Ivan
2007-06-12 23:40:04 UTC
Permalink
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
Post by Bucanero
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
Bucanero
2007-06-13 21:26:01 UTC
Permalink
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:

***@gmail.com

Gracias.
Post by Ivan
hola,
aunque ahora no tengo mucho tiempo (hasta dentro de un ratillo, je,
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
Post by Bucanero
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
Ivan
2007-06-13 22:29:02 UTC
Permalink
Post by Bucanero
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.
Gracias.
Post by Ivan
hola,
aunque ahora no tengo mucho tiempo (hasta dentro de un ratillo, je,
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
Post by Bucanero
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
Post by Bucanero
. 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
Bucanero
2007-06-15 08:33:02 UTC
Permalink
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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900) ", _
",e2=242100)", _
",e2=261200)", _
",e2=284200)", _
",e2>=361100,e2=361200)", _
",e2=362200)", _
",e2=261300)", _
",e2>=490000,e2<=499000)", _
",e2>=700000,e2<=790000)")

**==> 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.
Post by Ivan
Post by Bucanero
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.
Gracias.
Post by Ivan
hola,
aunque ahora no tengo mucho tiempo (hasta dentro de un ratillo, je,
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
Post by Bucanero
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
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
Post by Bucanero
. 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
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
Ivan
2007-06-15 14:27:11 UTC
Permalink
hola de nuevo,
Post by Bucanero
Siento no harberte dicho nada ayer, pero salí de cdasa a las 5:30 am y
regresé a las 22:30
no te preocupes, cada cual tenemos nuestra vida, aparte de que lo que comentas me suena bastante.

vamos al meollo, ahora que, al menos, parece que empezamos a movernos

el unico motivo que a 1ª vista le encuentro al error 13 en el punto que comentas es que, al no incluir una
inicializacion de la variable 'matrizCriterios' en el caso de que la hoja no se llame "A-320" la matriz no existe (al
menos si la 1ª hoja no es esta, aunque si lo fuera, seguramente no te daria el error 13, pero habria otros
'inconvenientes'), con lo que (y si no me equivoco) estas intentando contar uvas en un desierto (por decirlo de alguna
manera) y vba te dice que las uvas no nacen en el desierto (no me hagas mucho caso, pues, aparte de horterada, lo mismo
acabo de decir una tontuna, aunque algo de esto si debe haber)

prueba a incluir la mtriz criterios en el caso de que la hoja no sea "A-320" mas o menos asi:=>
Post by Bucanero
If .Name = "A-320" Then _
matrizCriterios = Array(",e2>=215000,e2<=216100)", _
",e2>=213100,e2<=213900) ", _
",e2=242100)", _
",e2=261200)", _
",e2=284200)", _
",e2>=361100,e2=361200)", _
",e2=362200)", _
",e2=261300)", _
",e2>=490000,e2<=499000)", _
",e2>=700000,e2<=790000)") _
else _
matrizCriterios = Array(<aqui los criterios si es otra referencia>)

fijate que seguimos con guiones de continuacion de linea, por lo que no es necesario incluir un End If

bueno, a ver si con suerte damos otro paso, porque de momento no se me ocurre otra posibilidad para el error y el punto
que comentas

un saludo y cuando puedas comentas como vamos (sin prisas)

Ivan

PD: solo por tranquilizarte, a mi me funciona perfectamente desde el principio, asi que supongo que lograremos que a ti
tambien.
Ivan
2007-06-15 15:22:02 UTC
Permalink
hola, y disculpame de nuevo, pero hay un detalle tonto (y culpa mia) que se me ha vuelto a olvidar comentante

se trata de cambiar de posicion esto=>>

ultF_BD = .[c65536].End(xlUp).Row

pues estamos recalculando inutilmente y por partida doble (con los dos bucles) sin tener ninguna necesidad, pues se
trata del numero de filas de la lista original que se supone no va a cambiar a lo largo de la ejecucion de la macro

aunque no influye en el resultado si podria hacerlo en el tiempo que tardase en ejecutarse(aunque tampoco creo que
demasiado), pero no deja de tratarse de un recalculo innecesario

cambialo al final del primer bloque 'With BD'. Dejandolo asi=>>

With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
.[v1:v2].ClearContents
ultF_BD = .[c65536].End(xlUp).Row
End With

NOTA: respecto a este bloque, seguramente no es necesario tanta comprobacion de que todas las filas esten visibles, pero
como no estoy seguro siempre incluyo las dos (ShowAllData y Autofiltermode) por si acaso. Quizas alguien se anime a
aclararlo, si no fuese necesario mas que una de ellas.

bueno disculpa el error y un saludo
Ivan
Ivan
2007-06-15 20:11:38 UTC
Permalink
y hola de nuevo,

disculpame, pero tras echar un ojo a los criterios que expones, creo que te puedes ahorrar el 2º bucle (y por ende un
par de variables : la matriz y el contador) usando como criterio una sola formula combinando/anidando las funciones 'Y'
y 'O' ('And' y 'Or' en vba) (seguramente algun experto te aplicaria alguna mas sencilla)

en esta ocasion, la formula que depositamos como crriterio es mas o menos esta (en una sola linea)=>>

=Y(C2="A-304";O(Y(E2>=213100;E2<=213900);Y(E2>=215000;E2<=216100);E2=242100;E2=261200;E2=261300;E2=284200;Y(E2>=361100;E2=361200);E2=362200;Y(E2>=490000;E2<=499000)))

en la que se debe de cumplir la 1ª condicion (la referencia adecuada) 'y' una cualquiera de las otras (considerando los
intervalos mayor/menor como una sola)

aunque no quiero liarte y quizas convenga que primero acabes de probar/comprender la anterior, te pongo este nuevo
codigo en el que pongo como criterio el mismo para todas las hojas, excepto si la hoja es "A-300" que le añado el ultimo
(adaptalo) y en el que tambien he limpiado un poco algunas cosas, aunque el resultado y base es el mismo pero evitando
trener que filtrar tantas veces como criterios haya haciendolo solo una vez por hoja

como veras he eliminado la variable matrizCriterios dejando solo el String 'Criterio'. En cuanto a la estructura de este
'nuevo' criterio, creo que (tras comprender el caos de la matriz) no tendras dificultad en verlo (la unica novedad es
que eliminamos la coma que se ponia fuera de las comillas para sepparar los elementos de la matriz e incluimos el
caracter '&' como operador de concatenacion del texto que en definitiva va a ser el criterio ( de hecho en el editor
podrias ponerlo todo seguido en una sola linea y con comillas dobles solo al principio y al final, pero, aparte de, al
ser muy largo, ser dificil de abarcar visulalmente, al enviarlo al foro se trabaria en algun que otro punto
impredecible, de ahi los caracteres de concatenacion y los de continuacion de linea (espacio + guion bajo)

bueno espero no volver a marearte y ten en cuenta que yo he puesto como criterio de mas de la hoja "A-320" el intervalo
mas alto (e2>=700000,e2<=790000), si no es asi ya sabes como modificarlo. <tambien he ordenado las condiciones de mayor
a menor, pues si la lista esta ordenada por esa columna, seguramente facilitara el trabajo del filtro>

Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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
''' fijate que aqui no ponemos el/los cierres de parentesis al final de criterio
''' para dejarlo abierto por si hay que añadir el de la hoja con uno mas
Criterio = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Next
End With
Set BD = Nothing
End Sub

bueno, lo dicho, espero no estarte liando mas

un saludo
Ivan
Ivan
2007-06-15 21:07:11 UTC
Permalink
Post by Ivan
y hola de nuevo,
disculpame, pero tras echar un ojo a los criterios que expones, creo que te puedes ahorrar el 2º bucle (y por ende un
par de variables : la matriz y el contador) usando como criterio una sola formula combinando/anidando las funciones 'Y'
y 'O' ('And' y 'Or' en vba) (seguramente algun experto te aplicaria alguna mas sencilla)
en esta ocasion, la formula que depositamos como crriterio es mas o menos esta (en una sola linea)=>>
=Y(C2="A-304";O(Y(E2>=213100;E2<=213900);Y(E2>=215000;E2<=216100);E2=242100­;E2=261200;E2=261300;E2=284200;Y(E2>=361100;E2=361200);E2=362200;Y(E2>=4900­00;E2<=499000)))
en la que se debe de cumplir la 1ª condicion (la referencia adecuada) 'y' una cualquiera de las otras (considerando los
intervalos mayor/menor como una sola)
aunque no quiero liarte y quizas convenga que primero acabes de probar/comprender la anterior, te pongo este nuevo
codigo en el que pongo como criterio el mismo para todas las hojas, excepto si la hoja es "A-300" que le añado el ultimo
(adaptalo) y en el que tambien he limpiado un poco algunas cosas, aunque el resultado y base es el mismo pero evitando
trener que filtrar tantas veces como criterios haya haciendolo solo una vez por hoja
como veras he eliminado la variable matrizCriterios dejando solo el String 'Criterio'. En cuanto a la estructura de este
'nuevo' criterio, creo que (tras comprender el caos de la matriz) no tendras dificultad en verlo (la unica novedad es
que eliminamos la coma que se ponia fuera de las comillas para sepparar los elementos de la matriz e incluimos el
caracter '&' como operador de concatenacion del texto que en definitiva va a ser el criterio ( de hecho en el editor
podrias ponerlo todo seguido en una sola linea y con comillas dobles solo al principio y al final, pero, aparte de, al
ser muy largo, ser dificil de abarcar visulalmente, al enviarlo al foro se trabaria en algun que otro punto
impredecible, de ahi los caracteres de concatenacion y los de continuacion de linea (espacio + guion bajo)
bueno espero no volver a marearte y ten en cuenta que yo he puesto como criterio de mas de la hoja "A-320" el intervalo
mas alto (e2>=700000,e2<=790000), si no es asi ya sabes como modificarlo. <tambien he ordenado las condiciones de mayor
a menor, pues si la lista esta ordenada por esa columna, seguramente facilitara el trabajo del filtro>
Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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
''' fijate que aqui no ponemos el/los cierres de parentesis al final de criterio
''' para dejarlo abierto por si hay que añadir el de la hoja con uno mas
Criterio = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Next
End With
Set BD = Nothing
End Sub
bueno, lo dicho, espero no estarte liando mas
un saludo
Ivan
disculpa pero creo que he vuelto a meter la pata:

aqui faltaria empezar con un cierre de parentesis el criterio si hoja
a-320

quedaria asi=>>

If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"

de todas formas creo que esta otra macro me gusta mas por lo mismo que
lo de ultf_BD, por no volver a dar valor al criterio comun en cada
vuelta del bucle:


Sub FiltrarPorRefYCantidad_2()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, ultF As
Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>=700000,e2<=790000)"
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: .[v2].Clear:
End With
End If
Next
End With
Set BD = Nothing
End Sub

un saludo y disculpa de nuevo
Ivan

PD: si decides probar la anterior (añadiendole el cierre de
parentesis, cambiale antes el nombre al codigo, pues te podria dar
error por nombre ambiguo(duplicado) y yo no me di cuenta de hacerlo
Bucanero
2007-06-15 23:47:02 UTC
Permalink
Buenas noches,

He visto tus ultimos cambios y los he probado. Resultado....: funciona con
todas las hojas menos con la del A-320. El porque no lo sé. Lo primero que
voy a hacer, será centrar mis neuronas y analizalo todo con un poco de calma
(de todas formas reconocco que tus conocimientos en estos temas me sobrepasan
y con mucho).

Te voy a enviar como te dije el fichero para que veas como estan colocados
los datos, no vaya a ser que creamos estar hablando de lo mismo y al final
sea diferente.

Saludos
Post by Ivan
Post by Ivan
y hola de nuevo,
disculpame, pero tras echar un ojo a los criterios que expones, creo que te puedes ahorrar el 2º bucle (y por ende un
par de variables : la matriz y el contador) usando como criterio una sola formula combinando/anidando las funciones 'Y'
y 'O' ('And' y 'Or' en vba) (seguramente algun experto te aplicaria alguna mas sencilla)
en esta ocasion, la formula que depositamos como crriterio es mas o menos esta (en una sola linea)=>>
=Y(C2="A-304";O(Y(E2>=213100;E2<=213900);Y(E2>=215000;E2<=216100);E2=242100­;E2=261200;E2=261300;E2=284200;Y(E2>=361100;E2=361200);E2=362200;Y(E2>=4900­00;E2<=499000)))
en la que se debe de cumplir la 1ª condicion (la referencia adecuada) 'y' una cualquiera de las otras (considerando los
intervalos mayor/menor como una sola)
aunque no quiero liarte y quizas convenga que primero acabes de probar/comprender la anterior, te pongo este nuevo
codigo en el que pongo como criterio el mismo para todas las hojas, excepto si la hoja es "A-300" que le añado el ultimo
(adaptalo) y en el que tambien he limpiado un poco algunas cosas, aunque el resultado y base es el mismo pero evitando
trener que filtrar tantas veces como criterios haya haciendolo solo una vez por hoja
como veras he eliminado la variable matrizCriterios dejando solo el String 'Criterio'. En cuanto a la estructura de este
'nuevo' criterio, creo que (tras comprender el caos de la matriz) no tendras dificultad en verlo (la unica novedad es
que eliminamos la coma que se ponia fuera de las comillas para sepparar los elementos de la matriz e incluimos el
caracter '&' como operador de concatenacion del texto que en definitiva va a ser el criterio ( de hecho en el editor
podrias ponerlo todo seguido en una sola linea y con comillas dobles solo al principio y al final, pero, aparte de, al
ser muy largo, ser dificil de abarcar visulalmente, al enviarlo al foro se trabaria en algun que otro punto
impredecible, de ahi los caracteres de concatenacion y los de continuacion de linea (espacio + guion bajo)
bueno espero no volver a marearte y ten en cuenta que yo he puesto como criterio de mas de la hoja "A-320" el intervalo
mas alto (e2>=700000,e2<=790000), si no es asi ya sabes como modificarlo. <tambien he ordenado las condiciones de mayor
a menor, pues si la lista esta ordenada por esa columna, seguramente facilitara el trabajo del filtro>
Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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
''' fijate que aqui no ponemos el/los cierres de parentesis al final de criterio
''' para dejarlo abierto por si hay que añadir el de la hoja con uno mas
Criterio = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Next
End With
Set BD = Nothing
End Sub
bueno, lo dicho, espero no estarte liando mas
un saludo
Ivan
aqui faltaria empezar con un cierre de parentesis el criterio si hoja
a-320
quedaria asi=>>
If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"
de todas formas creo que esta otra macro me gusta mas por lo mismo que
lo de ultf_BD, por no volver a dar valor al criterio comun en cada
Sub FiltrarPorRefYCantidad_2()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, ultF As
Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>=700000,e2<=790000)"
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: .[v2].Clear: End With
End If
Next
End With
Set BD = Nothing
End Sub
un saludo y disculpa de nuevo
Ivan
PD: si decides probar la anterior (añadiendole el cierre de
parentesis, cambiale antes el nombre al codigo, pues te podria dar
error por nombre ambiguo(duplicado) y yo no me di cuenta de hacerlo
Ivan
2007-06-16 10:57:47 UTC
Permalink
Post by Bucanero
Buenas noches,
He visto tus ultimos cambios y los he probado. Resultado....: funciona con
todas las hojas menos con la del A-320. El porque no lo sé. Lo primero que
voy a hacer, será centrar mis neuronas y analizalo todo con un poco de calma
(de todas formas reconocco que tus conocimientos en estos temas me sobrepasan
y con mucho).
Te voy a enviar como te dije el fichero para que veas como estan colocados
los datos, no vaya a ser que creamos estar hablando de lo mismo y al final
sea diferente.
Saludos
Post by Ivan
Post by Ivan
y hola de nuevo,
disculpame, pero tras echar un ojo a los criterios que expones, creo que te puedes ahorrar el 2º bucle (y por ende un
par de variables : la matriz y el contador) usando como criterio una sola formula combinando/anidando las funciones 'Y'
y 'O' ('And' y 'Or' en vba) (seguramente algun experto te aplicaria alguna mas sencilla)
en esta ocasion, la formula que depositamos como crriterio es mas o menos esta (en una sola linea)=>>
=Y(C2="A-304";O(Y(E2>=213100;E2<=213900);Y(E2>=215000;E2<=216100);E2=242100­­;E2=261200;E2=261300;E2=284200;Y(E2>=361100;E2=361200);E2=362200;Y(E2>=490­0­00;E2<=499000)))
en la que se debe de cumplir la 1ª condicion (la referencia adecuada) 'y' una cualquiera de las otras (considerando los
intervalos mayor/menor como una sola)
aunque no quiero liarte y quizas convenga que primero acabes de probar/comprender la anterior, te pongo este nuevo
codigo en el que pongo como criterio el mismo para todas las hojas, excepto si la hoja es "A-300" que le añado el ultimo
(adaptalo) y en el que tambien he limpiado un poco algunas cosas, aunque el resultado y base es el mismo pero evitando
trener que filtrar tantas veces como criterios haya haciendolo solo una vez por hoja
como veras he eliminado la variable matrizCriterios dejando solo el String 'Criterio'. En cuanto a la estructura de este
'nuevo' criterio, creo que (tras comprender el caos de la matriz) no tendras dificultad en verlo (la unica novedad es
que eliminamos la coma que se ponia fuera de las comillas para sepparar los elementos de la matriz e incluimos el
caracter '&' como operador de concatenacion del texto que en definitiva va a ser el criterio ( de hecho en el editor
podrias ponerlo todo seguido en una sola linea y con comillas dobles solo al principio y al final, pero, aparte de, al
ser muy largo, ser dificil de abarcar visulalmente, al enviarlo al foro se trabaria en algun que otro punto
impredecible, de ahi los caracteres de concatenacion y los de continuacion de linea (espacio + guion bajo)
bueno espero no volver a marearte y ten en cuenta que yo he puesto como criterio de mas de la hoja "A-320" el intervalo
mas alto (e2>=700000,e2<=790000), si no es asi ya sabes como modificarlo. <tambien he ordenado las condiciones de mayor
a menor, pues si la lista esta ordenada por esa columna, seguramente facilitara el trabajo del filtro>
Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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
''' fijate que aqui no ponemos el/los cierres de parentesis al final de criterio
''' para dejarlo abierto por si hay que añadir el de la hoja con uno mas
Criterio = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Next
End With
Set BD = Nothing
End Sub
bueno, lo dicho, espero no estarte liando mas
un saludo
Ivan
aqui faltaria empezar con un cierre de parentesis el criterio si hoja
a-320
quedaria asi=>>
If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"
de todas formas creo que esta otra macro me gusta mas por lo mismo que
lo de ultf_BD, por no volver a dar valor al criterio comun en cada
Sub FiltrarPorRefYCantidad_2()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, ultF As
Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>=700000,e2<=790000)"
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: .[v2].Clear: End With
End If
Next
End With
Set BD = Nothing
End Sub
un saludo y disculpa de nuevo
Ivan
PD: si decides probar la anterior (añadiendole el cierre de
parentesis, cambiale antes el nombre al codigo, pues te podria dar
error por nombre ambiguo(duplicado) y yo no me di cuenta de hacerlo- Ocultar texto de la cita -
- Mostrar texto de la cita -
hola Manuel,

aunque pronto te devolvere el archivo con lo que vea, en realidad el
motivo del error es (culpa mia) lo que te comentaba al principio del
ultimo mensaje. Me habia comido un cierre de parentesis

tras esta linea:=>

''' aqui es donde añadimos el criterio de la hoja que tiene uno
mas

=>> esto=>>

If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"

quedaria asi=>>

If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"


asi parece funcionar

un saludo
Ivan
Post by Bucanero
(de todas formas reconocco que tus conocimientos en estos temas me sobrepasan
y con mucho).
la verdad es que mi nivel es bastante basico, y lo que aumente suele
hacerlo a costa de los maestros de este foro, y de las consultantes a
los que mareo, como a ti, a los cuales creo que les vendria mejor la
ayuda de alguien mas experto, pero egoistamente no me puedo resistir a
'practicar' con lo que mas o menos creo puedo ayudar a resolver

y, en cuanto a tu nivel, no se cual es exactamente, pero por tu forma
de llevar el hilo, me da la impresion de que si no es alto, si puede
aumentar rapidamente y con facilidad
Bucanero
2007-06-16 23:13:00 UTC
Permalink
A las muy buenas noches,

Acabo de probar, y por fin funciona al 90%, y digo esto porque aún me queda
por probar la parte donde tengo que poner los otros filtros para las otras
hojas, es decir:

If hj.Name = "A-320" Then _
Post by Ivan
Criterio = Criterio1 & ",and(e2>=XXXXXX,e2<=XXXXXX)"
Else _
Esto sera para esta hoja y las otras, pero en fin, mañana te cuento, o mejor
dicho dentro de un rato, pues me toca currar también mañana. Asi que voy a
ver si duermo un poquito que a las 4:45 me levanto. Lo bueno es que como es
domingo, (nomalmente hay menos curro) y si todo se me dá bien, sobre las 8:00
habré terminado de sacar lor primeros informes y a continuación me pongo las
pilas y acabo de hacer todas las pruebas para poder llegar a ese tan ansiado
100x100.

Con respecto a tu comentario:

<<la verdad es que mi nivel es bastante basico, y lo que aumente suele
hacerlo a costa de los maestros de este foro, y de las consultantes a
los que mareo, como a ti, a los cuales creo que les vendria mejor la
ayuda de alguien mas experto, pero egoistamente no me puedo resistir a
'practicar' con lo que mas o menos creo puedo ayudar a resolver>>

Dee todas formas lo de que tu nivel es basico, permiteme ponerlo en duda,
pues en estos dias con un profe como tu he podido aprender lo que en muchos
manuales no hay escrito.

Lo dicho, luego te comento que me quedan solo 3 horas y media de sueño.

Gracias y un saludo.
Post by Ivan
Buenas noches,
He visto tus ultimos cambios y los he probado. Resultado....: funciona con
todas las hojas menos con la del A-320. El porque no lo sé. Lo primero que
voy a hacer, será centrar mis neuronas y analizalo todo con un poco de calma
(de todas formas reconocco que tus conocimientos en estos temas me sobrepasan
y con mucho).
Te voy a enviar como te dije el fichero para que veas como estan colocados
los datos, no vaya a ser que creamos estar hablando de lo mismo y al final
sea diferente.
Saludos
Post by Ivan
Post by Ivan
y hola de nuevo,
disculpame, pero tras echar un ojo a los criterios que expones, creo que te puedes ahorrar el 2º bucle (y por ende un
par de variables : la matriz y el contador) usando como criterio una sola formula combinando/anidando las funciones 'Y'
y 'O' ('And' y 'Or' en vba) (seguramente algun experto te aplicaria alguna mas sencilla)
en esta ocasion, la formula que depositamos como crriterio es mas o menos esta (en una sola linea)=>>
=Y(C2="A-304";O(Y(E2>=213100;E2<=213900);Y(E2>=215000;E2<=216100);E2=242100­­;E2=261200;E2=261300;E2=284200;Y(E2>=361100;E2=361200);E2=362200;Y(E2>=490­0­00;E2<=499000)))
en la que se debe de cumplir la 1ª condicion (la referencia adecuada) 'y' una cualquiera de las otras (considerando los
intervalos mayor/menor como una sola)
aunque no quiero liarte y quizas convenga que primero acabes de probar/comprender la anterior, te pongo este nuevo
codigo en el que pongo como criterio el mismo para todas las hojas, excepto si la hoja es "A-300" que le añado el ultimo
(adaptalo) y en el que tambien he limpiado un poco algunas cosas, aunque el resultado y base es el mismo pero evitando
trener que filtrar tantas veces como criterios haya haciendolo solo una vez por hoja
como veras he eliminado la variable matrizCriterios dejando solo el String 'Criterio'. En cuanto a la estructura de este
'nuevo' criterio, creo que (tras comprender el caos de la matriz) no tendras dificultad en verlo (la unica novedad es
que eliminamos la coma que se ponia fuera de las comillas para sepparar los elementos de la matriz e incluimos el
caracter '&' como operador de concatenacion del texto que en definitiva va a ser el criterio ( de hecho en el editor
podrias ponerlo todo seguido en una sola linea y con comillas dobles solo al principio y al final, pero, aparte de, al
ser muy largo, ser dificil de abarcar visulalmente, al enviarlo al foro se trabaria en algun que otro punto
impredecible, de ahi los caracteres de concatenacion y los de continuacion de linea (espacio + guion bajo)
bueno espero no volver a marearte y ten en cuenta que yo he puesto como criterio de mas de la hoja "A-320" el intervalo
mas alto (e2>=700000,e2<=790000), si no es asi ya sabes como modificarlo. <tambien he ordenado las condiciones de mayor
a menor, pues si la lista esta ordenada por esa columna, seguramente facilitara el trabajo del filtro>
Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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
''' fijate que aqui no ponemos el/los cierres de parentesis al final de criterio
''' para dejarlo abierto por si hay que añadir el de la hoja con uno mas
Criterio = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Next
End With
Set BD = Nothing
End Sub
bueno, lo dicho, espero no estarte liando mas
un saludo
Ivan
aqui faltaria empezar con un cierre de parentesis el criterio si hoja
a-320
quedaria asi=>>
If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"
de todas formas creo que esta otra macro me gusta mas por lo mismo que
lo de ultf_BD, por no volver a dar valor al criterio comun en cada
Sub FiltrarPorRefYCantidad_2()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, ultF As
Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = ",or(and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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
If hj.Name = "A-320" Then _
Criterio = Criterio1 & ",and(e2>=700000,e2<=790000)"
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: .[v2].Clear: End With
End If
Next
End With
Set BD = Nothing
End Sub
un saludo y disculpa de nuevo
Ivan
PD: si decides probar la anterior (añadiendole el cierre de
parentesis, cambiale antes el nombre al codigo, pues te podria dar
error por nombre ambiguo(duplicado) y yo no me di cuenta de hacerlo- Ocultar texto de la cita -
- Mostrar texto de la cita -
hola Manuel,
aunque pronto te devolvere el archivo con lo que vea, en realidad el
motivo del error es (culpa mia) lo que te comentaba al principio del
ultimo mensaje. Me habia comido un cierre de parentesis
tras esta linea:=>
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
=>> esto=>>
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
quedaria asi=>>
If hj.Name = "A-320" Then _
Criterio = Criterio & "),and(e2>=700000,e2<=790000"
asi parece funcionar
un saludo
Ivan
(de todas formas reconocco que tus conocimientos en estos temas me sobrepasan
y con mucho).
la verdad es que mi nivel es bastante basico, y lo que aumente suele
hacerlo a costa de los maestros de este foro, y de las consultantes a
los que mareo, como a ti, a los cuales creo que les vendria mejor la
ayuda de alguien mas experto, pero egoistamente no me puedo resistir a
'practicar' con lo que mas o menos creo puedo ayudar a resolver
y, en cuanto a tu nivel, no se cual es exactamente, pero por tu forma
de llevar el hilo, me da la impresion de que si no es alto, si puede
aumentar rapidamente y con facilidad
Bucanero
2007-06-18 17:03:00 UTC
Permalink
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
Post by Bucanero
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."
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>=215000,e2<=216100)", _
",e2>=213100,e2<=213900) ", _
",e2=242100)", _
",e2=261200)", _
",e2=284200)", _
",e2>=361100,e2=361200)", _
",e2=362200)", _
",e2=261300)", _
",e2>=490000,e2<=499000)", _
",e2>=700000,e2<=790000)")
**==> 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.
Post by Ivan
Post by Bucanero
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.
Gracias.
Post by Ivan
hola,
aunque ahora no tengo mucho tiempo (hasta dentro de un ratillo, je,
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
Post by Bucanero
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
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
Post by Bucanero
. 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
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
Ivan
2007-06-18 19:09:36 UTC
Permalink
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>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2<=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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>=700000,e2<=790000)" 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>=361100,e2<=361200),"
Bucanero
2007-06-19 21:29:59 UTC
Permalink
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
Post by Ivan
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>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000"
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 _
Post by Ivan
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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.
Post by Ivan
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>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2<=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
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>=700000,e2<=790000)" 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>=361100,e2<=361200),"
Ivan
2007-06-21 00:41:18 UTC
Permalink
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>=700000,e2<=790000"
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>=700000,e2<=790000"
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
Bucanero
2007-06-22 07:18:00 UTC
Permalink
Buenos días, Ivan

Perdona el retraso, pero ya sabes cosa del trabajo. En fin ya estoy aqui de
nuevo dando el coñazo. Lo he modificado como me has dicho de la siguiente
manera:

Sub FiltrarPorRefYCantidad()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, _
ultF As Long, ultF_BD As Long, rngDestino As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
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>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)," & _
"e2=261002,and(e2>=700000,e2<=799000"
Select Case hj.Name
Case "A-320"
Criterio = Criterio & ",and(e2>=242100,e2<=242199)," & _
"e2=361100,e2=261200"
Case "M-XX"
Criterio = Criterio & "and(e2=216100,e2=261400"
Case "M-X1"
Criterio = Criterio & "and(e2=216100,e2=261400"
Case "B-XXX"
Criterio = Criterio & "and(e2>=241100,e2<=241110"
End Select

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
Next
End With
Set BD = Nothing
End Sub

Bueno que me estoy volviendo torpe o... pero el caso es que no doy con la
solución.

Si necesitas el fichero de nuevas te lo puedo generar otra vez, pues yo lo
importo de un archivo en formato de texto. Asi que generarlo es poca cosa.

Voy a seguir currando, que hoy tengo mucho que hacer.

Un saludo
Post by Ivan
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>=700000,e2<=790000"
por una estructura If .....Then ...........ElseIf.......Then , o por un Select Case
Select Case hj.Name
Case "A-320"
Criterio = Criterio & ",and(e2>=700000,e2<=790000"
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
Ivan
2007-06-22 10:20:52 UTC
Permalink
hola Manuel,

no lo he probado, pero prueba a cambiar tu select case (mantienes el
problema del cierre de parentesis que te comente)=>>>

Select Case hj.Name
Case "A-320"
Criterio = Criterio & ",and(e2>=242100,e2<=242199)," & _
"e2=361100,e2=261200"
Case "M-XX"
Criterio = Criterio & "and(e2=216100,e2=261400"
Case "M-X1"
Criterio = Criterio & "and(e2=216100,e2=261400"
Case "B-XXX"
Criterio = Criterio & "and(e2>=241100,e2<=241110"
End Select

por este otro =>>>>

Select Case hj.Name
Case "A-320"
Criterio = Criterio & "),and(e2>=242100,e2<=242199)," & _
"e2=361100,e2=261200"
Case "M-XX"
Criterio = Criterio & "),and(e2=216100,e2=261400"
Case "M-X1"
Criterio = Criterio & "),and(e2=216100,e2=261400"
Case "B-XXX"
Criterio = Criterio & "),and(e2>=241100,e2<=241110"
End Select

a ver que tal (veo que no acabas de animarte a usar el ultimo codigo)

un saludo
Ivan
Ivan
2007-06-22 12:26:01 UTC
Permalink
hola de nuevo,

un comentario respecto a esto=>>>
pues yo lo importo de un archivo en formato de texto
supongo que este es el motivo de que todas las celdas esten repletas
de 'espacios' tanto por delante como por detras, complicando un poco
la cosa ( ten en cuenta que las siguientes 'cadenas' no son iguales :
"Casa", " Casa", " Casa " y/o " Casa ", y en tu archivo, siguiendo el
ej. algunos son asi: " Casa", " Casa " o "Casa "
<considera cada cadena como TODO lo que va entre las comillas> )

te convendria quitar dichos espacios, por ejemplo, si es por codigo
con algo como : 'celda tal = Trim(celda tal) o via formula poniendote
en una nueva hoja y algo asi (pej) en a1 pones '=espacios(ianorf!a1) ,
ojo a los nros y fechas pues se convertiran en texto(si es que no lo
son ya) y deberias reconvertirlos.(creo)

bueno, es solo porque esto tambien te puede estar dando problemas

un saludo
Ivan
Bucanero
2007-06-23 17:06:00 UTC
Permalink
Post by Ivan
hola de nuevo,
un comentario respecto a esto=>>>
pues yo lo importo de un archivo en formato de texto
supongo que este es el motivo de que todas las celdas esten repletas
de 'espacios' tanto por delante como por detras, complicando un poco
"Casa", " Casa", " Casa " y/o " Casa ", y en tu archivo, siguiendo el
ej. algunos son asi: " Casa", " Casa " o "Casa "
<considera cada cadena como TODO lo que va entre las comillas> )
te convendria quitar dichos espacios, por ejemplo, si es por codigo
con algo como : 'celda tal = Trim(celda tal) o via formula poniendote
en una nueva hoja y algo asi (pej) en a1 pones '=espacios(ianorf!a1) ,
ojo a los nros y fechas pues se convertiran en texto(si es que no lo
son ya) y deberias reconvertirlos.(creo)
bueno, es solo porque esto tambien te puede estar dando problemas
un saludo
Ivan
Bucanero
2007-06-24 10:19:00 UTC
Permalink
"Bucanero" escribió:
Hola que tal,

Ayer por la tarde te puse un comentario sobre un nuevo problema que me dá la
macro, pero no se por que motivo no ha salido expuesto, asi que te lo vuelvo
a comentar. El problema es el suiguiente


Select Case hj.Name
Case "A-320"
Criterio = Criterio & "),and(e2>=242100,e2<=242199)," & _
"e2=361100,e2=261200"
Case "M-XX"
Criterio = Criterio & "),and(e2=216100,e2=261400"
Case "M-X1"
Criterio = Criterio & "),and(e2=216100,e2=261400"
Case "B-XXX"
Criterio = Criterio & "),and(e2>=241100,e2<=241110"
End Select

con los datos concretos (no te los pongo ahora por que no los tengo aquí,
sino en casa) y me da un error de una ventana con un 400, cuando llega a la
útima hoja, es decir, la del A-320. Las demas hojas si las hace sin ningun
problema, y nos las he cambiado de nombre.

En fin, ahora no puedo seguir mucho con el tema, pero cuando llegue a casa
continuaré.

un saludo
Manuel
Post by Ivan
hola de nuevo,
un comentario respecto a esto=>>>
pues yo lo importo de un archivo en formato de texto
supongo que este es el motivo de que todas las celdas esten repletas
de 'espacios' tanto por delante como por detras, complicando un poco
"Casa", " Casa", " Casa " y/o " Casa ", y en tu archivo, siguiendo el
ej. algunos son asi: " Casa", " Casa " o "Casa "
<considera cada cadena como TODO lo que va entre las comillas> )
te convendria quitar dichos espacios, por ejemplo, si es por codigo
con algo como : 'celda tal = Trim(celda tal) o via formula poniendote
en una nueva hoja y algo asi (pej) en a1 pones '=espacios(ianorf!a1) ,
ojo a los nros y fechas pues se convertiran en texto(si es que no lo
son ya) y deberias reconvertirlos.(creo)
bueno, es solo porque esto tambien te puede estar dando problemas
un saludo
Ivan
Ivan
2007-06-25 01:44:17 UTC
Permalink
hola Manuel,

al final mas que un hilo parece una ristra.

al final te paso un codigo para que lo pruebes, pero te hago un par de
comentarios.

1º pega el codigo en un mcdulo NORMAL (menu insertar-> Modulo (a
secas) -> y en la pagina que se abre lo pegas (NO en el modulo de
Thisworkbook NI de las hojas)

2º aunque supongo que es un despiste de transcripcion, algunos de los
nuevos criterios que expones son un 'poquito' imposibles de
conseguir ,pej: and(e2=216100,e2=261400) convendras conmigo en que
resulta dificil que sea igual a 216100 y a la vez lo sea a 261400. Si
lo que quieress son filtrar los iguales quitales el and y los
parentesis, si buscas el intervalo añadeles el '<' y el '>' (en el
codigo que te paso es esto lo que he hecho)

bueno, prueba a ver esta modificacion. A mi me acaba de funcionar
perfectamenteen el archivo que me mandaste

Sub FiltrarPorRefYCantidad_3()
Dim hj As Worksheet, BD As Worksheet, Criterio As String, ultF As
Long, _
ultF_BD As Long, rngDestino As String, Criterio1 As String
Set BD = ThisWorkbook.Worksheets("lanorf")
With BD
If .AutoFilterMode Then .AutoFilterMode = False
On Error Resume Next
.ShowAllData
On Error GoTo 0
ultF_BD = .[c65536].End(xlUp).Row
Criterio1 = "and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100),e2=242100,e2=261200," & _
"e2=261300,e2=284200,and(e2>=361100,e2<=361200)," & _
"e2=362200,and(e2>=490000,e2<=499000)"
For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "lanorf" And Application.CountIf(.[c:c], hj.Name)
0 Then
''' si te diera problemas con esta parte, desmarca el siguiente
'If' y
''' ponle una comilla simple al anterior o eliminalo
' If hj.Name <> "lanorf" Then
.[a1:t1].Copy hj.[a1]: ultF = hj.[c65536].End(xlUp).Row + 1
rngDestino = "a" & ultF & ":t" & ultF
Select Case hj.Name
Case "A-320"
Criterio = Criterio1 & ",and(e2>=242100,e2<=242199)," & _
"e2=261200,e2=361100"
Case "M-XX", "M-X1"
Criterio = Criterio1 & ",and(e2>=216100,e2<=261400)"
Case "B-XXX"
Criterio = Criterio1 & ",and(e2>=241100,e2<=241110)"
Case Else
Criterio = Criterio1
End Select
Criterio = "=and(c2=""" & hj.Name & """,or(" & 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
Set BD = Nothing
End Sub

bueno a ver si hay suerte

un saludo
ivan

PD: revisa los criterios ('despacito')

PPD: en unos dis te devuelvo tu archivo (ando liado)
Ivan
2007-06-25 02:32:08 UTC
Permalink
hola de nuevo, Manuel

como siempre me repito:

aunque no dejes de leer lo comentado en el mensaje anterior, si
quieres prueba mejor este codigo, pues aparte de aclarar bastante el
codigo, te permite manipular los criterios/constantes con mucha mas
comodidad, aprte de velas mejor


pega TODO esto en un modulo NORMAL NUEVO sobre lo que haya (borralo o
sobreescribelo, para que solo te quede esto en el modulo) (ojo a los
saltos delinea y revisa/ajusta los criterios)

'' pega desde aqui
Option Explicit
'' constantes con los criterios para que puedas manipularlos
'' con mas facilidad y aclarar el codigo
'
Public Const Criterios_Comunes As String = _
"and(e2>=213100,e2<=213900)," & _
"and(e2>=215000,e2<=216100)," & _
"e2=242100," & _
"e2=261200," & _
"e2=261300," & _
"e2=284200," & _
"and(e2>=361100,e2<=361200)," & _
"e2=362200," & _
"and(e2>=490000,e2<=499000)"
Public Const Criterios_A320 As String = _
",and(e2>=242100,e2<=242199)" & _
",e2=261200," & _
"e2=361100"
Public Const Criterios_M87_M88 As String = _
",and(e2>=216100,e2<=261400)"
Public Const Criterios_B757 As String = _
",and(e2>=241100,e2<=241110)"
'
'' procedimiento------------------------------
'
Sub FiltrarPorRefYCantidad_4()
Dim Criterio1 As String, Criterio As String, _
ultF_BD As Long, ultF As Long, hj As Worksheet
With ThisWorkbook.Worksheets("lanorf")
If .AutoFilterMode Then .AutoFilterMode = False
ultF_BD = .[c65536].End(xlUp).Row
For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "lanorf" And _
Application.CountIf(.[c:c], hj.Name) > 0 Then
.[a1:t1].Copy hj.[a1]
ultF = hj.[c65536].End(xlUp).Row + 1
Select Case hj.Name
Case "A-320": Criterio = Criterios_Comunes & Criterios_A320
Case "M-87", "M-88"
Criterio = Criterios_Comunes & Criterios_M87_M88
Case "B-757": Criterio = Criterios_Comunes & Criterios_B757
Case Else: Criterio = Criterios_Comunes
End Select
Criterio = "=and(c2=""" & hj.Name & """,or(" & Criterio & "))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
Action:=xlFilterCopy, _
criteriarange:=.[v1:v2], _
copytorange:=hj.Range("a" & ultF & ":t" & ultF), _
unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: End With
End If
Next
.[v2].Clear
End With
End Sub
'' hasta aqui

a ver que tal

un saaaludo
ivan

Bucanero
2007-06-17 11:35:00 UTC
Permalink
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.
Post by Bucanero
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.
Loading...