Filtrar lista en BVA

14/04/2006 - 04:12 por Carlos Gonzalez | Informe spam
Saludos.

Necesito desde una macro filtrar los datos de una columna, por ejemplo
celdas que tengan números mayores que "0", y una vez filtrado guardar en un
arreglo nx1 la dirección original de la fila en que se encuentra cada dato
que cumple con el criterio del filtro en orden de aparición. Lo sé hacer
desde Excel con autofiltro y fórmulas pero al tratar de hacerlo con código la
grabadora de macros no me ayuda mucho.

Agradezco de antemano la colaboración que me puedan prestar.

Carlos González

Preguntas similare

Leer las respuestas

#11 Héctor Miguel
16/04/2006 - 10:43 | Informe spam
hola, Carlos !

... cada cuadro en "hoja2" tiene al principio 5 columnas (B a F) y 45 filas (9 a 53 para el primer cuadro, 54 a 99 el segundo...)
... es posible que aumente el numero de filas en algunos... lo que hace perder la simetria para poder calcular posicion con formulas.
En "hoja3" las 5 columnas van de B a F filtrando... columna D criterio no vacias aparecerian p.e 5 filas
... filtrando en hoja2 columna A criterio igual a "1" aparecerian tambien 5 filas (una de cada cuadro) para llevar informacion asi:
a) Texto de columnas B y C (item y descripcion)... fila filtrada de hoja 3 copiar y concatenar en columna B... fila filtrada de hoja2
b) Texto de columna D... fila filtrada de hoja3 en columna F... fila filtrada en hoja 2 [...]



[pues]... algunos detalles se han quedado -todavia- 'en el tintero' :-)) [p.e.]
- no tengo idea de cuantas filas pueda haber en cada una de las hojas :-((
- es [solo] probable que puedas 'evitar' los autofiltros -?-
suponiendo que SIEMPRE habra 5 filas 'aplicables' en cada hoja...
-> NO vacias en la columna 'D' de la hoja3 y...
-> celdas con '1' en la columna 'A' de la hoja2

-> estoy usando el metodo 'Evaluate' [que pudiera resultar lento en operaciones mas extensas... pero si se trata de SOLO 5 registros]... ;)
-> tambien estoy 'asignando' los rangos y nombres de las hojas COMO TEXTO en el codigo de la macro :-((
[p.e. estoy suponiendo que el rango de la hoja3 es 'D2:D40' y el de la hoja2 es 'A2:A250']
[a falta de los rangos 'reales'... -> TU tendras que 'ingeniartelas' para ajustarlos a los nombres y rangos aplicables'] :D

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

en un modulo de codigo 'normal' ==Sub Pasar_datos()
Dim Origen, Destino, Sig As Byte, Fila_O As Integer, Fila_D As Integer
Origen = Evaluate("If(not(isblank(hoja3!d2:d40)),row(hoja3!d2:d40))")
Destino = Evaluate("If(hoja2!a2:a250=1,row(hoja2!a2:a250))")
With Worksheets("hoja3")
For Sig = 1 To 5
Fila_O = Application.Small(Origen, Sig)
Fila_D = Application.Small(Destino, Sig)
Worksheets("hoja2").Cells(Fila_D, "b") = .Cells(Fila_O, "b") & " " & .Cells(Fila_O, "c")
Worksheets("hoja2").Cells(Fila_D, "f") = .Cells(Fila_O, "d")
Next
End With
End Sub
Respuesta Responder a este mensaje
#12 Carlos Gonzalez
16/04/2006 - 19:33 | Informe spam
Hola, Héctor.

El número de filas en hoja3 depende de cada proyecto. Yo hice un libro de
trabajo que hace todo lo que requiero pero es completamente formulado (
muchas funciones buscarv, sumar.si ). Todo iba bien hasta que precisamente el
numero de filas de hoja3 pasó de ser maximo 50 a 150 en algunas ocasiones. En
estos casos cada vez que "entraba" un dato por teclado se hizo notorio el
"calculando" que aparece en la parte inferior de la hoja. La solución de
poner el "cálulo en manual" se me hizo un tanto simple y por eso se me
ocurrio rehacerr todo el archivo pero con macros.

Estoy tratando de entender el código que me enviaste. No consigo información
con "F1" sobre "application.small" ; el if( xxxx, xxxx).

Identifique el "isblank" como un msofilter pero tampoco hay ayuda.

Donde puedo encontrar información al respecto?

Lo de los rangos de busqueda se puede solucionar con rangos dinamicos?

Lo "lento" que comentas del metodo evaluate es mas lento que por formulación
directa en la hoja (como estaba antes)?

Muchas gracias nuevamente.

Carlos González

P.D. Te puedo enviar el archivo original (el formulado) a alguna dirección
de correo para que te hagas una mejor idea del proyecto?
Respuesta Responder a este mensaje
#13 Héctor Miguel
16/04/2006 - 23:33 | Informe spam
hola, Carlos !

1) para que puedas 'analizar' [y entender] el codigo propuesto, [primero] lo pego a continuacion:
Sub Pasar_datos()
Dim Origen, Destino, Sig As Byte, Fila_O As Integer, Fila_D As Integer
Origen = Evaluate("If(not(isblank(hoja3!d2:d40)),row(hoja3!d2:d40))")
Destino = Evaluate("If(hoja2!a2:a250=1,row(hoja2!a2:a250))")
With Worksheets("hoja3")
For Sig = 1 To 5
Fila_O = Application.Small(Origen, Sig)
Fila_D = Application.Small(Destino, Sig)
Worksheets("hoja2").Cells(Fila_D, "b") = .Cells(Fila_O, "b") & " " & .Cells(Fila_O, "c")
Worksheets("hoja2").Cells(Fila_D, "f") = .Cells(Fila_O, "d")
Next
End With
End Sub

2) los 'supuestos' que utilice [comentados en el post anterior] son los siguientes
a) SIEMPRE habra 5 celdas NO vacias en la columna 'D' de hoja3 que se corresponden con 5 celdas con '1' en la columna 'A' de hoja2
-> For Sig = 1 To 5
b) el rango que se esta 'evaluando' para cada hoja son las instrucciones [hoja3 'D2:D40' y hoja2 'A2:A50']...
-> Origen = Evaluate("If(not(isblank(hoja3!d2:d40)),row(hoja3!d2:d40))")
-> Destino = Evaluate("If(hoja2!a2:a250=1,row(hoja2!a2:a250))")
c) las instrucciones con 'Application.Small(...' [que es una 'llamada' por codigo a funciones de hoja de calculo 'K.Esimo.Menor']
sirven para obtener una matriz con las filas [de cada hoja y rango] que 'cumplen' con los criterios...
-> NO vacias en hoja3 rango 'D2:D40'
-> contenido '1' en hoja2 rango 'A2:A250'

