Non sono un fine conoscitore della teoria, quindi prendi quel che dico con le pinzette...
Intanto secondo me la documentazione ufficiale e' approssimata (secondo me mischia informazioni relative a VB con quelle relative a VBA; certamente mischia Procedures e Functions); ad esempio viene spesso detto che i valori passati byRef possono essere modificati (vedi
https://docs.microsoft.com/en-us/office ... -statement e il glossario da lì richiamabile
https://docs.microsoft.com/it-it/office ... reference) ma e' chiaro che una Function puo' solo modificare l'area del risultato.
Poi ci sono "cose" che possono solo essere passati byRef: in genere si tratta di Objects quali (i primi che mi vengon in mente) Range, Control, Table, Intervalli, Sheet, e mille altri.
Teoricamente, inoltre, un parametro passato byRef potrebbe cambiare contenuto durante il calcolo della Function; ad esempio per una macro onTime o altro evento esterno, e in questo caso la Function rischia di ragionare con dati che cambiano sotto il suo naso (salvo che non siano stati congelati in una variabile locale).
La mia "rule of thumb" e' di usare byRef quando si tratta di Oggetti (es un Intervallo) e negli altri casi byVal; quando si tratta di Range appena complessi, in genere ne copio subito il contenuto in un array locale (sia per congelarli che per le velocizzazioni del caso).
So che e' un po' poco, ma questo passa questo convento.
Hai una tua rule of thumb?
Ciao