Condividi:        

user function di excel con argomenti facoltativi

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

user function di excel con argomenti facoltativi

Postdi wallace&gromit » 11/04/19 10:42

Ciao,
vorrei creare una user function in cui inserire 3 o 4 argomenti in funzione dei casi. Il modello funzionante è quello in cui chiedo sempre 4 riferimenti a celle, e inserisco 0 per il 4° valore, se non esiste una cella da calcolare, vorrei invece potere, in questi casi, inserire solo 3 riferimenti e lasciare alla parte vba interpretare come 0 il valore non inserito.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Sponsor
 

Re: user function di excel con argomenti facoltativi

Postdi Anthony47 » 11/04/19 11:37

Esempio:
Codice: Seleziona tutto
Function LaMiaUdf(byRef PARAM1 as Range, byVal PARAM2 as Long, byVal PARAM3 as string, Optional byVal PARAM4 as Double = 0) As QuelCheServe
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: user function di excel con argomenti facoltativi

Postdi wallace&gromit » 11/04/19 13:07

Perfetto! grazie mille, anche oggi ho imparato qualcosina (come spesso accade, l'avrò visto fare chissà quante volte, ma fino a quando non ne ho avuto bisogno non avevo mai usato la definizione optional).
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: user function di excel con argomenti facoltativi

Postdi klingklang » 12/04/19 10:42

Ciao Anthony, approfitto della tua risposta per chiederti un chiarimento: in "teoria" mi è chiara la differenza tra ByRef e ByVal, ma spesso fatico a trovare dei casi in cui è utile/necessario usare il ByVal.
Certo quello che tu scrivi qui è solo un esempio di dichiarazione, ma ti chiedo: in una UDF, in quali occasioni passeresti un parametro come ByVal? Grazie mille per il tempo che vorrai dedicarmi :)
Enrico
Windows 7 + Office 2016 64bit / Windows 10 + Office 365 32/64bit
Avatar utente
klingklang
Utente Junior
 
Post: 97
Iscritto il: 23/11/18 15:01
Località: San Giovanni in Persiceto

Re: user function di excel con argomenti facoltativi

Postdi Anthony47 » 13/04/19 02:01

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
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: user function di excel con argomenti facoltativi

Postdi klingklang » 13/04/19 14:26

Ti ringrazio molto per la risposta. Non ho una rule of thumb (che ora so cos'è, anche se lo avevo intuito :lol: ): sinora esplicitavo il ByVal solo nei casi di conflitto di tipo. Esempio: se io scelgo un file con GetOpenFileName, la variabile che assegno a questa istruzione deve essere Variant, per tenere in conto la possibilità che l'utente annulli la finestra di dialogo senza selezionare un file (output = False).
Se però voglio elaborare il percorso del file aperto con una funzione, dovrei dichiararla come
Codice: Seleziona tutto
Function ElaboraPercorso(percorso as Variant) as String

Altrimenti incorerrei in un errore di compilazione. Ma se a quel punto del codice sono già sicuro che in quella variabile ci sarà una stringa di testo, posso aggirare il problema con
Codice: Seleziona tutto
Function ElaboraPercorso(ByVal percorso as String) as String

Non che all'atto pratico cambi poi tanto, ma per chiarezza preferisco comunque identificare il tipo già nella dichiarazione del parametro...
Beh, comunque la tua prassi non mi dispiace e potrei rubartela d'ora in avanti :)
Enrico
Windows 7 + Office 2016 64bit / Windows 10 + Office 365 32/64bit
Avatar utente
klingklang
Utente Junior
 
Post: 97
Iscritto il: 23/11/18 15:01
Località: San Giovanni in Persiceto


Torna a Applicazioni Office Windows


Topic correlati a "user function di excel con argomenti facoltativi":


Chi c’è in linea

Visitano il forum: Nessuno e 45 ospiti