3) 'regresando' a tus comentarios en esta consulta... [tratare de contestarte 'entre lineas'] :D

-> revisa... analiza... adapta/cambia/complementa/... donde corresponda -> HAZ algunas pruebas... y
si cualquier duda [o informacion adicional]... comentas ?

saludos,
hector.

El numero de filas en hoja3 depende de cada proyecto... iba bien hasta que... paso de... 50 a 150 en algunas ocasiones.



-> 'asumiendo' que SIEMPRE habra 5 NO-vacias [hoja3]... puedes 'dejar cubiertas' mas filas si modificas la instruccion 'Origen' [p.e.
de: -> Origen = Evaluate("If(not(isblank(hoja3!d2:d40)),row(hoja3!d2:d40))")
a: -> Origen = Evaluate("If(not(isblank(hoja3!d2:d300)),row(hoja3!d2:d300))")

... tratando de entender el codigo que me enviaste. No consigo informacion con "F1" sobre "application.small" ; el if( xxxx, xxxx).
Identifique el "isblank" como un msofilter pero tampoco hay ayuda.
Donde puedo encontrar información al respecto?



-> lo del application.small ya esta comentado en el punto 2 c)
lo del 'isblank' -> son 'evaluaciones' de formulas [que normalmemte se utilizan desde la hoja de calculo]...
donde VBA interpreta/resuelve/... el resultado correspondiente [pero] para aplicacion 'directa' en codigos :))
para lo cual... VBA utiliza el metodo -> Evaluate("alguna cadena de texto como formulas, funciones, etc.")
-> si requieres de ayuda para esta 'forma'... -> consulta acerca del metodo Evaluate ;)

Lo de los rangos de busqueda se puede solucionar con rangos dinamicos?



-> si es posible utilizar/definir/buscar/... 'ciertos' rangos de manera 'dinamica' ;)
[es solo que]... habiendo un 'amplio abanico' de posibilidades... no 'estorbaria' conocer algunos detalles mas... 'especificos' :))

Lo "lento" que comentas del metodo evaluate es mas lento que por formulacion directa en la hoja (como estaba antes)?



-> [yo considero que]... NO... para este 'preciso' caso donde se necesita 'localizar' [solamente] 5 -posibles- registros/filas/celdas/... ;)

