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