BUSQUEDA EN DOS HOJAS DE UN MISMO LIBRO

14/11/2005 - 22:32 por Marvin | Informe spam
GRACIAS KL, Y DISCULPA QUE HASTA AHORA TE RESPONDA, ESTUVE DE VACACIONES
TE RESPONDO TUS PREGUNTAS... GRCS



Hola Marvin,

Unas preguntas:
1) ?El archivo LIBRO.TXT me imagino debera estar abierto al ejecutar tu
codigo, no? De lo contrario habria que incluir la ruta completa en la
formula. ?Cual es la ruta?


LA RUTA PUEDE SER CUALQUIERA NO? O DEBEMOS ESPECIFICAR ALGUNA?


2) ?Si tal como sugiere la extension el archivo LIBRO.TXT es un archivo de
texto como puede tener mas de una hoja?


TIENES RAZON ME EQUIVOQUE, EL ARCHIVO ES XLS


3) ?La busqueda tiene que realizarse mediante formula necesariamente o se
puede hacerlo mediante instrucciones VBA devolviendo los resultados finales
como constantes?


DE PREFERENCIA POR FORMULA, PERO ES POSIBLE HACERLO POR INTRUCCIONES VB,
SERIA MÁS LENTO EL PROCESO NO?


4) ?Cual es el nombre de la segunda hoja del archivo LIBRO.TXT en la cual
hay que buscar?


DE IGUAL MANERA PUEDE SER CUALQUIERA, POR ESO NO HAY PROBLEMA


5) ?El rango de busqueda en la segunda hoja es el mismo que el de la
primera?


ES CORRECTO, CONTIENEN LOS MISMOS CAMPOS, DIGAMOS QUE ES UNA CONTINUACIÓN DE
LA PRIMER HOJA


6) ?Si el valor se encuentra en ambas hojas, cual tiene la preferencia?


NO PUEDE SER YA QUE COMO TE COMENTE EN LA PREGUNTA ANTERIOR, ES
CONTINUACIÓN, LOS VALORES DE BUSQUEDA NO SE REPITEN


7) ?Si el valor no se encuentra en ninguna de las tablas es necesario
devolver error o podria ser directamente el "No Existe" sin tener que
emplear la segunda formula?


ES CORRECTO, PUEDE SER DIRECTO O UTILIZAR LA SEGUNDA FORMULA..



De momento te paso tu codigo optimizado, pero sin incluir la posibilidad de
buscar en dos hojas (lo cual estara sujeto a las respuestas que me des a las
7 preguntas de arriba):

Dim rng As Range
Windows("RIH_" + Dia + "" + Mes + "" + Anio + "_R8_10DIG.xls").Activate
Set rng = Range(Cells(2, "G"), Cells(2, "G").End(xlDown))
rng.FormulaR1C1 = _
"=IF(AND(RC[-1]>=VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C[-6]:R10110C[15],1,1),RC[-1]<=VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C[-6]:R10110C[15],2,1)),VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C1:R10110C22,3,1),""No
Existe"")"
rng.Offset(, 1).FormulaR1C1 ="=IF(ISERROR(RC[-1]),""No Existe"",RC[-1])"

Saludos,
KL


"Marvin" <Marvin@discussions.microsoft.com> wrote in message
news:6D8075F3-9B46-40D6-94D0-65EA430C1736@microsoft.com...
> QUE TAL GRUPO, ALGUIEN DE UDS SABE DE QUE MANERA PUEDO MODIFICAR MI
> INTRUCCION DE BUSQUEDA PARA QUE CON ESTA MISMA REALICE LA BUSQUEDA TOMANDO
> EN
> CUENTA DATOS DE DOS HOJASEN EL SIGUIENTE CODIGO REALIZO LA BUSQUEDA
> SOBRE
> UNA UNICA HOJA... PERO DEBIDO A LA CANTIDAD DE DATOS HE TENIDO QUE AGREGAR
> UNA SEGUNDA HOJA, ENTONCES QUIERO QUE UTILIZANDO LA MISMA INSTRUCCION ME
> BUSQUE UN DATOS PERO DENTRO DE DOS HOJAS... ES POSIBLE??
>
> Windows("RIH_" + Dia + "" + Mes + "" + Anio + "_R8_10DIG.xls").Activate
> Range("G2").Select
> ActiveCell.FormulaR1C1 = _
>
> "=+IF(AND(RC[-1]>=VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C[-6]:R10110C[15],1,1),RC[-1]<=VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C[-6]:R10110C[15],2,1)),VLOOKUP(RC[-1],'[LIBRO.TXT]LIBRO'!R3C1:R10110C22,3,1),""No
> Existe"")"
> Range("G2").Select
> Selection.Copy
> Range(Selection, Selection.End(xlDown)).Select
> ActiveSheet.Paste
> Range("H2").Select
> Application.CutCopyMode = False
> ActiveCell.FormulaR1C1 = "=+IF(ISERROR(RC[-1]),""No Existe"",RC[-1])"
> Range("H2").Select
> Selection.Copy
>



Preguntas similare

Leer las respuestas

#1 Héctor Miguel
15/11/2005 - 08:27 | Informe spam
hola, Marvin !

me parece que KL 'anda de gira' :p asi que... me gustaria 'cambiarte las preguntas' [si no te molesta] :))

1) la formula que 'depositas' por macros en la celda 'G2' [segun tu consulta original]...
-> al final de cuentas, la formula [ya en el 'lenguaje' de la interfase con el usuario] resulta ser algo +/- como...
=si(y(f2>=buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,1,1),f2<=buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,2,1)),buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,3,1),"no existe")

2) comentas que tu base de datos esta 'particionada' en dos hojas... y que no hay posibilidad de datos 'duplicados'
es decir... o el dato buscado, o se encuentra en una hoja... o se encuentra en la otra... o no se encuentra en ninguna

3) 'mis' preguntas son...
a) por que mantienes un rango de busqueda de 22 columnas [A:V] ? -> '[libro.xls]libro'!$a$3:$v$10110
si SOLO 'buscas' [o comparas el dato buscado] en las columnas 1 o 2 para 'devolver' [en su caso] la columna 3 ???
b) si el ultimo argumento de la funcion -> buscarv(...) ES 1 [y significa que los datos estan ordenados]...
por que necesitas comparar que el dato buscado [F2] sea >= en la columna 1 [A] y... <= en la columna 2 [B] es decir...
si la posibilidad de que el dato 'realmente' exista en la columna 1 [A]... por que la necesidad de la comparacion [>= o <=] ???

-> una primera 'propuesta'... [atendiendo a tu comentario referido en el punto 2]:
suponiendo que en la hoja1 [de un libro X], necesitas encontrar 'un dato'... O en la hoja2... O en la hoja3 [del mismo libro]
podrias probar con una formula +/- como la siguiente:
=elegir(1+contar.si(hoja2!a:a,f2)+2*contar.si(hoja3!a:a,f2),"no existe","buscando en hoja2","buscando en hoja3")

-> con la formula anterior... solo se necesitara 'reemplazar' los: "buscando en hoja2" o... "buscando en hoja3"
por las formulas que 'realmente' necesites [pero sigo 'perdido' en los 'por ques' de mi punto 3] :))

-> probablemente hay datos que 'me estoy perdiendo' [o no has comentado] -?- [p.e.]
es posible que el nombre del libro y las hojas a buscar donde sean 'ficticios' [solo para ejemplo] -?-
y si en la realidad fueran muy... 'laaaargos'... [seguramente] la formula 'final' sea igualmente laaarga :))
sobre todo, si necesitaras 'mantener cerrado' el libro donde se realizan las busquedas [se agrega la ruta 'completa'] :-((

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Marvin
16/11/2005 - 23:07 | Informe spam
RESPONDIENDO A TUS PREGUNTAS AL CALCE DE CADA UNA Y GRCS POR ATENDER LA MIA

"Héctor Miguel" escribió:

hola, Marvin !

me parece que KL 'anda de gira' :p asi que... me gustaria 'cambiarte las preguntas' [si no te molesta] :))

1) la formula que 'depositas' por macros en la celda 'G2' [segun tu consulta original]...
-> al final de cuentas, la formula [ya en el 'lenguaje' de la interfase con el usuario] resulta ser algo +/- como...
=si(y(f2>=buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,1,1),f2<=buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,2,1)),buscarv(
f2,'[libro.xls]libro'!$a$3:$v$10110,3,1),"no existe")

2) comentas que tu base de datos esta 'particionada' en dos hojas... y que no hay posibilidad de datos 'duplicados'
es decir... o el dato buscado, o se encuentra en una hoja... o se encuentra en la otra... o no se encuentra en ninguna

3) 'mis' preguntas son...
a) por que mantienes un rango de busqueda de 22 columnas [A:V] ? -> '[libro.xls]libro'!$a$3:$v$10110
si SOLO 'buscas' [o comparas el dato buscado] en las columnas 1 o 2 para 'devolver' [en su caso] la columna 3 ???


AAHH LO QUE PASA QUE MAS ADELANTE UTILIZO LA MISMA FORMULA PARA TRAERME
DATOS DE OTRAS COLUMNASDE ENTRADA PARA ESTA FORMULA NO IMPORTA, PODEMOS
REDUCIR EL RANGO

b) si el ultimo argumento de la funcion -> buscarv(...) ES 1 [y significa que los datos estan ordenados]...
por que necesitas comparar que el dato buscado [F2] sea >= en la columna 1 [A] y... <= en la columna 2 [B] es decir...
si la posibilidad de que el dato 'realmente' exista en la columna 1 [A]... por que la necesidad de la comparacion [>= o <=] ???



LA RAZON ES POR QUE BUSCO NUMEROS QUE CAIGAN DENTRO DE CADA RANGO, ES DECIR,
SI BUSCO EL VALOR 5555001234 Y EN MI CELDA A1 TENGO EL VALOR 5555002000 Y EN
LA CELDA B1 TENGO 5555002999, POR SU PUESTO QUE NO CAE EN ESTE RANGO, PERO SI
EN ALGUN LUGAR DE LA TABLA TENGO LOS VALORES 5555001000 Y 5555001999, EN ESTE
SI CAE ENTONCES OBTENGO EL VALOR DE LA CELDA "C" QUE CORRESPONDA A ESTE
RANGO...CONOCES ALGUNA OTRA FORMA MAS SENCILLA??? TE LO AGRADECERE...


-> una primera 'propuesta'... [atendiendo a tu comentario referido en el punto 2]:
suponiendo que en la hoja1 [de un libro X], necesitas encontrar 'un dato'... O en la hoja2... O en la hoja3 [del mismo libro]
podrias probar con una formula +/- como la siguiente:
=elegir(1+contar.si(hoja2!a:a,f2)+2*contar.si(hoja3!a:a,f2),"no existe","buscando en hoja2","buscando en hoja3")

-> con la formula anterior... solo se necesitara 'reemplazar' los: "buscando en hoja2" o... "buscando en hoja3"
por las formulas que 'realmente' necesites [pero sigo 'perdido' en los 'por ques' de mi punto 3] :))

-> probablemente hay datos que 'me estoy perdiendo' [o no has comentado] -?- [p.e.]
es posible que el nombre del libro y las hojas a buscar donde sean 'ficticios' [solo para ejemplo] -?-
y si en la realidad fueran muy... 'laaaargos'... [seguramente] la formula 'final' sea igualmente laaarga :))
sobre todo, si necesitaras 'mantener cerrado' el libro donde se realizan las busquedas [se agrega la ruta 'completa'] :-((

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.



TE COMENTO RAPIDAMENTE LO QUE NECESITO...IGUAL Y ME EXPLICO...

TENGO UNA SERIE DE NÚMEROS TELEFONICOS NECESITO SABER A QUE RANGOS
PERTENECEN..ESOS RANGOS ESTAN EN UNA ENORRRRRME TABLA DE APROX 80,000 RANGOS
OBVIAMENTE SEPARADOS EN HOJAS (HOJA1, HOJA2...DEL MISMO LIBRO) ESTOS
PERTENECEN A VARIAS COMPAÑIAS Y PRECISAMENTE ES EL CAMPO QUE DEBO
OBTENERES POR ESO QUE HAGO PRIMERO LA BUSQUEDA APROXIMADA Y DESPUES LA
COMPARACIÓN >= Y <=, ME ELIGE EL RAGO Y ME DICE SI CAE O NOSINO ME DA "NO
EXISTE"

NOTA: LOS NUMEROS ESTAN EN LIBROS INDEPENDIENTES A LA TABLA DE RANGOS

ESPERO ME PUEDAS AYUDAR... GRCS
Respuesta Responder a este mensaje
#3 Héctor Miguel
17/11/2005 - 02:34 | Informe spam
hola, Marvin !

solo tres preguntas mas :DD

-> de los 80,000 registros con 'series' [y grupos] de numeros telefonicos que comentas [p.e. 5555001000 Y 5555001999]...

1) tienen un orden [p.e. ascendente] ?
[A1] 5555001000 [B1] 5555001999
[A2] 5555002000 [B2] 5555002999 [etc. etc. etc.] asumiendo que cualquier 'continuacion' esta en la hoja siguiente :))

2) existen 'lagunas/vacios/saltos/pendientes/...' entre un grupo y el siguiente ? [p.e.]
[A1] 5555001000 [B1] 5555001999
[A2] 5555005000 [B2] 5555005999 [en este ejemplo no 'existen' los grupos 2000-2999, 3000-3999 y 4000-4999]

3) existe algun 'patron' que pudiera servir como 'base' ?
[p.e. un grupo 'iniciado' por 5555, otros grupos iniciados por ????]

comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 Marvin
17/11/2005 - 22:00 | Informe spam
RESPONDO TUS DUDAS.

"Héctor Miguel" escribió:

hola, Marvin !

solo tres preguntas mas :DD

-> de los 80,000 registros con 'series' [y grupos] de numeros telefonicos que comentas [p.e. 5555001000 Y 5555001999]...

1) tienen un orden [p.e. ascendente] ?
[A1] 5555001000 [B1] 5555001999
[A2] 5555002000 [B2] 5555002999 [etc. etc. etc.] asumiendo que cualquier 'continuacion' esta en la hoja siguiente :))



DIGAMOS QUE PARA LA BUSQUEDA LOS ORDENO DE FORMA ASCENDENTE, PERO NO HAY
CONTINUIDAD... P.E.
[A1] 5555001000 [B1] 5555001999
[A3] 5555002000 [B3] 5555002999
[A4] 5555004500 [B4] 5555004999
[A5] 5555005000 [B5] 5555005199
[A6] 5555005200 [B6] 5555005999Y ASI SUCESIVAMENTE


2) existen 'lagunas/vacios/saltos/pendientes/...' entre un grupo y el siguiente ? [p.e.]
[A1] 5555001000 [B1] 5555001999
[A2] 5555005000 [B2] 5555005999 [en este ejemplo no 'existen' los grupos 2000-2999, 3000-3999 y 4000-4999]



ASÍ ES, DE HECHO LO EJEMPLIFICO EN TU PRIMER PREGUNTA


3) existe algun 'patron' que pudiera servir como 'base' ?
[p.e. un grupo 'iniciado' por 5555, otros grupos iniciados por ????]



SI, DIGAMOS QUE LOS RANGOS SE DIFERENCIAN POR CIUDAD 5555, 4777, 3333,
8183, 9988, ECT, ECT.. PERO ESTA PARTE YA NO TE LA CUENTO POR QUE ES AMPLIAR
ESTO MUCHO MAS DE HECHO LAS COLUMNAS A Y B, SON FUSION DE 2 COLUMNAS MÁS,
ES DECIR LOS 6 PRIMERO DIGITOS SON LA BASE DEL RANGO Y LOS 4 RESTANTES
SON LOS TAMAÑOS DE LOS RANGOS

COLUMNA A ES EL RANGO INICIAL Y LA B ES EL RANGO FINAL

AHORA YO TE PREGUNTO... SERÁ POSIBLE CONSIDERAR UN INCREMENTO EN LA TABLA DE
RANGOS MÁS DE 130,000 MAS DE 190,000 MAS DE
270,000...ECT...PODREMOS AGREGAR CUANTAS HOJAS SEA NECESARIO SIN MODIFICAR EL
CODIGO????

NUEVAMENTE GRACIAS¡¡¡

comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
#5 Héctor Miguel
18/11/2005 - 03:33 | Informe spam
hola, Marvin !

tratando de hacer un 'resumen' de las exposiciones [hasta ahora]... asumo que se trata de...
1) una serie de 'grupos' de datos, repartidos en varias hojas en un libro 'X'
-> los datos [aunque estan 'ordenados'] NO tienen un 'patron de secuencia' entre final de un grupo y principio del siguiente
segun comentas, pudieran ser +/- como lo siguiente:
[A2] 5555001000 [B2] 5555001999
[A3] 5555002000 [B3] 5555002999
[A4] 5555004500 [B4] 5555004999
[A5] 5555005000 [B5] 5555005199
[A6] 5555005200 [B6] 5555005999etc. etc. etc.
-> es decir, un grupo NO esta 'separado' del siguiente p.e. por cada 1000, 500, 50, o n_incrementos
por lo cual, 'intuyo' que podria darse el mismo caso para las 'terminaciones' de cada grupo -?-
2) en otro libro, necesitas 'detectar' si x_dato de cada fila, existen de manera 'segura' en los datos del libro 'fuente'
es decir... si buscas el numero 5555006745 y el -posible- grupo al que pudiera 'pertenecer' solo considera [p.e.]...
[A8] 5555006000 [B8] 5555006650 [el grupo 'existe' PERO el numero mayor del grupo es inferior al buscado]

[A9] 5555008000 [B9] 5555008230 [obviamente que no existe de manera 'exacta']
3) es necesario 'prevenir' [o considerar] un aumento en el numero de hojas de la 'base de datos' [en el libro 'fuente']
-> ademas de 'poder buscar' en todas las posibles hojas que llegue a tener dicho libro... voy bien ???

si no faltan detalles de 'significativa' importancia :)) te paso en seguida [lo que creo son] las posibilidades 'inmediatas'
saludos,
hector.

op1: desarrollar una macro que se encargue de 'depositar' SOLO cada valor 'correspondiente' [si el dato existe en la fuente]
op2: usando formulas con funciones 'normales' [si el libro 'fuente' esta abierto en la sesion, o si pudiera estar 'cerrado']...
op3: usando un complemento de terceros con bastantes funciones utiles que se pueden 'adicionar' a las 'normales' de excel

considerando que el dato debe existir 'exactamente' [entre el inicio y el final de un grupo y en alguna de las hojas del libro fuente]
1) 'dejo' la opcion de macros para mas adelante [si consideras que sea una mejor opcion]
2) si es 'imprescindible' que el libro fuente este cerrado [la opcion 3]...
una [posible] alternativa seria usando un complemento de terceros +/- como sigue:
busca en la pagina de Laurent Longre -> http://xcell05.free.fr/ =>English page<= [Excel add-ins]
[e instala] el complemento MoreFunc.xll [MasFunciones] -> http://xcell05.free.fr/downloads/Morefunc.zip
[opcionalmente, algunos ejemplos en -> http://xcell05.free.fr/downloads/Examples.zip]
podras usar la funcion: Indirect.Ext que permite 'interactuar' con libros cerrados.
-mas otras 40 funciones que 'tendrias que cargar' con ellas- =>todas muy utiles<= 'pero'... NO de 'uso frecuente'
-> otra posible alternativa seria usar macros para 'crear' [efectivamente] formulas vinculando a libros cerrados
3) para la opcion 2... estos son 'mis supuestos' [adapta/modifica/corrige/... donde sea necesario]
[toma nota que se requiere 'dejar' como preparacion una columna por cada hoja donde se requiera buscar en el libro fuente]
-> en la hoja donde tienes los datos que se van a buscar en el libro fuente...
[A2:A_n] los datos [numeros de telefono]
[C1] -> escribes el nombre del libro entre corchetes p.e. -> [libro fuente.xls]
[D1] -> escribes el nombre de la hoja1 [dentro del libro fuente] p.e. -> hoja1 [y contunuas por cada hoja en la fila 1]
[D2] -> una formula: => toma nota que debe ser en una sola linea y mi separador de argumentos es la coma :D
=si(eserror(buscar($a2,indirecto($c$1&d$1&"!a:a"))),"",elegir(1+(indice(indirecto($c$1&d$1&"!b:b"),
coincidir(buscarv($a2,indirecto($c$1&d$1&"!a:a"),1),indirecto($c$1&d$1&"!a:a")))>=$a2),"",d$1))
esta formula la copias en la fila 2 por cada columna que necesites segun hojas tengas para buscar en libro fuente <= OJO

[C2] -> usa la siguiente formula: =$c$1&indice(d$1:f$1,coincidir("*?*",d2:f2,0))
esta formula 'deja' el nombre de la hoja donde existe 'exactamente' el numero que se busca... o nada... o un error [no importa]

[B2] -> usa la siguiente formula:
=elegir(1+eserror(c2),indice(indirecto(c2&"!c:c"),coincidir(buscarv($a2,indirecto(c2&"!a:a"),1),indirecto(c2&"!a:a"))),"no existe")
o la siguiente: =elegir(1+eserror(c2),buscarv($a2,indirecto(c2&"!a:c"),3),"no existe")
esta formula [cualquiera de las dos] toma el valor de error... o la hoja donde existe el dato buacado
-> si hay error... devuelve que [a final de cuentas] 'NO existe' el dato buscado
-> si NO hay error... usa el buscarv [o el indice + coincidir] para rescatar los datos que necesitas :))

[finalmente] copias el grupo de celdas [B2:F2] -suponiendo que estas buscando en 3 hojas -> D1, E1 y F1 <-
al grupo de filas donde necesites 'rescatar' los datos o especificar que el dato 'NO existe' ;)

-> perdon por lo extenso :-(( deja ver si lo puedo 'recortar' :)) [al menos lo que se refiere a las formulas] ;)
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida