mejorar mi codigo

02/07/2009 - 19:34 por j_lete | Informe spam
Hola grupo, tengo la siguente funcion que utilizo para actualizar cantidades
a disttintos tipos de interes de forma acumulada.
Las cantidades son datos que tengo e una hoja de calculo y se las paso a la
funcion.
Me gustaria saber como poder hacer esta funcion utilizando arrays, es decir,
un aray para los importes y otro para los porcentajes.

Gracias anticipadas por la ayuda que me puedan prestar.

Function ActualizaImp (imp1, imp2, imp3, imp4, imp5, imp6, imp7, imp8 As
Double) As Double

Dim A As Double, B As Double, C As Double, D As Double, E As Double, F As
Double, G As Double
Dim H As Double

PORC1 = 0.016
PORC2 = 0.027
PORC3 = 0.022
PORC4 = 0.017
PORC5 = 0.012
PORC6 = 0.012
PORC7 = 0.014
PORC8 = 0.021

A = ((((((((imp8 * (1 + PORC8)) * (1 + PORC7)) * (1 + PORC6)) * (1 + PORC5))
* (1 + PORC4)) * (1 + PORC3)) * (1 + PORC2)) * (1 + PORC1))
B = (((((((imp7 * (1 + PORC7)) * (1 + PORC6)) * (1 + PORC5)) * (1 + PORC4))
* (1 + PORC3)) * (1 + PORC2)) * (1 + PORC1))
C = ((((((imp6 * (1 + PORC6)) * (1 + PORC5)) * (1 + PORC4)) * (1 + PORC3)) *
(1 + PORC2)) * (1 + PORC1))
D = (((((imp5 * (1 + PORC5)) * (1 + PORC4)) * (1 + PORC3)) * (1 + PORC2)) *
(1 + PORC1))
E = ((((imp4 * (1 + PORC4)) * (1 + PORC3)) * (1 + PORC2)) * (1 + PORC1))
F = (((imp3 * (1 + PORC3)) * (1 + PORC2)) * (1 + PORC1))
G = (imp2) * 1
H = (imp1) * 1

ActualizaImp = A + B + C + D + E + F + G + H
End Function

Preguntas similare

Leer las respuestas

#26 Alexander Chacin
06/07/2009 - 22:48 | Informe spam
Si no malgastas la balas, por lo menos disparaste varias veces, tal vez por
disparar antes de apuntar y reir demaciado antes de tiempo

Cierro contigo, entiendo que cambias de tema para desviar la atención y así
no responder el fondo de mi planteamiento

Saludos
Alexander Chacin

"KL" escribió en el mensaje de noticias
news:

Veras Alexander,