P.D. Te puedo enviar el archivo original (el formulado) a alguna direccion de correo para que te hagas una mejor idea del proyecto?



-> si despues de 'animarte' a correr algunas pruebas despues de 'ajustar donde corresponda'... lo consideras necesario... :D
solo quita de la direccion que aparece el 'NO...SPAM...PLS'
Respuesta Responder a este mensaje
#14 Carlos Gonzalez
19/04/2006 - 17:22 | Informe spam
Hola, Héctor:

Gracias por las aclaraciones.

Estoy probando y adaptando según necesidades el código expuesto.

En hoja3 rango a2:a250 donde "plante" un 1" para facilitar su busqueda,
seria en el caso "real" mas descriptivo usar un texto como "UNIDAD".
Modifique el código de:

Destino = Evaluate("If(hoja2!a2:a250=1,row(hoja2!a2:a250))")

a:

Destino = Evaluate("If(hoja2!a2:a250="UNIDAD",row(hoja2!a2:a250))")

pero ni siquiera compila correctamente, indica que espera separador de
listas o algo así.

Intente definir una variable A ="unidad" y reemplazar el 1 por A y tampoco
funciona.

Donde esta el error?

Por otra parte, en el caso "real" el número de celdas no vacias en hoja 3
columna D es bastante variable y con frecuencia superior
a 50. Ademas el rango total de busqueda siempre es mayor pero cerca al de
celdas no vacias en "D". Dicho de otra forma, las celdas vacias en hoja3
columna D son máximo 20% de las no vacias.

Estas condiciones modifican la selecion del metodo "Evalute" sobre los otros
que mencionas o sigue vigente?

Muchas gracias por la ayuda.

Carlos González.

P.D Si me demoro mucho "probando" es mejor empezar otro hilo o continuo en
este?
Respuesta Responder a este mensaje
#15 Héctor Miguel
19/04/2006 - 23:28 | Informe spam
hola, Carlos !

Estoy probando y adaptando segun necesidades el codigo expuesto. En hoja3 rango a2:a250
donde "plante" un "1" para facilitar su busqueda, seria en el caso "real" mas descriptivo usar un texto como "UNIDAD".
Modifique el codigo de: Destino = Evaluate("If(hoja2!a2:a250=1,row(hoja2!a2:a250))")
a: Destino = Evaluate("If(hoja2!a2:a250="UNIDAD",row(hoja2!a2:a250))")
pero ni siquiera compila correctamente, indica que espera separador de listas o algo asi
Intente definir una variable A ="unidad" y reemplazar el 1 por A y tampoco funciona. Donde esta el error?



1) el 'detalle' esta en que el metodo 'evaluate' YA esta evaluando un texto delimitado por comillas dobles :))
si necesitas que evalue comillas dobles DENTRO de la expresion... necesitaras indicarlas 'dobles' [me explico]...
de: -> Destino = Evaluate("If(hoja2!a2:a250="UNIDAD",row(hoja2!a2:a250))")
a: -> Destino = Evaluate("If(hoja2!a2:a250=""unidad"",row(hoja2!a2:a250))")

... en el caso "real" el numero de celdas no vacias en hoja 3 columna D es bastante variable y con frecuencia superior a 50.
Ademas el rango total de busqueda siempre es mayor pero cerca al de celdas no vacias en "D".
Dicho de otra forma, las celdas vacias en hoja3 columna D son maximo 20% de las no vacias.
Estas condiciones modifican la selecion del metodo "Evaluate" sobre los otros que mencionas o sigue vigente?



2) podra 'seguir vigente'... SI... tomas 'en consideracion' un rango lo 'suficientemente amplio' para las posibles variantes -?-
si pudiera haber mas de 50 filas [y el rango se extiende p.e. hasta D100]... cambia la instruccion con el metodo evaluate...
de: -> Origen = Evaluate("If(not(isblank(hoja3!d2:d40)),row(hoja3!d2:d40))")
a: -> Origen = Evaluate("If(not(isblank(hoja3!d2:d100)),row(hoja3!d2:d100))")

P.D Si me demoro mucho "probando" es mejor empezar otro hilo o continuo en este?



3) si 'el tema' empieza a cambiar de rumbo [probablemente] seria mejor iniciar una nueva consulta -?-
si el tema sigue siendo acerca del tema inicial... [creo que] lo unico que se esta 'afectando' pudiera ser...
'mi efectividad' y/o 'mi capacidad' para adivinar lo que quien consulta pudiera haber dejado 'en el tintero' :DD

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida