Newsgroup: it.comp.appl.access
Titolo: fuzione tir (tasso interno di rendimento) ed errore

Prima di tutto buongiorno a tutti.
Come da oggetto ho un problema relativo alla funzione tir, essa "funziona 
;-)" solo se i valori (flussi) non sono tutti positivi o non sono tutti 
negativi. Pertanto se ho i flussi tutti positivi o negativi la funzione da 
errore.
Di seguito posto il modulo che mi da problemi.
Il problema è che il modulo se non riesce a calcolare il tir mi si inchioda 
(debug) e non prosegue calcolando gli altri valori (van, payback ecc...)
Come posso ovviare a cio' e quindi far proseguire il modulo anche se non 
riesce a calcolare il tir?
Grazie mille
Gugge
Public Function CALCOLO_DEFINITIVO()
On Error GoTo MESSAGGIO_ERRORE
'==================================================================================
'CALCOLO_TIR_VAN_FLUSSI_PBACK
Dim RST As Recordset, a As Recordset, DBS As Database, X As Variant, 
flussi_p As Recordset, PB As Recordset, pbcalcolato As Variant, qdf As 
DAO.QueryDef
' per tir
Dim Guess, tir
' per van
Dim waac, NetPVal
' per flussi
Dim flusso12, flusso13
'payback
Dim pback
'____________________________________________________________________________________
' estraggo flussi di cassa gestione operativa
Set DBS = CurrentDb
' Imposta la matrice.
Static Values(12) As Double
' Flussi di cassa
Set a = DBS.OpenRecordset("SELECT 
CALCOLO_FLUSSI_DI_CASSA_GESTIONE_OPERATIVA.* FROM 
CALCOLO_FLUSSI_DI_CASSA_GESTIONE_OPERATIVA;")
Values(0) = [a]![SommaDieuro_anno1]
Values(1) = [a]![SommaDieuro_anno2]
Values(2) = [a]![SommaDieuro_anno3]
Values(3) = [a]![SommaDieuro_anno4]
Values(4) = [a]![SommaDieuro_anno5]
Values(5) = [a]![SommaDieuro_anno6]
Values(6) = [a]![SommaDieuro_anno7]
Values(7) = [a]![SommaDieuro_anno8]
Values(8) = [a]![SommaDieuro_anno9]
Values(9) = [a]![SommaDieuro_anno10]
Values(10) = [a]![SommaDieuro_anno11]
Values(11) = [a]![SommaDieuro_anno12]
Values(12) = [a]![SommaDieuro_anno13]
'____________________________________________________________________________________
'calcolo TIR
' La stima iniziale è del 1%.
Guess = 0.01
' Calcola il valore attuale netto
tir = IRR(Values(), Guess)     ' Calcola il tasso interno.
'____________________________________________________________________________________
'calcolo VAN
' Imposta il tasso interno fisso.
Set RST = DBS.OpenRecordset("SELECT DATI_PER_CAPM.waac_obiettivo FROM 
DATI_PER_CAPM;")
Set waac = RST![waac_obiettivo]
' Calcola il valore attuale netto
NetPVal = NPV(waac, Values())
X = NetPVal
'______________________________________________________________________________________
' flusso progressivo
Set flussi_p = DBS.OpenRecordset("SELECT 
flussi_di_cassa_operativi_2_progressivi.progr12, 
flussi_di_cassa_operativi_2_progressivi.progr13 FROM 
flussi_di_cassa_operativi_2_progressivi;")
Set flusso12 = flussi_p![progr12]
Set flusso13 = flussi_p![progr13]
'______________________________________________________________________________________
'payback
Set PB = DBS.OpenRecordset("SELECT payback_2.payback_anno FROM payback_2;")
Set pback = PB![payback_anno]
'MsgBox "Pay back anni" & pback
'______________________________________________________________________________________
'setto definitivo
'accodo il risultato ad una tabella con la query di accodamento
Set qdf = DBS.QueryDefs("accoda_van_tir_flussi_pb")
'aggancio parametri alla query
qdf.Parameters![calcolo van] = NetPVal
qdf.Parameters![calcolo tir] = tir
qdf.Parameters![calcolo pb] = pback
qdf.Parameters![calcolo flussi progr anno 12] = flusso12
qdf.Parameters![calcolo flussi progr anno 13] = flusso13
'lancio qry
qdf.Execute
'==================================================================================
MsgBox "Elaborazione terminata", vbOKOnly, "Elaborazione dati"
 Exit Function
MESSAGGIO_ERRORE:
MsgBox "errore elaborazione dati, lanciare elaborazione per 
step:CALCOLO_DEFINITIVO() " & Err.description, vbCritical, "Errore"
End Function


Ciao guggenheim,
quando la funzione IRR che calcola il TIR va in errore dovresti intercettare 
l'errore che restituisce e nella gestione dell'errore in fondo metti 
qualcosa di questo tipo:
MESSAGGIO_ERRORE:
   IF err.Number = XXXX    THEN  (dove XXXX è il numero di errore restituito 
dalla funzione IRR)
         Resume NEXT
 else
         MsgBox "errore elaborazione dati, lanciare elaborazione per 
step:CALCOLO_DEFINITIVO() " & Err.description, vbCritical, "Errore"
end if
-- 
Cinzia [Office Access MVP]
_______________________
 
www.riolab.org
---------------------------------------- 

 ' La stima iniziale č del 1%.



________________________________________________
Grazie
Guggenheim 


_______________
Grazie per l'help
Guggenheim