Sommario
Dato che sapete già come creare le UDF (e, spero, avete anche provato ad applicarle in Excel), andiamo un po' più a fondo e vediamo cosa si può fare nel caso in cui la vostra funzione definita dall'utente non funzioni.
Per risolvere alcuni problemi durante la creazione di una funzione personalizzata, è molto probabile che sia necessario eseguire un debug, per essere sicuri che la funzione funzioni correttamente.
Esploreremo le seguenti tecniche di debug:
Quando si crea una funzione personalizzata, c'è sempre la possibilità di commettere un errore. Le funzioni personalizzate sono di solito piuttosto complesse e non sempre iniziano a funzionare correttamente da subito. La formula può restituire un risultato errato o l'errore #VALORE! A differenza delle funzioni standard di Excel, non vengono visualizzati altri messaggi.
Esiste un modo per esaminare passo dopo passo una funzione personalizzata per verificare il funzionamento di ogni sua istruzione? Certo! Il debug serve a questo.
Vi proporrò diversi modi per eseguire il debug della vostra funzione personalizzata, in modo che possiate scegliere quello che fa al caso vostro.
Come esempio, utilizziamo la funzione personalizzata GetMaxBetween di uno dei nostri articoli precedenti, che calcola il numero massimo nell'intervallo di valori specificato:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionGli argomenti della funzione sono l'intervallo di celle in cui vengono scritti i numeri e il limite superiore e inferiore dei valori.
Inserite la funzione MsgBox in punti importanti
Per monitorare l'esecuzione dei calcoli, è possibile visualizzare sullo schermo i valori delle variabili più importanti nei punti giusti, utilizzando finestre di dialogo a comparsa.
MsgBox è una finestra di dialogo che si può usare per mostrare un qualche tipo di messaggio all'utente.
La sintassi di MsgBox è simile a quella di altre funzioni VBA:
MsgBox(prompt [, pulsanti] [, titolo] [, helpfile, contesto])tempestivamente è un argomento obbligatorio, che contiene il messaggio visualizzato nella finestra di dialogo e può essere utilizzato anche per visualizzare i valori delle singole variabili.
Tutti gli altri argomenti sono facoltativi.
[ pulsanti ] - determina quali pulsanti e icone vengono visualizzati nel pannello di controllo. MsgBox Ad esempio, se si utilizza l'opzione vbOkOnly , allora solo il OK Anche se questo argomento è stato omesso, il pulsante viene utilizzato per impostazione predefinita.
[ titolo ] - qui è possibile specificare il titolo della casella di messaggio.
Passiamo dalle parole alla pratica e iniziamo il debug. Per visualizzare il messaggio, aggiungete la seguente riga al codice del file GetMaxBetween funzione definita dall'utente prima dell'elemento Caso Altro operatore:
Ecco cosa otterremo come risultato:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) Fine della funzioneUtilizzando il vMax nella finestra di dialogo, vedremo quali numeri soddisfano i criteri di selezione, in modo da poter selezionare il più grande di essi. Con l'espressione "Count -" & I nella barra del titolo, indichiamo quanti numeri abbiamo già selezionato per determinare il valore massimo. Il contatore verrà incrementato con ogni nuovo valore.
Una volta impostata la nostra UDF, applichiamo la formula sottostante all'intervallo di date:
= GetMaxBetween (A1:A6,10,50)
Dopo aver premuto il pulsante Invio, verrà visualizzato un messaggio come quello riportato nella schermata seguente:
È il primo numero dell'intervallo A1: A6 che soddisfa i criteri: maggiore di 10 e minore di 50.
Dopo aver fatto clic su OK, viene visualizzato un secondo messaggio con il numero 14. Gli altri numeri non corrispondono ai criteri di selezione. Pertanto, la funzione esce e restituisce il più grande dei due valori, 17.
Il MsgBox può essere utilizzato nei punti più importanti della funzione personalizzata per controllare come cambiano i valori delle singole variabili. Le caselle di messaggio possono essere molto utili quando si ha una funzione di grandi dimensioni e molti calcoli. In questo caso, sarà facile determinare in quale parte del codice si verifica l'errore.
Determinare i punti di arresto e procedere passo dopo passo
È possibile aggiungere punti di interruzione al codice della funzione in cui l'esecuzione del codice si interrompe, in modo da poter seguire il processo di calcolo passo dopo passo. In questo modo, è possibile vedere come cambiano i valori delle variabili.
Per aggiungere un punto di interruzione, posizionare il cursore sulla riga che contiene l'istruzione in cui si desidera mettere in pausa, quindi fare clic con il pulsante destro del mouse e selezionare Debug -> Attiva punto di interruzione oppure premere F9. È anche possibile fare clic nel punto desiderato dell'area grigia verticale a sinistra del codice funzione.
Apparirà un cerchio rosso, come si può vedere nella schermata sottostante. La riga di codice in cui il calcolo verrà interrotto è evidenziata in rosso.
A questo punto, la finestra dell'editor VBA verrà aperta quando la funzione è in esecuzione. Il cursore sarà posizionato nel punto in cui ci si è fermati.
Se si passa il cursore del mouse su una qualsiasi variabile del codice della funzione, si può vedere il suo valore attuale:
Premere F5 per continuare il calcolo.
Nota: dopo il punto di interruzione, è possibile iniziare a seguire l'avanzamento dei calcoli passo dopo passo. Se si preme il pulsante F8, verrà eseguita solo la riga successiva del codice VBA. La linea gialla con una freccia si sposterà inoltre sull'ultima posizione di codice eseguita.
Poiché l'esecuzione della funzione è nuovamente in pausa, è possibile visualizzare i valori correnti di tutte le variabili della funzione utilizzando il cursore del mouse.
La successiva pressione di F8 ci farà fare un passo avanti, quindi è possibile premere F8 fino alla fine del calcolo, oppure premere F5 per continuare il calcolo fino al punto di interruzione successivo.
Se si verifica un errore, il cursore si ferma nel punto del codice in cui si è verificato l'errore e viene visualizzato un messaggio di errore a comparsa. In questo modo è facile determinare la causa del problema.
I punti di interruzione specificati saranno applicati fino alla chiusura del file. Quando lo si riapre, sarà necessario impostarli di nuovo. Non è il metodo più comodo, non credete?
Tuttavia, questo problema può essere risolto: inserire una Stop nel codice della funzione nei punti necessari e si può interrompere l'esecuzione del programma nello stesso modo in cui si utilizzano i punti di interruzione.
Quando VBA incontra un elemento Fermarsi interrompe l'esecuzione del programma e attende la vostra azione. Controllate i valori delle variabili, quindi premete F5 per continuare.
Oppure premere F8 per eseguire la funzione passo dopo passo come descritto sopra.
Il Stop fa parte del programma e quindi non viene cancellato, come nel caso di un punto di interruzione. Una volta terminato il debug, rimuovetelo voi stessi, oppure trasformatelo in un commento facendolo precedere da una virgoletta singola (').
Debug con l'operatore Debug.Print
È possibile posizionare il Debug.Print nel codice della funzione al posto giusto, utile per controllare i valori delle variabili che cambiano ciclicamente.
Un esempio delle prestazioni di Debug.Print è riportato nella schermata seguente.
Dichiarazione Debug.Print i, vMax stampa i valori e i loro numeri ordinali.
Nella finestra Immediato vengono visualizzati due numeri (17 e 14) dell'intervallo selezionato, che corrisponde ai limiti impostati e tra i quali verrà selezionato il massimo. Le cifre 1 e 2 significano che la funzione ha completato 2 cicli in cui sono stati selezionati i numeri. Vediamo i valori delle variabili più importanti, come abbiamo fatto in precedenza con MsgBox Ma questo non ha fermato la funzione.
Chiamare una funzione da una procedura
È possibile chiamare una funzione definita dall'utente non da una cella del foglio di lavoro, ma da una procedura. In questo caso, tutti gli errori verranno visualizzati nella finestra dell'editor di Visual Basic.
Ecco come chiamare la funzione definita dall'utente GetMaxBerween da una procedura:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubPosizionare il cursore in un punto qualsiasi del codice e premere F5. Se la funzione non presenta errori, verrà visualizzata una finestra pop-up con il risultato del calcolo.
In caso di errore, viene visualizzato un messaggio corrispondente nell'editor VBA. Il calcolo viene interrotto e la riga di codice in cui si è verificato l'errore viene evidenziata in giallo. È possibile identificare facilmente dove e perché si è verificato l'errore.
È tutto. Ora avete creato il vostro componente aggiuntivo, lo avete aggiunto a Excel e potete utilizzare le UDF in esso. Se volete utilizzare altre UDF, scrivete il codice nel modulo del componente aggiuntivo nell'editor VBA e salvatelo.
Per oggi è tutto. Abbiamo illustrato diversi modi per eseguire il debug delle funzioni personalizzate e abbiamo imparato a utilizzarle nella cartella di lavoro. Speriamo che queste linee guida vi siano utili. Se avete domande, scrivete nei commenti a questo articolo.