Macro: Transformar una matriz en un rango

03/03/2008 - 21:19 por JesusB | Informe spam
Hola a todos,

En un procedimiento (sub) tengo una matriz y quiero llamar a una funcion
(function) que recoge el argumento como rango, y logicamente me da error de
compilacion (el tipo de argumento ByRef no coincide). Me gustaria poder
transformar mi matriz en un rango para poder meterla en la funcion.

Es posible?

Muchas gracias!

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
04/03/2008 - 00:16 | Informe spam
hola, Jesus !

En un procedimiento (sub) tengo una matriz y quiero llamar a una funcion (function) que recoge el argumento como rango
y logicamente me da error de compilacion (el tipo de argumento ByRef no coincide).
Me gustaria poder transformar mi matriz en un rango para poder meterla en la funcion. Es posible?



si transcribes ambos procedimientos (el sub y el function) y la forma en que usas uno y otro...
tendrias mas probabilidades de que alguna propuesta se acercara a "la realidad" :))

saludos,
hector.
Respuesta Responder a este mensaje
#2 JesusB
06/03/2008 - 11:46 | Informe spam
Hola Hector!!
si transcribes ambos procedimientos (el sub y el function) y la forma en que usas uno y otro...
tendrias mas probabilidades de que alguna propuesta se acercara a "la realidad" :))



aqui te mando el codigo con comentarios explicando su funcionamiento, ojala
alguien sepa como hacer lo que necesito, muchas gracias!!

Sub Tir2()
'Esto es un programa para calucular la tir de un prestamo

Dim Year As Integer
Dim Paym As Double
Dim Flow()
Dim n As Integer
Dim i As Integer
Dim Cons_var
Dim x As Integer

'Primero adquiero todo el input del usuario

Year = InputBox("Introduzca el periodo de su prestamo", "PASO 1 PARA
CALCULAR LA TIR")
ReDim Flow(Year) 'Aqui redimensionamos la matriz una vez que ya sabemos los
periodos
Cons_var = MsgBox("¿Las mensualidades son constantes?", vbYesNo)

'Cargo mi matriz con todos los montos en cada periodo

Flow(0) = -Abs(InputBox("Introduzca la inversion inicial de su prestamo: ",
"PASO 2 PARA CALCULAR LA TIR"))
If Cons_var = vbNo Then
For i = 1 To Year
Flow(i) = InputBox("Introduzca el flujo en el año ", i)
Next i
Else
Paym = InputBox("Introduzca la mensualidad de su prestamo : ", "PASO 4
PARA CALCULAR LA TIR")
For i = 1 To Year
Flow(i) = Paym
Next i
End If

' mi problema es aqui cuando llamo a la funcion TIR que utiliza un rango y
yo necesito meter la data de la matriz Flow()

MsgBox ("La TIR es " & TIR(Flow()))

End Sub




Function MiTIR(FC As Range) As Double
'Esta funcion calcula la TIR llamando a la funcion VAN de abajo, ambas
utlizan un argumento en rango

Dim a As Double
Dim b As Double
Dim m As Double

a = 0
b = 1
m = (a + b) / 2


Do While Abs(VAN(m, FC)) > 0.00001

If VAN(m, FC) < 0 Then

b = m
Else
a = m
End If

m = (a + b) / 2

Loop
TIR = m
End Function

Function VAN(k As Double, FC As Range)

'Esta es la funcion VAN necesaria para calcular la TIR de arriba

Dim S As Double
Dim i
For i = 0 To FC.Count
S = S + FC(i, 1) / (1 + k) ^ i
Next i

VAN = S
End Function
Respuesta Responder a este mensaje
#3 Héctor Miguel
06/03/2008 - 23:27 | Informe spam
hola, Jesus !

si transcribes ambos procedimientos (el sub y el function) y la forma en que usas uno y otro...
tendrias mas probabilidades de que alguna propuesta se acercara a "la realidad" :))



aqui te mando el codigo con comentarios explicando su funcionamiento, ojala alguien sepa como hacer lo que necesito, muchas gracias!!



1) el codigo que expones es (practicamente) "inutilizable" y por mas de dos "razones" (p.e.)
- llamas a la funcion TIR pero la has nombrado como MiTIR
- indicas que deben tomarse rangos como argumentos y ya sabemos que necesitas matrices
- si NO podran ser rangos (efectivamente) hay dos o tres "detalles" que dejaran de funcionar en los procedimientos :-((

2) podrias exponer dos o tres ejemplos de los datos que proporcionarias en los Inputboxes y los resultados esperados ?

saludos,
hector.

__ el codigo expuesto __
Sub Tir2()
'Esto es un programa para calucular la tir de un prestamo
Dim Year As Integer
Dim Paym As Double
Dim Flow()
Dim n As Integer
Dim i As Integer
Dim Cons_var
Dim x As Integer
'Primero adquiero todo el input del usuario
Year = InputBox("Introduzca el periodo de su prestamo", "PASO 1 PARA CALCULAR LA TIR")
ReDim Flow(Year) 'Aqui redimensionamos la matriz una vez que ya sabemos los periodos
Cons_var = MsgBox("Las mensualidades son constantes?", vbYesNo)
'Cargo mi matriz con todos los montos en cada periodo
Flow(0) = -Abs(InputBox("Introduzca la inversion inicial de su prestamo: ", "PASO 2 PARA CALCULAR LA TIR"))
If Cons_var = vbNo Then
For i = 1 To Year
Flow(i) = InputBox("Introduzca el flujo en el año ", i)
Next i
Else
Paym = InputBox("Introduzca la mensualidad de su prestamo : ", "PASO 4 PARA CALCULAR LA TIR")
For i = 1 To Year
Flow(i) = Paym
Next i
End If
' mi problema es aqui cuando llamo a la funcion TIR que utiliza un rango y yo necesito meter la data de la matriz Flow()
MsgBox ("La TIR es " & TIR(Flow()))
End Sub

Function MiTIR(FC As Range) As Double
'Esta funcion calcula la TIR llamando a la funcion VAN de abajo, ambas utlizan un argumento en rango
Dim a As Double
Dim b As Double
Dim m As Double
a = 0
b = 1
m = (a + b) / 2
Do While Abs(VAN(m, FC)) > 0.00001
If VAN(m, FC) < 0 Then
b = m
Else
a = m
End If
m = (a + b) / 2
Loop
TIR = m
End Function

Function VAN(k As Double, FC As Range)
'Esta es la funcion VAN necesaria para calcular la TIR de arriba
Dim S As Double
Dim i
For i = 0 To FC.Count
S = S + FC(i, 1) / (1 + k) ^ i
Next i
VAN = S
End Function
Respuesta Responder a este mensaje
#4 JesusB
08/03/2008 - 17:28 | Informe spam
hola Hector!

Muchas gracias por tu apoyo.

En primer lugar, siento lo de la incoherencia en los nombres, en realidad lo
cambie abajo porque me di cuenta que TIR era un nombre reservado y se me
olvido cambiarlo arriba. Las dos deberian ser MiTir.

Aqui te mando 2 posibles inputs:

1)
1. 4 años
2. Inversion inicial: -4000
3. Flujo año 1: 1400
4. Flujo año 2: 1300
5. Flujo año 3: 1200
6. Flujo año 4: 1100

El resultado deberia salir en un InputBox como "La Tir es 10%"

2)
1. 7 años
2. Inversion inicial: -8000
3. Flujo año 1: 4000
4. Flujo año 2: 3000
5. Flujo año 3: 1500
6. Flujo año 4: 500
7. Flujo año 5: 250
8. Flujo año 6: 125
9. Flujo año 7: 75

El resultado deberia salir en un InputBox como "La Tir es 8,89%"

Muchas gracias de nuevo.

saludos,
jesus

"Héctor Miguel" escribió:

