Macro: Copiar y pegar de una hoja a otra

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

Preguntas similare

Leer las respuestas

#11 Ivan
15/06/2007 - 17:22 | Informe spam
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
Respuesta Responder a este mensaje
#12 Ivan
15/06/2007 - 22:11 | Informe spam
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>!3100;E2<!3900);Y(E2>!5000;E2<!6100);E2$2100;E2&1200;E2&1300;E2(4200;Y(E2>61100;E261200);E262200;Y(E2>I0000;E2<I9000)))

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>p0000,e2<y0000), 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>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e261200)," & _
"e262200,and(e2>I0000,e2<I9000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>p0000,e2<y0000"
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & ")))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[v2].Clear: End With
End If
Next
End With
Set BD = Nothing
End Sub

bueno, lo dicho, espero no estarte liando mas

un saludo
Ivan
Respuesta Responder a este mensaje
#13 Ivan
15/06/2007 - 23:07 | Informe spam
On 15 jun, 22:11, "Ivan" wrote:
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>!3100;E2<!3900);Y(E2>!5000;E2<!6100);E2$2100­;E2&1200;E2&1300;E2(4200;Y(E2>61100;E261200);E262200;Y(E2>I00­00;E2<I9000)))

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>p0000,e2<y0000), 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>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e261200)," & _
"e262200,and(e2>I0000,e2<I9000"
''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
If hj.Name = "A-320" Then _
Criterio = Criterio & ",and(e2>p0000,e2<y0000"
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & ")))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[v2].Clear: End With
End If
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>p0000,e2<y0000"

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>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e261200)," & _
"e262200,and(e2>I0000,e2<I9000)"
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>p0000,e2<y0000)"
Else _
Criterio = Criterio1
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & "))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[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
Respuesta Responder a este mensaje
#14 Bucanero
16/06/2007 - 01:47 | Informe spam
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


"Ivan" escribió:

On 15 jun, 22:11, "Ivan" wrote:
> 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>!3100;E2<!3900);Y(E2>!5000;E2<!6100);E2$2100­;E2&1200;E2&1300;E2(4200;Y(E2>61100;E261200);E262200;Y(E2>I00­00;E2<I9000)))
>
> 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>p0000,e2<y0000), 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>!3100,e2<!3900)," & _
> "and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
> "e2&1300,e2(4200,and(e2>61100,e261200)," & _
> "e262200,and(e2>I0000,e2<I9000"
> ''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
> If hj.Name = "A-320" Then _
> Criterio = Criterio & ",and(e2>p0000,e2<y0000"
> Criterio = "=and(c2=""" & hj.Name & """" & Criterio & ")))"
> .[v1:v2].ClearContents: .[v2].Formula = Criterio
> .Range("a1:t" & ultF_BD).AdvancedFilter _
> action:=xlFilterCopy, criteriarange:=.[v1:v2], _
> copytorange:=hj.Range(rngDestino), unique:=False
> With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[v2].Clear: End With
> End If
> 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>p0000,e2<y0000"

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>!3100,e2<!3900)," & _
"and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
"e2&1300,e2(4200,and(e2>61100,e261200)," & _
"e262200,and(e2>I0000,e2<I9000)"
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>p0000,e2<y0000)"
Else _
Criterio = Criterio1
Criterio = "=and(c2=""" & hj.Name & """" & Criterio & "))"
.[v1:v2].ClearContents: .[v2].Formula = Criterio
.Range("a1:t" & ultF_BD).AdvancedFilter _
action:=xlFilterCopy, criteriarange:=.[v1:v2], _
copytorange:=hj.Range(rngDestino), unique:=False
With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[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



Respuesta Responder a este mensaje
#15 Bucanero
17/06/2007 - 01:13 | Informe spam
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 _
> 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.


"Ivan" escribió:

On 16 jun, 01:47, Bucanero wrote:
> 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
>
> "Ivan" escribió:
>
>
>
> > On 15 jun, 22:11, "Ivan" wrote:
> > > 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>!3100;E2<!3900);Y(E2>!5000;E2<!6100);E2$2100­­;E2&1200;E2&1300;E2(4200;Y(E2>61100;E261200);E262200;Y(E2>I0­0­00;E2<I9000)))
>
> > > 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>p0000,e2<y0000), 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>!3100,e2<!3900)," & _
> > > "and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
> > > "e2&1300,e2(4200,and(e2>61100,e261200)," & _
> > > "e262200,and(e2>I0000,e2<I9000"
> > > ''' aqui es donde añadimos el criterio de la hoja que tiene uno mas
> > > If hj.Name = "A-320" Then _
> > > Criterio = Criterio & ",and(e2>p0000,e2<y0000"
> > > Criterio = "=and(c2=""" & hj.Name & """" & Criterio & ")))"
> > > .[v1:v2].ClearContents: .[v2].Formula = Criterio
> > > .Range("a1:t" & ultF_BD).AdvancedFilter _
> > > action:=xlFilterCopy, criteriarange:=.[v1:v2], _
> > > copytorange:=hj.Range(rngDestino), unique:=False
> > > With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[v2].Clear: End With
> > > End If
> > > 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>p0000,e2<y0000"
>
> > 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>!3100,e2<!3900)," & _
> > "and(e2>!5000,e2<!6100),e2$2100,e2&1200," & _
> > "e2&1300,e2(4200,and(e2>61100,e261200)," & _
> > "e262200,and(e2>I0000,e2<I9000)"
> > 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>p0000,e2<y0000)"
> > Else _
> > Criterio = Criterio1
> > Criterio = "=and(c2=""" & hj.Name & """" & Criterio & "))"
> > .[v1:v2].ClearContents: .[v2].Formula = Criterio
> > .Range("a1:t" & ultF_BD).AdvancedFilter _
> > action:=xlFilterCopy, criteriarange:=.[v1:v2], _
> > copytorange:=hj.Range(rngDestino), unique:=False
> > With hj: .Rows(ultF).Delete: .Columns.AutoFit: .[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>p0000,e2<y0000"

quedaria asi=>>

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


asi parece funcionar

un saludo
Ivan

PD:

> (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


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