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
 

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

Preguntas similares