La funzione potrebbe essere questa:
- Codice: Seleziona tutto
Function ScartoSh(ByRef lAdr As Range, ByVal ShOff As Long, Optional GimmeStr As Boolean = False) As Variant
'Restituisce un RANGE pari a lAdr spostato del numero di fogli specificato
'Se terzo parametro=True, restituisce una STRINGA con nome foglio e indirizzo
'
Application.Volatile
Set ScartoSh = Sheets(Parent.Caller.Parent.Index + ShOff).Range(lAdr.Address)
If GimmeStr Then
ScartoSh = "'" & ScartoSh.Parent.Name & "'!" & ScartoSh.Address(0, 0, , False)
End If
End Function
Esempio di uso:
- Codice: Seleziona tutto
=CERCA.VERT(C1;ScartoSh(K1:M8;-1);3;0)
Il valore in C1 viene cercato nella tabella presente sul foglio a sinistra di 1 posizione (-1) rispetto al foglio che contiene la formula.
Si noti che la funzione TRASCURA un eventuale riferimento a un NomeFoglio, rimanendo il foglio calcolato agganciato al foglio che contiene la formula. Cioe' se scrivessi
=CERCA.VERT(C1;ScartoSh(Foglio5!K1:M8;-1);3;0) il range calcolato farebbe sempre riferimento al foglio che contiene la formula, e "Foglio5" verrebbe ignorato
Infine va tenuto presente che per la formula i "predecessori" sono quelli indicati in chiaro nella formula, non quelli "ricalcolati" come da offset; quindi la formula non si ricalcolerebbe quando i predecessori ricalcolati cambiano. Per evitare questo effetto ho dichiarato la Function "volatile", che quindi si ricalcola a ogni cambiamento del foglio. Potrebbe quindi esserci un sovraccarico di cpu se le formule fossero tante e complesse; ma anche la funzione INDIRETTO e' volatile, quindi nel confronto dovrebbe cambiare poco.
Se lo "scarto" portasse a un foglio inesistente la funzione restituirebbe l'errore #VALORE!
Per pura curiosita' ho introdotto la possibilita' di ottenere in uscita dalla funzione non un Range ma il suo indirizzo sotto forma di stringa, inserendo il terzo parametro come Vero o anche solo 1. Potrebbe avere un utilizzo se usato in una formula piu' complessa, che ad esempio aggiunga anche il nome del file di lavoro, all'interno della funzione INDIRETTO
Spero di avervi confuso ben bene...