hola, Jesus !

>> si transcribes ambos procedimientos (el sub y el function) y la forma en que usas uno y otro...
>> tendrias mas probabilidades de que alguna propuesta se acercara a "la realidad" :))
>
> aqui te mando el codigo con comentarios explicando su funcionamiento, ojala alguien sepa como hacer lo que necesito, muchas gracias!!

1) el codigo que expones es (practicamente) "inutilizable" y por mas de dos "razones" (p.e.)
- llamas a la funcion TIR pero la has nombrado como MiTIR
- indicas que deben tomarse rangos como argumentos y ya sabemos que necesitas matrices
- si NO podran ser rangos (efectivamente) hay dos o tres "detalles" que dejaran de funcionar en los procedimientos :-((

2) podrias exponer dos o tres ejemplos de los datos que proporcionarias en los Inputboxes y los resultados esperados ?

saludos,
hector.

__ el codigo expuesto __
> Sub Tir2()
> 'Esto es un programa para calucular la tir de un prestamo
> Dim Year As Integer
> Dim Paym As Double
> Dim Flow()
> Dim n As Integer
> Dim i As Integer
> Dim Cons_var
> Dim x As Integer
> 'Primero adquiero todo el input del usuario
> Year = InputBox("Introduzca el periodo de su prestamo", "PASO 1 PARA CALCULAR LA TIR")
> ReDim Flow(Year) 'Aqui redimensionamos la matriz una vez que ya sabemos los periodos
> Cons_var = MsgBox("Las mensualidades son constantes?", vbYesNo)
> 'Cargo mi matriz con todos los montos en cada periodo
> Flow(0) = -Abs(InputBox("Introduzca la inversion inicial de su prestamo: ", "PASO 2 PARA CALCULAR LA TIR"))
> If Cons_var = vbNo Then
> For i = 1 To Year
> Flow(i) = InputBox("Introduzca el flujo en el año ", i)
> Next i
> Else
> Paym = InputBox("Introduzca la mensualidad de su prestamo : ", "PASO 4 PARA CALCULAR LA TIR")
> For i = 1 To Year
> Flow(i) = Paym
> Next i
> End If
> ' mi problema es aqui cuando llamo a la funcion TIR que utiliza un rango y yo necesito meter la data de la matriz Flow()
> MsgBox ("La TIR es " & TIR(Flow()))
> End Sub
>
> Function MiTIR(FC As Range) As Double
> 'Esta funcion calcula la TIR llamando a la funcion VAN de abajo, ambas utlizan un argumento en rango
> Dim a As Double
> Dim b As Double
> Dim m As Double
> a = 0
> b = 1
> m = (a + b) / 2
> Do While Abs(VAN(m, FC)) > 0.00001
> If VAN(m, FC) < 0 Then
> b = m
> Else
> a = m
> End If
> m = (a + b) / 2
> Loop
> TIR = m
> End Function
>
> Function VAN(k As Double, FC As Range)
> 'Esta es la funcion VAN necesaria para calcular la TIR de arriba
> Dim S As Double
> Dim i
> For i = 0 To FC.Count
> S = S + FC(i, 1) / (1 + k) ^ i
> Next i
> VAN = S
> End Function



Respuesta Responder a este mensaje
#5 JesusB
08/03/2008 - 17:31 | Informe spam
en realidad las inversiones no hay que ponerlas en negativo dado que ya las
conbierto en el programa.

"JesusB" escribió:

hola Hector!

Muchas gracias por tu apoyo.

En primer lugar, siento lo de la incoherencia en los nombres, en realidad lo
cambie abajo porque me di cuenta que TIR era un nombre reservado y se me
olvido cambiarlo arriba. Las dos deberian ser MiTir.

Aqui te mando 2 posibles inputs:

1)
1. 4 años
2. Inversion inicial: -4000
3. Flujo año 1: 1400
4. Flujo año 2: 1300
5. Flujo año 3: 1200
6. Flujo año 4: 1100

El resultado deberia salir en un InputBox como "La Tir es 10%"

2)
1. 7 años
2. Inversion inicial: -8000
3. Flujo año 1: 4000
4. Flujo año 2: 3000
5. Flujo año 3: 1500
6. Flujo año 4: 500
7. Flujo año 5: 250
8. Flujo año 6: 125
9. Flujo año 7: 75

El resultado deberia salir en un InputBox como "La Tir es 8,89%"

Muchas gracias de nuevo.

saludos,
jesus

"Héctor Miguel" escribió:

> hola, Jesus !
>
> >> si transcribes ambos procedimientos (el sub y el function) y la forma en que usas uno y otro...
> >> tendrias mas probabilidades de que alguna propuesta se acercara a "la realidad" :))
> >
> > aqui te mando el codigo con comentarios explicando su funcionamiento, ojala alguien sepa como hacer lo que necesito, muchas gracias!!
>
> 1) el codigo que expones es (practicamente) "inutilizable" y por mas de dos "razones" (p.e.)
> - llamas a la funcion TIR pero la has nombrado como MiTIR
> - indicas que deben tomarse rangos como argumentos y ya sabemos que necesitas matrices
> - si NO podran ser rangos (efectivamente) hay dos o tres "detalles" que dejaran de funcionar en los procedimientos :-((
>
> 2) podrias exponer dos o tres ejemplos de los datos que proporcionarias en los Inputboxes y los resultados esperados ?
>
> saludos,
> hector.
>
> __ el codigo expuesto __
> > Sub Tir2()
> > 'Esto es un programa para calucular la tir de un prestamo
> > Dim Year As Integer
> > Dim Paym As Double
> > Dim Flow()
> > Dim n As Integer
> > Dim i As Integer
> > Dim Cons_var
> > Dim x As Integer
> > 'Primero adquiero todo el input del usuario
> > Year = InputBox("Introduzca el periodo de su prestamo", "PASO 1 PARA CALCULAR LA TIR")
> > ReDim Flow(Year) 'Aqui redimensionamos la matriz una vez que ya sabemos los periodos
> > Cons_var = MsgBox("Las mensualidades son constantes?", vbYesNo)
> > 'Cargo mi matriz con todos los montos en cada periodo
> > Flow(0) = -Abs(InputBox("Introduzca la inversion inicial de su prestamo: ", "PASO 2 PARA CALCULAR LA TIR"))
> > If Cons_var = vbNo Then
> > For i = 1 To Year
> > Flow(i) = InputBox("Introduzca el flujo en el año ", i)
> > Next i
> > Else
> > Paym = InputBox("Introduzca la mensualidad de su prestamo : ", "PASO 4 PARA CALCULAR LA TIR")
> > For i = 1 To Year
> > Flow(i) = Paym
> > Next i
> > End If
> > ' mi problema es aqui cuando llamo a la funcion TIR que utiliza un rango y yo necesito meter la data de la matriz Flow()
> > MsgBox ("La TIR es " & TIR(Flow()))
> > End Sub
> >
> > Function MiTIR(FC As Range) As Double
> > 'Esta funcion calcula la TIR llamando a la funcion VAN de abajo, ambas utlizan un argumento en rango
> > Dim a As Double
> > Dim b As Double
> > Dim m As Double
> > a = 0
> > b = 1
> > m = (a + b) / 2
> > Do While Abs(VAN(m, FC)) > 0.00001
> > If VAN(m, FC) < 0 Then
> > b = m
> > Else
> > a = m
> > End If
> > m = (a + b) / 2
> > Loop
> > TIR = m
> > End Function
> >
> > Function VAN(k As Double, FC As Range)
> > 'Esta es la funcion VAN necesaria para calcular la TIR de arriba
> > Dim S As Double
> > Dim i
> > For i = 0 To FC.Count
> > S = S + FC(i, 1) / (1 + k) ^ i
> > Next i
> > VAN = S
> > End Function
>
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida