Problemas al Actualizar Función Personalizada

20/12/2004 - 15:05 por Bart | Informe spam
Hola grupo, tengo el siguiente problema con una función personalizada:

Cuando creo por primera vez la fórmula toma muestra el valor que es, pero
cuando cambio el valor de las celdas a que hace referencia no actualiza el
valor calculado. El problema no es por configuración de Excel porque si hago
el cálculo directamente, sin utilizar la función que cree si se actualiza.

La función personalizada tiene dos variables, una que es una celda y otra
que es un rango. El problema esta cuando modifico alguno de los valores
contenidos en este último. La verdad no se que hacer.

Este es el contenido de la función en dos versiones y ambas presentan el
mismo problema:

Function PrecioAct(ByVal Precio As Range, ByVal Pos As Integer) As Double
Dim i As Double
Dim Vector As Range
Dim Capital As Double
Dim cell

i = 1
Set Vector = Range(Precio.Offset(0, 1), Precio.Offset(0, Pos))
Capital = Precio.Value

For Each cell In Vector
i = i * (1 + cell)
Next
PrecioAct = Round(Capital * i, 2)
End Function

Function Conver(ByVal Precio As Range, ByVal Pos As Integer) As Double
Dim i As Double
Dim j As Integer
Dim Capital As Double

i = 1
For j = 1 To Pos
i = i * (1 + Precio.Offset(0, j))
Next
Capital = Precio.Value

Conver = Round(Capital * i, 2)
End Function

Gracias y saludos.

B.M

Preguntas similare

Leer las respuestas

#6 KL
20/12/2004 - 20:31 | Informe spam
Daniel,

Pues, mira en cambio yo prefiero no ser tan categorico y creo sinceramente q
las dos opciones son buenas - lo importante es hacer buen uso de ellas. Como
habras podido apreciar, puse un pequeno conmentario sobre el tema de consumo
de recursos del ordenador. Si you tuviera q escribir una UDF para usarla en
un par de celdas y en una hoja con poca intensidad de calculo, no dudaria un
segundo en poner Application.Volatile. Lo contrario para mi seria matar
moscas a canonazos. En cambio si se tratase de un modelo muy cargado, donde
te lo tienes q pensar dos veces antes de iniciar el recalculo, pues ya
recurriria a la opcion q expones.

Un saludo,
KL


"Daniel.M" wrote in message
news:
Hola KL,

Es una posibilidad, y la mas facil. Para _mi_, no es una buena manera de
solvar
este tipo de problema.

Es mejor de aprender como programar las funcionas VBA para incluir las
celdas de
'dependencia' como parametros y usar bien de la recalculacion. Es la sola
manera
de estructurar archivos Excel eficazes.

Si el no lo hace, cada vez que usa una funcion personalizada, va a
necesitar de
anadir Application.Volatile.

Saludos,

Daniel M.

"KL" <lapink2000(at)hotmail.com> wrote in message
news:%
Hola Bart,

Creo q hay al menos una forma mas de conseguir lo q quieres y es q, si la
rapidez del modelo no es un problema (o sea q no hay demasiadas formulas
q
usen mucha memoria y procesador), podrias hacer tu funcion volatil, es
decir
se actualizaria cada vez q se recalculen las formulas. Solo tienes q
anadir
una linea al principio del codigo de tu funcion (digamos despues de
declarar
las variables):

Application.Volatile

Saludos,
KL




"Daniel.M" wrote in message
news:
> Hola,
>
> Necesita usar de todas celdas con argumentos de la funcion. Es la sola
> manera
> que Excel 'sabe' que hay un cambio en su celda (y activar el motor de
> recalculacion).
>
> Por ejemplo:
> =conver2(G2,H2:J2)
> o
> =conver2(G2,DESREF(G2,0,1,1,3))
>
> En el ultimo ejemplo, puede cambiar el 3 por un otra numero.
>
> y este codigo VBA:
>
> Function Conver2(ByVal Precio As Range, ByVal Interest As Range) As
> Double
> Dim i As Double
> Dim C As Range
> Dim Capital As Double
>
> i = 1
> For Each C In Interest
> i = i * (1 + C)
> Next C
> Capital = Precio.Value
>
> Conver2 = Round(Capital * i, 2)
> End Function
>
> Saludos,
>
> Daniel M.
>
> "Bart" wrote in message
> news:
>> Hola grupo, tengo el siguiente problema con una función personalizada:
>>
>> Cuando creo por primera vez la fórmula toma muestra el valor que es,
>> pero
>> cuando cambio el valor de las celdas a que hace referencia no
>> actualiza
>> el
>> valor calculado. El problema no es por configuración de Excel porque
>> si
>> hago
>> el cálculo directamente, sin utilizar la función que cree si se
>> actualiza.
>>
>> La función personalizada tiene dos variables, una que es una celda y
>> otra
>> que es un rango. El problema esta cuando modifico alguno de los
>> valores
>> contenidos en este último. La verdad no se que hacer.
>>
>> Este es el contenido de la función en dos versiones y ambas presentan
>> el
>> mismo problema:
>>
>> Function PrecioAct(ByVal Precio As Range, ByVal Pos As Integer) As
>> Double
>> Dim i As Double
>> Dim Vector As Range
>> Dim Capital As Double
>> Dim cell
>>
>> i = 1
>> Set Vector = Range(Precio.Offset(0, 1), Precio.Offset(0, Pos))
>> Capital = Precio.Value
>>
>> For Each cell In Vector
>> i = i * (1 + cell)
>> Next
>> PrecioAct = Round(Capital * i, 2)
>> End Function
>>
>> Function Conver(ByVal Precio As Range, ByVal Pos As Integer) As Double
>> Dim i As Double
>> Dim j As Integer
>> Dim Capital As Double
>>
>> i = 1
>> For j = 1 To Pos
>> i = i * (1 + Precio.Offset(0, j))
>> Next
>> Capital = Precio.Value
>>
>> Conver = Round(Capital * i, 2)
>> End Function
>>
>> Gracias y saludos.
>>
>> B.M
>
>






Respuesta Responder a este mensaje
#7 Daniel.M
20/12/2004 - 21:09 | Informe spam
KL,

habras podido apreciar, puse un pequeno conmentario sobre el tema de consumo
de recursos del ordenador.



Lei su comentario.
A proposito, tiene que saber que no hije una critica de Ud (y creo que, en
general, es mejor de tener varias opiniones) pero de la idea.

un par de celdas y en una hoja con poca intensidad de calculo, no dudaria un
segundo en poner Application.Volatile.



Es exactamente con que no soy de acuerdo. Para mi, no hay razones (nunca) para
poner un numero (3 en el ejemplo) con segundo parametro de la funcion en lugar
de un rango.

Hay frecuadamente personas que hacen el error de generar un rango _al interior_
de una funcion (para leer despues los valores) en lugar de pasar el rango con un
parametro. Despues, ellos no saben porque la funcion ne se recalcula
automaticamente. A ellos les olvida la manera de calcular de Excel. Eso es un
principio fundamental (celdas dependentes) de este program : pequena hoja/model
o no.

Gracias por sus contribuciones, :-)

Daniel M.
Respuesta Responder a este mensaje
#8 KL
20/12/2004 - 22:01 | Informe spam
Daniel,

A proposito, tiene que saber que no hije una critica de Ud ...



Lo se, y en ningun momento lo he tomado personal.

y creo que, en general, es mejor de tener varias opiniones...



Esta es la idea de la cual soy partidario. Creo q el mero hecho de q tu y yo
tengamos esta "discusion" contribuye mas al aprendizaje q simplemente dar
una opcion y decir: esto es lo q se debe hacer.

A ellos les olvida la manera de calcular de Excel. Eso es un
principio fundamental (celdas dependentes) de este program : pequena
hoja/model
o no.



Por cierto, ya q estamos hablando de esto hay un buen recurso en la web q
explica muy bien el como Excel calcula las formulas. Esto no es para ti, q
seguramente te lo conoces, sino para el q no lo sepa y este leyendo estas
lineas: http://www.decisionmodels.com/calcsecretsd.htm

Un abrazo,
KL


"Daniel.M" wrote in message
news:
KL,

habras podido apreciar, puse un pequeno conmentario sobre el tema de
consumo
de recursos del ordenador.



Lei su comentario.
A proposito, tiene que saber que no hije una critica de Ud (y creo que, en
general, es mejor de tener varias opiniones) pero de la idea.

un par de celdas y en una hoja con poca intensidad de calculo, no dudaria
un
segundo en poner Application.Volatile.



Es exactamente con que no soy de acuerdo. Para mi, no hay razones (nunca)
para
poner un numero (3 en el ejemplo) con segundo parametro de la funcion en
lugar
de un rango.

Hay frecuadamente personas que hacen el error de generar un rango _al
interior_
de una funcion (para leer despues los valores) en lugar de pasar el rango
con un
parametro. Despues, ellos no saben porque la funcion ne se recalcula
automaticamente. A ellos les olvida la manera de calcular de Excel. Eso es
un
principio fundamental (celdas dependentes) de este program : pequena
hoja/model
o no.

Gracias por sus contribuciones, :-)

Daniel M.


Respuesta Responder a este mensaje
#9 Manuel Romero
21/12/2004 - 00:08 | Informe spam
Es exactamente con que no soy de acuerdo. Para mi, no hay razones (nunca)


para
poner un numero (3 en el ejemplo) con segundo parametro de la funcion en


lugar
de un rango.

Hay frecuadamente personas que hacen el error de generar un rango _al


interior_
de una funcion (para leer despues los valores) en lugar de pasar el rango


con un
parametro. Despues, ellos no saben porque la funcion ne se recalcula
automaticamente. A ellos les olvida la manera de calcular de Excel. Eso es


un
principio fundamental (celdas dependentes) de este program : pequena


hoja/model
o no.



Hay una famosa que dice mas o menos asi "La verdad absoluta no existe"

Estoy de acuerdo contigo, es una practica de mala programacion declarar
rangos en una funcion para luego leer sus valores, en lugar de pasarlos como
parametros a la misma. Pero a veces, y conste en el a veces, no hay nada de
malo en usar valores constantes como parametros de funciones, si los mismos
no van a cambiar.
Respuesta Responder a este mensaje
#10 Daniel.M
21/12/2004 - 02:10 | Informe spam
Hola Manuel,

Hay una famosa que dice mas o menos asi "La verdad absoluta no existe"



Usted tiene que saber que la directividad de mis mensages proviene de mis
dificuldades con las subtilidades de vuestra idioma esplendida!

A poposito del puncto central, Usted lo dijo de una manera mas lista: "une
practica de mala programacion", especificamente cuando los valores pueden
_cambiar_ (como Ud lo preciso tambien).

Pero, si una persona quiere usar de Application.Volatile : como ella lo quiere.
:-)
En el contexto del foro aqui, me aparecio importante de subrayar que no son
alternativas iguales para _mi_.

Saludos amables,

Daniel M.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida