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

#6 j_lete
04/07/2009 - 21:53 | Informe spam
Hola Alexander:
Ante todo muchas gracias por tu ayuda, y como más abajo dice por tu tiempo.
Es de agradecer que personas como tú y Héctor, dediquen parte de su tiempo a
compartir sus conocimientos en programación con personas que, como yo,
carecemos de dichos conocimientos. Dicho esto, voy a intentrar entender como
funcioan tu cóigo ya que hay instrucciones que desconozco y no quiero sólo
"copiar" tu código.

Gracias de nuevo por tu interés

"Alexander Chacin" escribió:

Creo que una manera pudiera ser esta

Public Function ActualizaImp2(Cantidades As Variant, Optional Porcentajes As
Variant) As Double

Dim Cant() As Double
Dim Porc() As Double
Dim Factores() As Double
Dim I As Integer
Dim J As Integer
Dim Numero As Integer
Dim Valor As Variant
Dim Temp As Double
Dim Suma As Double

Numero = Cantidades.Count - 1

I = 0
For Each Valor In Cantidades

ReDim Preserve Cant(I)
Cant(I) = CDbl(Valor)
I = I + 1
Next Valor

If Not IsMissing(Porcentajes) Then
I = 0
For Each Valor In Porcentajes
ReDim Preserve Porc(I)
Porc(I) = CDbl(Valor)
I = I + 1
Next Valor

Else
ReDim Porc(I - 1)

If Numero <> 7 Then Suma = 1 / 0

Porc(0) = 0.016
Porc(1) = 0.027
Porc(2) = 0.022
Porc(3) = 0.017
Porc(4) = 0.012
Porc(5) = 0.012
Porc(6) = 0.014
Porc(7) = 0.021

End If
ReDim Factores(2 To Numero)

Temp = 0
Suma = 0
For I = 2 To Numero
Temp = Cant(I)
For J = 0 To I

Temp = Temp * (1 + Porc(J))

Next J
Suma = Suma + Temp
Next I

ActualizaImp2 = Suma + Cant(1) + Cant(0)

End Function


Esta forma te permite manejar cantidades diferentes de ocho, por si lo
necesitas

Si no introduces porcentajes, los valores que indicas son tomados por
defecto

Espero que esto te ayude

Saludos
Alexander Chacin


"j_lete" escribió en el mensaje de
noticias news:
> 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
>


Respuesta Responder a este mensaje
#7 Héctor Miguel
05/07/2009 - 00:18 | Informe spam
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
#8 Héctor Miguel
05/07/2009 - 00:36 | Informe spam
hola, Alexander !

(la intencion NO ha sido "criticar de mala fe", si no senalar "areas de mejora", ok ?)

No entiendo tu comentario acerca del "orden", como tu lo llamas, para procesar los datos
la función original genera un valor de salida, no una matriz
El orden de las multiplicaciones no altera el producto...



toma en cuenta que la salida es una acumulacion valores con multiplicacion de diferente numero de elementos
entonces, no es lo mismo si en la hoja de calculo el "primer" valor en el rango es el "imp1" o el "imp8" (y de ahi para abajo)

Tampoco entiendo que impacto tendria si se necesitan más de 8 argumentos, si miras bien el código, está considerado ...



en esta parte tienes razon, es solo una prueba que me hacia falta de realizar (perdon) :))

de cualquier manera si encuentras algo que no funcione, solo tienes que mecionarlo y lo corrijo
pero mencionar dudas que no se concretan en nada, no me parece apropiado



(creo que) en esta parte hace falta conocer los "usos y costumbres" de la poblacion a la que el programador dirige su funcion (no ?)

En lo que respecta al error creado "a mano", lo hice por facilidad
estoy un poco escaso de tiempo para hacer una rutina de simulación de errores formal



como comentaba al principio, solo trate de "senalar areas de mejora", por lo que tambien puse las (posibles) correcciones (?)

