Ayuda con una funcion personalizada

19/08/2007 - 05:03 por goremax | Informe spam
hola

estoy intendando crear una funcion personalizada a partir de las que
trae el excel, en cuestion seria lo siguiente

=si(esnod(buscarv(A1;A1:B3;2;falso));0;buscarv(A1;A1:B3;2;falso))

intente buscando lo que me da la grabadora de macros pero no me
funciona, espero su ayuda

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
19/08/2007 - 06:33 | Informe spam
hola, 'anonimo/a' !

estoy intendando crear una funcion personalizada a partir de las que trae el excel, en cuestion seria lo siguiente
=si(esnod(buscarv(A1;A1:B3;2;falso));0;buscarv(A1;A1:B3;2;falso))
intente buscando lo que me da la grabadora de macros pero no me funciona, espero su ayuda



1) [en principio] resultan mas *agiles* las funciones nativas del excel, que la *necesidad* de desarrollar *similares propias*
[p.e.] yo usaria la siguiente en sustitucion de la que expones:
=si(contar.si(a1:a32;a1);buscarv(a1;a1:b32;2;falso);0)
OJO: es solo a manera de ejemplo, ya que existen *discrepancias* en la forma utilizada en tu exposicion :D
-> si el rango de busqueda es A1:B32, y el valor que se busca esta en 'A1'...
a) SIEMPRE lo vas a encontrar
b) cual es la necesidad de utilizar el cuarto argumento en 'falso' ???

2) toma en cuenta que los argumentos de la funcion *nativa* [buscarv]...
a) NO TIENEN POR QUE ser siempre un rango... podrian ser [p.e.] valores constantes, matrices constantes, etc.
b) desarrollar una funcion *propia* que *actue igual* que la funcion nativa... [necesitaria de algoritmos mas... *sofisticados*]
[solo por mencionar algunos de los imponderables para *sustituir* funciones nativas por funciones propias] :-((

3) el siguiente ejemplo, ASUME que siempre utilizaras rangos, *llamando* a las funciones nativas para desarrollar una *propia*
aprovechando los mismos nombres de los argumentos de la funcion nativa [solo para no descontrolar al usuario] :D
[ademas] supone que siempre necesitaras *depositar* un 0 [cero] si no existe el dato buscado [podria no ser siempre asi] -???-
[por cierto... estoy usando la formula de la propuesta *alternativa*, la del *contar.si*]
obviamente, podrias descartar la propuesta y usar tu formulacion *original* [entre otras variantes y alternativas] :))

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

' en un modulo de codigo normal/estandar/general/... '
Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application.WorksheetFunction
Buscar_Si = .CountIf(matriz_buscar_en.Resize(, 1), valor_buscado)
If Buscar_Si Then Buscar_Si = _
.VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
End With
End Function

op2: la estructuracion *logica* del algoritmo anterior pudiera ser mas *leible* si la modificas a:
Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application.WorksheetFunction
If .CountIf(matriz_buscar_en.Resize(, 1), valor_buscado) Then
Buscar_Si = .VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
Else
Buscar_Si = 0 ' <= aqui puedes cambiar el 0 por otro/s caracteres/opciones/valores/... :) '
End If
End With
End Function

op3: para utilizar la *formulacion* de tu intencion original...

a) debes cambiar el primer With
de: -> With Application.WorksheetFunction
a: -> With Application

b) el algoritmo completo de la funcion [con tu formulacion original] queda de la siguiente forma:

Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application
If .IsNA(.VLookup(valor_buscado, matriz_buscar_en, 1, ordenado)) Then
Buscar_Si = "No existe el valor buscado !!!"
Else
Buscar_Si = .VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
End If
End With
End Function
Respuesta Responder a este mensaje
#2 goremax
20/08/2007 - 02:26 | Informe spam
On 19 ago, 00:33, "Héctor Miguel"
wrote:
hola, 'anonimo/a' !