Lo de pensar nunca ha sido mi fortaleza ;-( . Eso si, tampoco veo
necesidad de malgastar las balas.

Gracias a Dios, estas tu para salvarme, al renegar de tu argumento tan
brillante como oportuno de

"El orden de las multiplicaciones no altera el producto"

y agarrarte a los posibles defectos de la funcion original (yo no he
sido!), lo cual corrobora perfectamente tu acertada afirmacion:

"Por lo que no importa el orden de la multiplicación, entiendo que los
errores de redondeo afectarán, pero no creo que pesen tanto en el
resultado
final"

Para que hacer pruebas si ya sabes que en cualquier caso llevas tu la
razon. Enhorabuena por ese rigor cientifico modelico!

Sigue asi y mucha suerte,
KL
Respuesta Responder a este mensaje
#27 Alexander Chacin
06/07/2009 - 23:04 | Informe spam
Héctor disculpa esa debilidad de mi parte, pero lo hice en honor a KL, que
hacía un buen rato, segun tus propias palabras, no participaba en este foro

Ya creo entender tu punto, lo interesante de todas tus observaciones es que
hasta ahora j_lete no las ha mencionado, tal vez porque está más interesado
en un enfoque distinto al suyo y asume que adaptarse a ese orden que
mencionas sea un pequeño precio por alcanzar lo que plantea en su consulta,
si lees nuevante la consulta de j_lete, encontrarás lo siguiente "Me
gustaria saber como poder hacer esta funcion utilizando arrays, es decir, un
aray para los importes y otro para los porcentajes", dado que los importes
son datos de entrada, podría entenderse que se desea introducirlos a partir
de un rango, no es seguro, pero fue mi propuesta y un rango lleva implícito
un orden establecido por el usuario. Lo interesante es que hasta ahora quien
hizo la consulta no ha dicho que esa suposición sea incorrecta

Tal vez ante mi postura tan radical, tu podrias hacer gala de otra más
flexible y tal vez de esta manera educarme con el ejemplo

Saludos
Alexander Chacin

"Héctor Miguel" escribió en el mensaje de
noticias news:OJF96pn$
hola, Alexander ! (crei que ya habias dado por "zanjado" el tema y que
tu postura es "inamovible")

Buenas tardes KL
Lo que haces mal es pensar, apunta antes de disparar



(aunque ya te ha respondido KL...)
lo unico que hizo KL es invertir el orden de los factores (posibilidad
planteada en mis comentarios)

Como comprenderás la función no adivina, si le introdeces una data, la
considera válida y obtiene un resultado.
Como entenderás, si cambias lo valores, el resultado en general cambiará
tambien.
Invertir el orden de la matriz de datos, es una manera de cambiar esos
valores



esta parte no te la voy a discutir, es parte de tu "postura", aunque
sigues sin (querer) ver diferentes usos/costumbres/...
es cierto que una funcion NO "adivina" (pero el programador SI puede
anticipar/prevenir/corregir/...)

Les recomiendo a los dos, nuevamente que comparen la función original con
mi propuesta
hay un detalle bien curioso que extrañamente se les ha escapado a ambos y
es que si usan lo misma data
( del 1 al 8 y del 8 al 1) tanto en mi propuesta (ActualizaImp2) como en
la funcíón original (ActualizaImp)
se obtienen los mismos resultados en las dos funciones
Imagino Héctor que conociendo esta información, le escribirás a j_lete y
le dirás que su código está mal
porque al invertir los valores el resultado cambia.



aqui... UNO de TUS errores consiste en perder de vista (al menos) DOS de
los puntos diferentes entre TU funcion y la de OP
- TU funcion siempre tomara los datos de un rango en orden descendente
([A1]...[A8])
- la funcion de OP utiliza argumentos INDIVIDUALES, por lo tanto, en la
funcion "original" podrias pasarlos [A1]...[A8] o a la inversa

ademas, OTRO de TUS errores consiste (otra vez) en NO (querer) ver que en
un arreglo de datos (y la diferente "forma" de argumentos)
- TU argumento tomado (rigidamente) con el orden [A1]...[A8] NO distingue
si el usuario pone el "mas reciente" en [A8]

- con los argumentos "pasados" individualmente (obviamente) la funcion de
OP NO VA A FALLAR (los puede pasar de [A8]...[A1])

En todo momento traté de simplificar la función original pero obviamente
sin alterar los resultados que dicha función genera
y en ese sentido "ActualizaImp2" arroja los mismos resultados que
"ActualizaImp" para la misma data de entrada
que creo estaba implícito en la solicitud de j_lete



ve y (si quieres/puedes/...) analiza los puntos anteirores (probablemente
"amplies" la vista hacia otros horizontes)

Agradezco a KL el proporcionar un ejemplo objetivo que puede ser
discutido, en lugar de vagas sospechas.
Espero aclarar el punto, de no ser así, espero nuevos ejemplos objetivos
que muestren los errores
que seguramente, podrá tener mi propuesta



esto seria (siempre y cuando) si TU tienes la disposicion de "mente
abierta" y abandonas posturas "radicales" (o "inamovibles" ?)

saludos,
hector.

Respuesta Responder a este mensaje
#28 KL
07/07/2009 - 00:27 | Informe spam
No hay peor cosa en la vida que la ignorancia beligerante ;-)
Te has dejado en evidencia tu mismo.
Mi mensaje no tenia nada de literatura de la cual podrias deducir un ataque
personal, solo un ejemplo puro con datos contundentes, estrictamente
relacionados con los argumentos de la discusion.
Me imagino, que se te ha atragantado una prueba de tu error o palabreo
irresponsable, por eso tu reaccion agresiva.
Y tienes razon, no participo mucho en este foro ultimamente (aunque si en
muchos otros), pero tampoco por mucho mensaje "taliban" tuyo se aporta a los
foros.

Vete de paseo,
KL


"Alexander Chacin" wrote in message
news:uKvx9Ao$
Si no malgastas la balas, por lo menos disparaste varias veces, tal vez
por disparar antes de apuntar y reir demaciado antes de tiempo

Cierro contigo, entiendo que cambias de tema para desviar la atención y
así no responder el fondo de mi planteamiento

Saludos
Alexander Chacin

"KL" escribió en el mensaje de
noticias news:

Veras Alexander,

Lo de pensar nunca ha sido mi fortaleza ;-( . Eso si, tampoco veo
necesidad de malgastar las balas.

Gracias a Dios, estas tu para salvarme, al renegar de tu argumento tan
brillante como oportuno de

"El orden de las multiplicaciones no altera el producto"

y agarrarte a los posibles defectos de la funcion original (yo no he
sido!), lo cual corrobora perfectamente tu acertada afirmacion:

"Por lo que no importa el orden de la multiplicación, entiendo que los
errores de redondeo afectarán, pero no creo que pesen tanto en el
resultado
final"

Para que hacer pruebas si ya sabes que en cualquier caso llevas tu la
razon. Enhorabuena por ese rigor cientifico modelico!

Sigue asi y mucha suerte,
KL



Respuesta Responder a este mensaje
#29 Héctor Miguel
07/07/2009 - 01:39 | Informe spam
hola, Alexander !

Ya creo entender tu punto, lo interesante de todas tus observaciones es que hasta ahora j_lete no las ha mencionado ...



=> esta parte (creo) le corresponde a OP continuar en la conversacion, aportar nuevos detalles, o darla por "aceptable" (???)

si lees nuevante la consulta de j_lete, encontrarás lo siguiente
"Me gustaria saber como poder hacer esta funcion utilizando arrays, es decir, un aray para los importes y otro para los porcentajes"
dado que los importes son datos de entrada, podria entenderse que se desea introducirlos a partir de un rango
no es seguro, pero fue mi propuesta y un rango lleva implícito un orden establecido por el usuario...



=> (segun yo ?) le sigue correspondiendo a OP proporcionar cualquier detalle que considere conveniente a sus intereses
por lo que respecta a los "arrays" (y hasta donde se), los hay de varios tipos (rangos, matrices constantes, matrices en vba, etc.)
en principio, los rangos son las "arrays" mas socorridas/esperadas/... cuando hablamos de funciones personalizadas (en excel)
aunque no hay que dejar de considerar la posibilidad de que los rangos se provean en columnas y/o en filas (cosa aparte tambien)

Tal vez ante mi postura tan radical, tu podrias hacer gala de otra mas flexible y tal vez de esta manera educarme con el ejemplo



=> no es "gala" ni tampoco trato de "educar" (a nadie), simplemente trato de aportar lo que en la experiencia considero apropiado (?)

hice una propuesta (que considere) mas facil de modificar/adaptar/... para quien se inicia en codigos y vba (la transcribo):

== segundo mensaje de respuesta a OP =si prefieres el uso de una funcion personalizada, (creo que) la siguiente "forma" te resultaria mas facil de entender/modificar
OJO: no contempla prevencion/correccion de errores y asume que siempre pasaras los argumentos en las mismas dimensiones (filas)
ademas, tambien se asume que siempre habra (cuando menos) CUATRO importes/tasas (solo por facilidad de programacion)

Function VFTV(Importes As Range, Tasas As Range) As Double
Dim n As Integer, Fijo As Double, Parcial As Double
Fijo = Application.Sum(Importes.Resize(2))
For n = Importes.Rows.Count To 4 Step -1
Parcial = (Parcial + Importes(n)) * (1 + Tasas(n))
Next
Parcial = (Parcial + Importes(3)) * (1 + Tasas(3)) * (1 + Tasas(2)) * (1 + Tasas(1))
VFTV = Fijo + Parcial
End Function

el nombre (VFTV = ValorFuturoTasaVariable) es "alusivo/acronimo" de su similar en el complemento "herramientas para analialis": VF.PLAN
== =
si el usuario tiene la costumbre de que el dato "mas actual/reciente/..." lo ponga al final del rango (NO en A1 si no en A8 p.e.)
esta propuesta de funcion deberia modificarse +/- a lo siguiente:

Function VFTV(Importes As Range, Tasas As Range) As Double
Dim n As Integer, Fijo As Double, Parcial As Double
Fijo = Application.Sum(Importes.Offset(Importes.Rows.Count - 2).Resize(2))
For n = 1 To Importes.Rows.Count - 3
Parcial = (Parcial + Importes(n)) * (1 + Tasas(n))
Next
With Importes.Rows
Parcial = (Parcial + Importes(.Count - 2)) * (1 + Tasas(.Count - 2)) _
* (1 + Tasas(.Count - 1)) * (1 + Tasas(.Count))
End With
End Function

otra alternativa podria ser "ofrecer" al usuario de opcion de indicar si el ultimo dato es el primero o el ultimo en el rango (?)
solo habria que proveer un argumento adicional (opcional y predeterminado de preferencia) y la funcion "crece" +/- a lo siguiente:

Function VFTV(Importes As Range, Tasas As Range, Optional Inv As Boolean = False) As Double
Dim n As Integer, Fijo As Double, Parcial As Double
If Inv Then GoTo DeAbajoHaciaArriba
Fijo = Application.Sum(Importes.Resize(2))
For n = Importes.Rows.Count To 4 Step -1
Parcial = (Parcial + Importes(n)) * (1 + Tasas(n))
Next
Parcial = (Parcial + Importes(3)) * (1 + Tasas(3)) * (1 + Tasas(2)) * (1 + Tasas(1))
GoTo Fin
DeAbajoHaciaArriba:
Fijo = Application.Sum(Importes.Offset(Importes.Rows.Count - 2).Resize(2))
For n = 1 To Importes.Rows.Count - 3
Parcial = (Parcial + Importes(n)) * (1 + Tasas(n))
Next
With Importes.Rows
Parcial = (Parcial + Importes(.Count - 2)) * (1 + Tasas(.Count - 2)) _
* (1 + Tasas(.Count - 1)) * (1 + Tasas(.Count))
End With
Fin:
VFTV = Fijo + Parcial
End Function

sobra mencionar que "formas/usos/estilos/costumbres/necesidades/..." de programar... hay mas que suficientes (dependiendo de... ???)
razones por las que considero que todo es modificable/acaptable/mejorable/... (segun... ???)

saludos,
hector.
Respuesta Responder a este mensaje
#30 j_lete
07/07/2009 - 20:05 | Informe spam
Buenas Hector:

He probado con la función vf.plan la cual desconocía y funciona como dices.
también he probado la funcion VFTV, y tambien sale bien. Sobre esta última y
cuando tengas un momento, me interesa
me explques un poco como funcionan estas 2 instrucciones, en particular
resize (2) y count to
Fijo = Application.Sum(Importes.Resize(2))
E
For n = Importes.Rows.Count To 4 Step -1

Gracias de nuevo.
Saludos

"Héctor Miguel" escribió:

hola, !

> 1) el importe mas actual es el 1 y el mas antiguo el 8.
> 2) los datos estan en... (rango b7:b15 para el primer registro, siendo b7 el mas actual y b15 el mas antiguo.
> El siguinte registro los valores son c7:c15 y asi sucesivamente).
> ... al orden del algoritmo, lo hice asi del mas complicado al mas sencillo.
> ... al final sumo los valores que son los que aparecen en la celda resultado b16 para el 1 registro c16 segundo y asi...
> 3) los dos valores iniciales no se actualizan, pero su valor si se suma al total.
> 4) conocer... el importe... al... % actualizado de precios de productos de los ultimos 8 a#o... sin actualizar los 2 primeros.
> 5) entre 8 y 16, pero en principio 8
> La 6) no la entiendo muy bien.

partiendo de que el procedimiento del objetivo determina las alternativas de la programacion, habra mas de una forma de algoritmo
(sin olvidar la interaccion con diferentes usuarios que podria ser causa de interpretaciones diferentes del "como" usar una funcion)

incluso, sin recurrir a funciones personalizadas, una (probable) alternativa es el uso de celdas auxiliares y funciones de excel (p.e.)

- si tu rango de valores/importes es b7:b15 (b7 el "imp1") y el rango de tasas es c7:c15 (c7 el "porc1")
[D7] ·
[D8] ¸
[D9] =vf.plan(b9,c$7:c9) (si tu excel es en ingles, cambias la formula a: =fvschedule(... )
esta ultima formula la copias/arrastras hasta [D_n]
y al final del rango (columna D) simplemente "sumas": =suma(d7:d_n)

si prefieres el uso de una funcion personalizada, (creo que) la siguiente "forma" te resultaria mas facil de entender/modificar
OJO: no contempla prevencion/correccion de errores y asume que siempre pasaras los argumentos en las mismas dimensiones (filas)
ademas, tambien se asume que siempre habra (cuando menos) CUATRO importes/tasas (solo por facilidad de programacion)

Function VFTV(Importes As Range, Tasas As Range) As Double
Dim n As Integer, Fijo As Double, Parcial As Double
Fijo = Application.Sum(Importes.Resize(2))
For n = Importes.Rows.Count To 4 Step -1
Parcial = (Parcial + Importes(n)) * (1 + Tasas(n))
Next
Parcial = (Parcial + Importes(3)) * (1 + Tasas(3)) * (1 + Tasas(2)) * (1 + Tasas(1))
VFTV = Fijo + Parcial
End Function

el nombre (VFTV = ValorFuturoTasaVariable) es "alusivo/acronimo" de su similar en el complemento "herramientas para analialis": VF.PLAN

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