Para finalizar escribí para hacer un aporte, no tengo la costumbre de corregir los aportes de otros integrantes del grupo
creo que si alguien se tomó la molestia de responder, de entregar parte de su tiempo para ayudar a otra persona
merece toda mi atención y aunque no me diga nada nuevo igual lo leo...



ni duda cabe... todavia sigo aprendiendo de los aportes que se hacen en el foro (que son de agradecer en definitiva)

Lo que si es importante es que la persona que hizo la consulta, leerá las respuestas
y seguramente dará la información adicional que solicitas o dirá que debe ser modificado en mi propuesta.
Si no es así espero que mi aporte pueda ayuda a alguien



(totalmente de acuerdo) :))

saludos,
hector.
Respuesta Responder a este mensaje
#9 Alexander Chacin
05/07/2009 - 00:48 | Informe spam
No te preocupes, para eso estamos

Espero tus dudas, si las hay

Saludos
Alexander Chacin

"j_lete" escribió en el mensaje de
noticias news:
Hola Alexander:
Ante todo muchas gracias por tu ayuda, y como más abajo dice por tu
tiempo.
Es de agradecer que personas como tú y Héctor, dediquen parte de su tiempo
a
compartir sus conocimientos en programación con personas que, como yo,
carecemos de dichos conocimientos. Dicho esto, voy a intentrar entender
como
funcioan tu cóigo ya que hay instrucciones que desconozco y no quiero sólo
"copiar" tu código.

Gracias de nuevo por tu interés

"Alexander Chacin" escribió:

Creo que una manera pudiera ser esta

Public Function ActualizaImp2(Cantidades As Variant, Optional Porcentajes
As
Variant) As Double

Dim Cant() As Double
Dim Porc() As Double
Dim Factores() As Double
Dim I As Integer
Dim J As Integer
Dim Numero As Integer
Dim Valor As Variant
Dim Temp As Double
Dim Suma As Double

Numero = Cantidades.Count - 1

I = 0
For Each Valor In Cantidades

ReDim Preserve Cant(I)
Cant(I) = CDbl(Valor)
I = I + 1
Next Valor

If Not IsMissing(Porcentajes) Then
I = 0
For Each Valor In Porcentajes
ReDim Preserve Porc(I)
Porc(I) = CDbl(Valor)
I = I + 1
Next Valor

Else
ReDim Porc(I - 1)

If Numero <> 7 Then Suma = 1 / 0

Porc(0) = 0.016
Porc(1) = 0.027
Porc(2) = 0.022
Porc(3) = 0.017
Porc(4) = 0.012
Porc(5) = 0.012
Porc(6) = 0.014
Porc(7) = 0.021

End If
ReDim Factores(2 To Numero)

Temp = 0
Suma = 0
For I = 2 To Numero
Temp = Cant(I)
For J = 0 To I

Temp = Temp * (1 + Porc(J))

Next J
Suma = Suma + Temp
Next I

ActualizaImp2 = Suma + Cant(1) + Cant(0)

End Function


Esta forma te permite manejar cantidades diferentes de ocho, por si lo
necesitas

Si no introduces porcentajes, los valores que indicas son tomados por
defecto

Espero que esto te ayude

Saludos
Alexander Chacin


"j_lete" escribió en el mensaje de
noticias news:
> 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
>


Respuesta Responder a este mensaje
#10 Alexander Chacin
05/07/2009 - 01:21 | Informe spam
Héctor solo me gustaría que me ampliaras un poco lo del orden de la
multiplicación, porque sigo sin entenderte

Cuandi invierto el orden de multiplicación, es decir cambio el orden inicial
de

A = ((((((((imp8 * (1 + PORC8)) * (1 + PORC7)) * (1 + PORC6)) * (1 + PORC5))
* (1 + PORC4)) * (1 + PORC3)) * (1 + PORC2)) * (1 + PORC1))

a

A = ((((((((imp8 * (1 + PORC1)) * (1 + PORC2)) * (1 + PORC3)) * (1 + PORC4))
* (1 + PORC5)) * (1 + PORC6)) * (1 + PORC7)) * (1 + PORC8))

Hago uso de una propiedad de la multiplicación ampliamente conocida,
propiedad conmutativa, la cual dice que:

imp8 * (1 + PORC8) * (1 + PORC7) * (1 + PORC6)* (1 + PORC5)* (1 + PORC4) *
(1 + PORC3) * (1 + PORC2) * (1 + PORC1)


imp8 * (1 + PORC1) * (1 + PORC2) * (1 + PORC3) * (1 + PORC4) * (1 + PORC5) *
(1 + PORC6) * (1 + PORC7) * (1 + PORC8)

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, en todo caso me gustaría saber cual es la razón para no hacer lo que
en principio parece matemáticamente posible

Estoy de acuerdo contigo, en que siempre es deseable tener la mayor
información posible, pero no es impresindible, entiendo que estos foros
están pensados para orientar y compartir la imformación, que cada
participante toma en función de su experiencia y conocimientos. Una amplia
información seria necesaria si la idea fuera resolver los problemas de
trabajo de quienes consultan y piensop que no es la idea. Mi intensión fue
la de mostrar mi propuesta de solución a inquietudes puntuales como toma de
datos y simplificación de algunas operaciones, si cai en la tentación de
presentar una función como me "imaginaba" que podria ser la original, pero
como ya se dijo no había información suficiente y tuve que probar el código
que hice para ilustrar las posibles soluciones, una vez terminado, pues lo
presenté, pensando que si algo no resultara útil por inapropiado sería
puesto a un lado y en su lugar seria solicitado, esta vez suministrando más
información, el código o procedimiento necesario, ya que en todo momento fue
un papel de trabajo

Saludos
Alexander Chacin


"Héctor Miguel" escribió en el mensaje de
noticias news:%23sFmQfP$
hola, Alexander !

(la intencion NO ha sido "criticar de mala fe", si no senalar "areas de
mejora", ok ?)

No entiendo tu comentario acerca del "orden", como tu lo llamas, para
procesar los datos
la función original genera un valor de salida, no una matriz
El orden de las multiplicaciones no altera el producto...



toma en cuenta que la salida es una acumulacion valores con multiplicacion
de diferente numero de elementos
entonces, no es lo mismo si en la hoja de calculo el "primer" valor en el
rango es el "imp1" o el "imp8" (y de ahi para abajo)

Tampoco entiendo que impacto tendria si se necesitan más de 8 argumentos,
si miras bien el código, está considerado ...



en esta parte tienes razon, es solo una prueba que me hacia falta de
realizar (perdon) :))

de cualquier manera si encuentras algo que no funcione, solo tienes que
mecionarlo y lo corrijo
pero mencionar dudas que no se concretan en nada, no me parece apropiado



(creo que) en esta parte hace falta conocer los "usos y costumbres" de la
poblacion a la que el programador dirige su funcion (no ?)

En lo que respecta al error creado "a mano", lo hice por facilidad
estoy un poco escaso de tiempo para hacer una rutina de simulación de
errores formal



como comentaba al principio, solo trate de "senalar areas de mejora", por
lo que tambien puse las (posibles) correcciones (?)

Para finalizar escribí para hacer un aporte, no tengo la costumbre de
corregir los aportes de otros integrantes del grupo
creo que si alguien se tomó la molestia de responder, de entregar parte
de su tiempo para ayudar a otra persona
merece toda mi atención y aunque no me diga nada nuevo igual lo leo...



ni duda cabe... todavia sigo aprendiendo de los aportes que se hacen en el
foro (que son de agradecer en definitiva)

Lo que si es importante es que la persona que hizo la consulta, leerá las
respuestas
y seguramente dará la información adicional que solicitas o dirá que debe
ser modificado en mi propuesta.
Si no es así espero que mi aporte pueda ayuda a alguien



(totalmente de acuerdo) :))

saludos,
hector.

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