> estoy intendando crear una funcion personalizada a partir de las que trae el excel, en cuestion seria lo siguiente
> =si(esnod(buscarv(A1;A1:B3;2;falso));0;buscarv(A1;A1:B3;2;falso))
> intente buscando lo que me da la grabadora de macros pero no me funciona, espero su ayuda

1) [en principio] resultan mas *agiles* las funciones nativas del excel, que la *necesidad* de desarrollar *similares propias*
[p.e.] yo usaria la siguiente en sustitucion de la que expones:
=si(contar.si(a1:a32;a1);buscarv(a1;a1:b32;2;falso);0)
OJO: es solo a manera de ejemplo, ya que existen *discrepancias* en la forma utilizada en tu exposicion :D
-> si el rango de busqueda es A1:B32, y el valor que se busca esta en 'A1'...
a) SIEMPRE lo vas a encontrar
b) cual es la necesidad de utilizar el cuarto argumento en 'falso' ???

2) toma en cuenta que los argumentos de la funcion *nativa* [buscarv]...
a) NO TIENEN POR QUE ser siempre un rango... podrian ser [p.e.] valores constantes, matrices constantes, etc.
b) desarrollar una funcion *propia* que *actue igual* que la funcion nativa... [necesitaria de algoritmos mas... *sofisticados*]
[solo por mencionar algunos de los imponderables para *sustituir* funciones nativas por funciones propias] :-((

3) el siguiente ejemplo, ASUME que siempre utilizaras rangos, *llamando* a las funciones nativas para desarrollar una *propia*
aprovechando los mismos nombres de los argumentos de la funcion nativa [solo para no descontrolar al usuario] :D
[ademas] supone que siempre necesitaras *depositar* un 0 [cero] si no existe el dato buscado [podria no ser siempre asi] -???-
[por cierto... estoy usando la formula de la propuesta *alternativa*, la del *contar.si*]
obviamente, podrias descartar la propuesta y usar tu formulacion *original* [entre otras variantes y alternativas] :))

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

' en un modulo de codigo normal/estandar/general/... '
Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application.WorksheetFunction
Buscar_Si = .CountIf(matriz_buscar_en.Resize(, 1), valor_buscado)
If Buscar_Si Then Buscar_Si = _
.VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
End With
End Function

op2: la estructuracion *logica* del algoritmo anterior pudiera ser mas *leible* si la modificas a:
Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application.WorksheetFunction
If .CountIf(matriz_buscar_en.Resize(, 1), valor_buscado) Then
Buscar_Si = .VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
Else
Buscar_Si = 0 ' <= aqui puedes cambiar el 0 por otro/s caracteres/opciones/valores/... :) '
End If
End With
End Function

op3: para utilizar la *formulacion* de tu intencion original...

a) debes cambiar el primer With
de: -> With Application.WorksheetFunction
a: -> With Application

b) el algoritmo completo de la funcion [con tu formulacion original] queda de la siguiente forma:

Function Buscar_Si(valor_buscado, matriz_buscar_en, _
indicador_columnas As Integer, Optional ordenado As Boolean = True)
With Application
If .IsNA(.VLookup(valor_buscado, matriz_buscar_en, 1, ordenado)) Then
Buscar_Si = "No existe el valor buscado !!!"
Else
Buscar_Si = .VLookup(valor_buscado, matriz_buscar_en, indicador_columnas, ordenado)
End If
End With
End Function



Gracias Hectoe funciono muy bien

queria hacer esta funcion porque era muy molestoso estar escribiendo
esa larga formula cada vez que necesitaba hacer esa busqueda, solo por
comodidad,

solo tengo una duda
en que se diferencias las siguientres declaraciones

With Application.WorksheetFunction
With Application

gracias y Saludos
Respuesta Responder a este mensaje
#3 Héctor Miguel
20/08/2007 - 04:10 | Informe spam
hola, (...) ?

queria hacer esta funcion porque era muy molestoso estar escribiendo esa larga formula
cada vez que necesitaba hacer esa busqueda solo por comodidad,
solo tengo una duda
en que se diferencias las siguientres declaraciones

With Application.WorksheetFunction
With Application



la diferencia [basicamente] es que el metodo WorksheetFunction no devuelve valores de error *manejables* para vba :-(
y considerando que en tu formulacion original es necesario descartar la busqueda cuando devolveria #n/a

1) te proponia el cambio de una cuenta [contar.si] y en caso de existir... hacer la busqueda [buscarv] ;)

2) eliminar el metodo worksheetfunction y correr dos veces la funcion buscarv [descartando algun error en la primera] ;)

saludos,
hector.
Respuesta Responder a este mensaje
#4 goremax
21/08/2007 - 03:49 | Informe spam
On 19 ago, 22:10, "Héctor Miguel"
wrote:
hola, (...) ?

> queria hacer esta funcion porque era muy molestoso estar escribiendo esa larga formula
> cada vez que necesitaba hacer esa busqueda solo por comodidad,
> solo tengo una duda
> en que se diferencias las siguientres declaraciones

> With Application.WorksheetFunction
> With Application

la diferencia [basicamente] es que el metodo WorksheetFunction no devuelve valores de error *manejables* para vba :-(
y considerando que en tu formulacion original es necesario descartar la busqueda cuando devolveria #n/a

1) te proponia el cambio de una cuenta [contar.si] y en caso de existir... hacer la busqueda [buscarv] ;)

2) eliminar el metodo worksheetfunction y correr dos veces la funcion buscarv [descartando algun error en la primera] ;)

saludos,
hector.



em quedo muy claro, ahora me saltan otras dudas, ?como se puede
determinar los tipos de argumentos que tiene una funcion original de
excel? por ejemplo buscarv(valor_buscado, rango_a_buscar, columna,
ordenado)

como determino el tipo de
valor_buscado
rango_a_buscar
columna
ordenado

y el tipo de dato que devuelve la funcion buscarv() as...???

gracias por la ayuda hector
Respuesta Responder a este mensaje
#5 Héctor Miguel
21/08/2007 - 04:56 | Informe spam
hola, (...) ???

__ 1 __
ahora me saltan otras dudas



1) y eso que todavia no abrimos *la caja de pandora* :))

por lo que sigue de tu consulta [creo que]...
-> tu primer *fuente de informacion* [como manual de la aplicacion]...
ES [o... *debiera ser* ?] -> la propia ayuda en linea: -> {F1} ;)
[claro, ademas de cualquier numero de otras fuentes alternas como: web, foros, libros, etc.]

__ 2 __
como se puede determinar los tipos de argumentos que tiene una funcion original de excel?
por ejemplo buscarv(valor_buscado, rango_a_buscar, columna, ordenado)



2) aparte de consultar las funciones en la ayuda en linea {F1} de -casi ?- todas las aplicaciones...
[p.e.] puedes averiguar *los nombres* de sus argumentos con el siguiente procedimiento:
a) introduces [en una celda] el signo igual, el nombre de la funcion, y SOLO el parentesis de apertura
b) obtienes [los nombres de] los argumentos pulsando la combinacion: ctrl+shift+a

__ 3 __
como determino el tipo de
valor_buscado
rango_a_buscar
columna
ordenado
y el tipo de dato que devuelve la funcion buscarv() as...???



3) [nuevamente] consultando la ayuda en linea [para cada funcion en lo particular]...
a) obtienes el tipo de datos que *devuelve* la funcion consultada
b) obtienes que tipo de datos *toman/requieren/usan/...* cada uno de sus argumentos

lo anterior te servira [cuando definas funciones personalizadas] para asignar *apropiadamente* el tipo de datos
[p.e.] si no se especifica el tipo de datos [apropiado/necesario/requerido/...] se asume que es de tipo *Variant* [por omision]
[tanto a los argumentos como a la funcion] por lo que podrias caer en un *desperdicio* de recursos [memoria, etc.]

[como te decia]... todavia no abrimos *la caja de pandora* [variables, matrices, constantes, etc.]... pero...
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida