Facendo il semplice trascinamento della formula e non il copia/incolla la formula non viene ricalcolata, bisogna in quel caso preme F2+invio sulla cella per farla calcolare.
La tua formula:
Oggi = ActiveCell.Offset(0 - N, Col)
Prec = ActiceCell.Offset(0 - N - 1, Col)
se Col è = 1 l'offset sposta la cella attiva alla colonna successiva
quindi se l'intervallo è sulla colonna A con la formula che hai scritto ti sposti sulla colonna B. Ioltre (0-N) nel primo giro del ciclo For/next ti restituirà un riferimento circolare perchè l'offset sarà pari a zero quindi rimani puntato sulla cella attiva. vedi sotto come modificare:
Qui sotto, 3 ipotesi per come modificare le funzioni per assumere di default la cella attiva:
con questa macro funzione, indicando la colonna e l'intervallo, la riga di riferimento viene assunta dalla cella attiva il calcolo comincia dal primo valore dell'intervallo.
Public Function RSI(col As Integer, Intervallo As Integer) As Double
Dim N, Inc, Dec, Oggi, Prec, riga
Inc = 0
Dec = 0
With ActiveSheet
riga = ActiveCell.Offset(-1, 0).End(xlUp).Row
For N = 1 To Intervallo
Oggi = .Cells(riga + N, col)
Prec = .Cells(riga + N - 1, col)
If Oggi - Prec > 0 Then
Inc = Inc + Oggi - Prec
Else
Dec = Dec + Prec - Oggi
End If
Next
End With
RSI = 100 - (100 / (1 + (Inc / Dec)))
End Function
in alternativa a quella sopra, la riga e la colonna vengono prese di default dalla cella attiva e resta solo da indicare l'intervallo:
Public Function RSI2(Intervallo As Integer) As Double
Dim N, Inc, Dec, Oggi, Prec, riga, col
Inc = 0
Dec = 0
With ActiveSheet
riga = ActiveCell.Offset(-1, 0).End(xlUp).Row
colonna = ActiveCell.Column
For N = 1 To Intervallo
Oggi = .Cells(riga + N, colonna)
Prec = .Cells(riga + N - 1, colonna)
If Oggi - Prec > 0 Then
Inc = Inc + Oggi - Prec
Else
Dec = Dec + Prec - Oggi
End If
Next
End With
RSI2 = 100 - (100 / (1 + (Inc / Dec)))
End Function
Terza ipotesi, il calcolo inizia dall'ultimo valore dell'intervallo :
Public Function RSI3(col As Integer, Intervallo As Integer) As Double
Dim N, Inc, Dec, Oggi, Prec
Inc = 0
Dec = 0
With ActiveSheet
riga = ActiveCell.Offset(-1, 0).Row
For N = 0 To Intervallo
Oggi = .Cells(riga - N, col)
Prec = .Cells(riga - N - 1, col)
If Oggi - Prec > 0 Then
Inc = Inc + Oggi - Prec
Else
Dec = Dec + Prec - Oggi
End If
Next
End With
RSI3 = 100 - (100 / (1 + (Inc / Dec)))
End Function
resto dell'idea che una funzione non debba essere vincolata ad una cella
ma avere riferimenti variabili in modo da poterla utilizzare in qualsiasi punto del foglio.
saluti
Andrea
Edited by - a10n11 on 12/12/2005 14:52:13