Sommario
In questo articolo esamineremo i problemi che si possono incontrare quando si utilizzano funzioni personalizzate nelle cartelle di lavoro, cercando di illustrare quali sono le cause e come possono essere facilmente risolti.
Ecco di cosa parleremo:
In precedenza abbiamo parlato di cosa sia una funzione personalizzata, di come crearla e utilizzarla. Se ritenete di dover rinfrescare le conoscenze di base sulle UDF, fate una pausa e date un'occhiata al mio precedente articolo.
Perché l'UDF di Excel non viene ricalcolato?
Quando si apportano modifiche alla cartella di lavoro, Excel non ricalcola tutte le formule presenti, ma aggiorna i risultati solo per le formule collegate alle celle modificate.
Ma questo riguarda le funzioni standard di Excel. Per quanto riguarda quelle personalizzate, Excel non è in grado di convalidare il codice VBA e di identificare altre celle che potrebbero influenzare il risultato della funzione personalizzata. Pertanto, la formula personalizzata potrebbe non cambiare quando si apportano modifiche alla cartella di lavoro.
Per risolvere il problema, è sufficiente utilizzare l'opzione Applicazione.Volatile Nel prossimo capitolo troverete le istruzioni passo-passo su come applicarlo.
Funzioni personalizzate volatili e non volatili
Per impostazione predefinita, le funzioni personalizzate di Excel non sono volatili. Ciò significa che l'UDF viene ricalcolata solo se il valore di una qualsiasi delle celle a cui fa riferimento cambia. Ma se il formato delle celle, il nome del foglio di lavoro, il nome del file cambiano, l'UDF non subirà alcuna modifica.
Passiamo dalle parole agli esempi. Ad esempio, è necessario scrivere il nome della cartella di lavoro in una cella. Per farlo, si crea una funzione personalizzata:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Immaginiamo ora il caso seguente: è stata scritta una formula personalizzata =Nome del libro di lavoro() nella cella e si ottiene il nome del file. Dopo un po' si decide di rinominare il file e lo si salva con un nome diverso. Ma guardando il valore nella cella si nota che non è cambiato. C'è ancora il vecchio nome del file che non è più corretto.
Poiché questa funzione non contiene argomenti, non viene ricalcolata (anche se si cambia il nome della cartella di lavoro, la si chiude e la si riapre).
Nota: per ricalcolare tutte le funzioni del file, è possibile utilizzare la scorciatoia Ctrl + Alt + F9.
Per fare in modo che la formula venga ricalcolata ogni volta che il foglio di lavoro cambia, è necessaria una riga di codice in più. Incollate il seguente pezzo di codice all'inizio della vostra funzione:
Applicazione.Volatile
Il codice sarà quindi simile a questo:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Ora la UDF è volatile, quindi verrà ricalcolata automaticamente se una cella del foglio di lavoro è stata ricalcolata o se si è verificata una modifica nella cartella di lavoro. Non appena si cambia il nome del file, si vedrà immediatamente l'aggiornamento.
Nota: tenete presente che un numero eccessivo di funzioni volatili può rallentare Excel, perché ci sono troppe funzioni personalizzate che eseguono calcoli complessi e operano continuamente su ampi intervalli di dati.
Pertanto, consiglio di utilizzare la volatilità solo quando è veramente necessaria.
Perché le funzioni personalizzate non sono disponibili
Quando si immettono le prime lettere del nome di una funzione personalizzata, questa viene visualizzata nell'elenco a discesa accanto alla cella di input, proprio come le funzioni standard di Excel.
Tuttavia, questo non accade sempre: quali sono gli errori che possono causare questa situazione?
Se si dispone di Excel 2003-2007, l'UDF non compare mai nell'elenco a discesa, dove sono presenti solo le funzioni standard.
Ma anche se si utilizza una versione più recente di Excel, c'è un altro errore che si può commettere accidentalmente.
La funzione personalizzata deve essere contenuta in un modulo VBA standard chiamato Moduli. Quando si aggiunge un nuovo modulo per scrivere il codice della funzione, viene automaticamente creata una cartella Moduli in cui vengono scritti tutti i moduli.
Ma a volte capita che un nuovo modulo non venga creato. Nella schermata successiva si può vedere che il codice della funzione personalizzata si trova nel modulo "Oggetti di Microsoft Excel" insieme a ThisWorkbook.
Il punto è che non è possibile inserire una funzione personalizzata nell'area del codice di un foglio di lavoro o di una cartella di lavoro. In questo caso, la funzione non funzionerà e non apparirà nell'elenco a discesa delle funzioni. Pertanto, il codice deve sempre trovarsi nella cartella Moduli .
Il testo della guida delle funzioni personalizzate di Excel non viene visualizzato
Un altro problema che può verificarsi è il suggerimento che si vede quando si incolla una funzione personalizzata. Se si usa una funzione standard, si vedrà sempre un suggerimento per la funzione e per i suoi argomenti. Ma che dire delle UDF?
Se si hanno molte funzioni personalizzate, sarà estremamente difficile ricordare quali calcoli esegue ciascuna di esse. Sarà ancora più difficile ricordare quali argomenti usare. Credo che sia una buona idea avere una descrizione delle funzioni personalizzate come promemoria.
Per questo, suggerisco di utilizzare il metodo Applicazione.MacroOpzioni Questo metodo consente di visualizzare la descrizione non solo della funzione, ma anche di ciascuno dei suoi argomenti nella finestra della procedura guidata della funzione, che viene visualizzata quando si fa clic sul pulsante Fx nella barra della formula.
Vediamo come aggiungere un suggerimento di questo tipo alle vostre UDF. Nell'articolo precedente abbiamo visto la funzione personalizzata GetMaxBetween, che trova il numero massimo nell'intervallo specificato e accetta tre argomenti: un intervallo di valori numerici e un valore massimo e minimo da cercare.
Ora aggiungeremo una descrizione per questa funzione personalizzata. Per farlo, creare ed eseguire il file Application.MacroOptions Per il comando GetMaxBetween è possibile eseguire il seguente comando:
Sub RegisterUDF () Dim strFuncName As String 'nome della funzione che si vuole registrare Dim strDescr As String ' descrizione della funzione stessa Dim strArgs () As String 'descrizione degli argomenti della funzione ' Registrare la funzione GetMaxBetween ReDim strArgs (1 To 3) 'Numero di argomenti nella funzione strFuncName = "GetMaxBetween" strDescr = "Numero massimo nell'intervallo specificato" strArgs (1) ="Intervallo di valori numerici" strArgs (2) = "Bordo dell'intervallo inferiore " strArgs (3) = " Bordo dell'intervallo superiore " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub
o
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Numero massimo nell'intervallo specificato" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Intervallo di valori numerici" , _ "Confine intervallo inferiore" , _ "Confine intervallo superiore" ) End SubVariabile str NomeFunc è il nome della funzione. strDescr - descrizione della funzione. strArgs contengono suggerimenti per ogni argomento.
Ci si può chiedere quale sia il quarto parametro di Application.MacroOptions. Questo parametro opzionale è denominato Categoria e indica la classe di funzioni di Excel che la nostra GetMaxBetween () Si può assegnare un nome a una qualsiasi delle categorie esistenti: Matematica & Trigonometria, Statistica, Logica, ecc. Si può specificare un nome per la nuova categoria in cui inserire le funzioni create. Se non si utilizza l'argomento Categoria, la funzione personalizzata verrà automaticamente inserita nella categoria "Definita dall'utente".
Incollare il codice della funzione nella finestra del modulo:
Cliccate quindi sul pulsante "Esegui". Il comando eseguirà tutte le impostazioni per l'utilizzo di Fx con il tasto GetMaxBetween() funzione.
Se si tenta di inserire una funzione in una cella utilizzando l'opzione Funzione di inserimento vedrete che c'è il vostro strumento GetMaxBetween si trova nella categoria "Le mie funzioni personalizzate":
È sufficiente iniziare a digitare il nome della funzione nella cella per visualizzare la funzione personalizzata nell'elenco a discesa delle funzioni da selezionare.
Quindi chiamare il Funzione guidata con il tasto Fx.
Suggerimento: è possibile utilizzare anche la combinazione di tasti CRTL + A per aprire la funzione guidata.
Nel Funzione guidata Se si posiziona il cursore sul secondo o sul terzo argomento, vengono visualizzati anche i relativi suggerimenti.
Se si desidera cambiare il testo di questi suggerimenti, modificare i valori dei campi strDescr e strArgs variabili nel file RegisterUDF () Quindi eseguire il codice RegisterUDF () di nuovo il comando.
Se si desidera annullare tutte le impostazioni effettuate e cancellare la descrizione della funzione, eseguire questo codice:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub
C'è un altro modo per ottenere un suggerimento quando si inserisce una funzione personalizzata: inserire il nome della funzione e premere Ctrl + Shift + A :
=GetMaxBetween(
+ Ctrl + Shift + A
Verrà visualizzato un elenco di tutti gli argomenti della funzione:
Sfortunatamente, qui non è possibile vedere la descrizione della funzione e dei suoi argomenti, ma se i nomi degli argomenti sono abbastanza informativi, potrebbero essere utili. Comunque, è meglio di niente :)
È necessario un po' di lavoro in più per creare intellisense per le UDF che funzionino come le funzioni standard di Excel. Purtroppo Microsoft non fornisce alcuna opzione. L'unica soluzione disponibile è attualmente un'estensione di Excel-DNA IntelliSense. Potete trovare maggiori informazioni sul sito web dello sviluppatore.
Speriamo che queste linee guida vi aiutino a risolvere i problemi quando la vostra funzione personalizzata non funziona o non funziona come vorreste. Se tuttavia la vostra UDF continua a non funzionare, descrivete accuratamente il vostro problema nella sezione Commenti. Cercheremo di capirlo e di trovare la soluzione per voi ;)