Procedure Function e Sub definite dall’utente in VBA
In Excel Visual Basic, un set di comandi per eseguire un’attività specifica viene inserito in una procedura, che può essere una procedura Function o una procedura Sub (anche note come subroutine).
La principale differenza tra una procedura Function e una procedura Sub è che una Function restituisce un risultato, mentre una Sub non lo fa.
Pertanto, se si desidera eseguire un’attività che restituisca un risultato (ad esempio la somma di un gruppo di numeri), si utilizzerà generalmente una Function, ma se è necessario solo un insieme di azioni da eseguire (ad esempio la formattazione di un insieme di celle), è possibile scegliere di utilizzare una Sub.
Funzioni VBA integrate
Prima di prendere in considerazione la creazione di proprie funzioni VBA, è utile sapere che esiste un gran numero di funzioni VBA integrate che è possibile utilizzare nel codice.
Un elenco delle principali funzioni VBA integrate, con esempi, è disponibile a questa pagina del nostro sito.
Argomenti
Alle procedure VBA possono essere passare dati tramite argomenti, che sono dichiarati nella definizione della procedura. Ad esempio, è possibile avere una procedura Sub che aggiunga un numero intero a ogni cella dell’intervallo selezionato su un foglio di lavoro. È possibile fornire il valore dell’intero alla Sub tramite un argomento, come segue:
Sub AddToCells(i As Integer)
.
.
.
End Sub
Si noti che non è essenziale che le Function o le Sub VBA abbiano argomenti. Alcune procedure potrebbero non richiederle.
Argomenti opzionali
Puoi anche definire le procedure VBA in modo da avere argomenti opzionali. Questi sono argomenti che l’utente può fornire se lo desidera, ma se vengono omessi, la procedura assegnerà loro un valore predefinito.
Per tornare all’esempio sopra, se volessimo rendere facoltativo l’argomento Integer fornito, questo sarebbe dichiarato come segue:
Sub AddToCells(Optional i As Integer = 0)
In questo caso, l’intero fornito, i, ha un valore predefinito di 0.
È possibile utilizzare più argomenti facoltativi in una procedura VBA, purché gli argomenti facoltativi siano tutti posizionati alla fine dell’elenco degli argomenti.
Passare argomenti per valore e per riferimento
Quando gli argomenti vengono passati alle procedure VBA, possono essere passati in due modi:
- ByVal: l’argomento viene passato by Value. Ciò significa che solo il valore (ovvero una copia dell’argomento) viene passato alla procedura e, pertanto, eventuali modifiche apportate all’argomento all’interno della procedura andranno perse all’uscita dalla procedura.
- ByRef: l’argomento viene passato by Reference. Ciò significa che l’indirizzo dell’argomento viene passato alla procedura. Eventuali modifiche apportate all’argomento all’interno della procedura verranno memorizzate quando si esce dalla procedura.
È possibile specificare se un argomento viene passato a una procedura VBA in base al valore o al riferimento utilizzando la parola chiave ByVal o ByRef durante la definizione della procedura. Come mostrato di seguito:
Sub AddToCells(ByVal i As Integer) . . . End Sub ______________________________ In questo caso, l'intero i viene passato per Valore. Eventuali modifiche apportate a i andranno perse quando si esce dalla procedura Sub. |
Sub AddToCells(ByRef i As Integer) . . . End Sub ______________________________ In questo caso, l'intero i viene passato per Riferimento. Quando si esce dal Sub, tutte le modifiche apportate a i verranno memorizzate dalla variabile che è stata passata alla procedura Sub. |
Va notato che, per impostazione predefinita, gli argomenti VBA vengono passati by Reference. Pertanto, se non si utilizza la parola chiave ByVal o ByRef, gli argomenti verranno passati per riferimento.
Prima di discutere ulteriori proprietà delle procedure Function e Sub, è utile esaminare singolarmente i due tipi di procedura. Le due sezioni seguenti forniscono una breve discussione di tali procedure, insieme a semplici esempi.
Le procedure Function di VBA
L’editor VBA riconosce una procedura Function, poiché i comandi sono posizionati tra le seguenti istruzioni di inizio e fine:
Function
.
.
.
End Function
Come accennato in precedenza, le procedure Function VBA (a differenza delle procedure Sub) restituiscono un valore. I valori restituiti hanno le seguenti regole:
- Il tipo di dati del valore restituito deve essere dichiarato nell’intestazione della funzione.
- Il valore da restituire deve essere assegnato a una variabile con lo stesso nome della funzione. Non è necessario dichiarare questa variabile, poiché esiste già come parte della funzione.
Questo è illustrato nell’esempio seguente.
Esempio di procedura Function VBA: eseguire un’operazione matematica su 3 numeri
Il codice seguente mostra un esempio di una semplice procedura Function VBA che riceve tre argomenti, ciascuno dei quali è ‘Double’ (numeri in virgola mobile a precisione doppia). La funzione restituisce un ulteriore ‘Double’, che è la somma dei primi due argomenti, meno il terzo argomento:
' Funzione per sommare due numeri e quindi sottrarre un terzo numero
Function SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double
SumMinus = dNum1 + dNum2 - dNum3
End Function
La semplice procedura VBA mostrata qua sopra illustra il modo in cui vengono forniti gli argomenti a una procedura. Si vede anche come il tipo restituito dalla procedura Function sia definito come ‘Double’ (dal termine ‘As Double’ che è incluso dopo gli argomenti).
L’esempio sopra mostra anche come il risultato della Function sia memorizzato in una variabile che ha lo stesso nome della Function.
Chiamata alle procedure Function VBA
Se la semplice Function qua sopra è inserita in un modulo nel Visual Basic Editor, sarà quindi disponibile per essere richiamata da altre procedure VBA o da utilizzare nei fogli di lavoro della cartella di lavoro di Excel.
Chiamata di una Function dall’interno di VBA
Puoi chiamare una procedura Function dal tuo programma VBA semplicemente assegnando la funzione a una variabile. L’esempio seguente mostra una chiamata alla Function SumMinus che è stata definita sopra:
Sub main()
Dim total as Double
total = SumMinus(5, 4, 3)
End Sub
Chiamata di una Function da un foglio di lavoro
Puoi chiamare le Function VBA da un foglio di lavoro di Excel, allo stesso modo in cui puoi chiamare una qualsiasi delle funzioni inteegrate di Excel.
Pertanto, è possibile chiamare la procedura SumMinus digitando quanto segue in qualsiasi cella del foglio di lavoro:
=SumMinus(10; 5; 2)
Le procedure Sub di VBA
L’editor VBA riconosce una procedura Sub, poiché i comandi sono posizionati tra le seguenti istruzioni di inizio e fine:
Sub
.
.
.
End Sub
Procedura Sub VBA Esempio 1: Centra e applica la dimensione del carattere a un intervallo di celle selezionato
Il codice seguente mostra un esempio di una semplice procedura Sub di VBA che applica della formattazione all’intervallo di celle selezionato. Le celle sono formattate per essere allineate al centro (sia orizzontalmente che verticalmente) e avere una dimensione del carattere fornita dall’utente:
' Procedura Sub per centrare e applicare una dimensione del
' carattere fornita all'intervallo selezionato
Sub Format_Centered_And_Sized(Optional iFontSize As Integer = 10)
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.Font.Size = iFontSize
End Sub
L’esempio sopra mostra come le procedure Sub eseguono azioni ma non restituiscono valori.
Questo esempio include anche l’argomento opzionale, iFontSize. Se iFontSize non viene fornito alla Sub, viene utilizzata la dimensione del carattere predefinita di 10. Invece, se iFontSize viene fornito, l’intervallo selezionato viene impostato per avere le dimensioni del carattere fornite dall’utente.
Procedura Sub VBA Esempio 2: Centra e applica il carattere grassetto a un intervallo di celle selezionato
Il seguente codice è simile all’esempio 1, ma invece di fornire una dimensione del carattere all’intervallo selezionato, le celle sono impostate per avere un carattere in grassetto. Questo esempio è stato incluso per mostrare una Sub che non riceve alcun argomento:
' Procedura Sub per centrare applicare il grassetto
' all'intervallo selezionato
Sub Format_Centered_And_Bold()
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.Font.Bold = True
End Sub
Chiamata alle procedure Sub VBA
Chiamata di una Sub dall’interno di VBA
È possibile chiamare una procedura Sub VBA dal programma VBA digitando la parola chiave Call, seguita dal nome della Sub e quindi dagli argomenti racchiusi tra parentesi. Questo è mostrato nell’esempio seguente:
Sub main()
Call Format_Centered_And_Sized(20)
End Sub
Se la routine Sub Format_Centered_And_Sized avesse più di un argomento, questi sarebbero separati da virgole. Per esempio:
Sub main()
Call Format_Centered_And_Sized( arg1, arg2, ... )
End Sub
Chiamata di una Sub da un foglio di lavoro
Le procedure Sub non possono essere digitate direttamente in un foglio di lavoro in Excel, come invece si può fare con le Function, poiché le Sub non restituiscono un valore. Tuttavia, purché non abbiano argomenti (e siano Public, vedere di seguito), le Sub di Excel sono ugualmente disponibili per l’utente di un foglio di calcolo. Di conseguenza, delle semplici procedure Sub di cui sopra, la Sub Format_Centered_And_Bold sarebbe disponibile per essere utilizzata nei fogli di lavoro di Excel, ma Format_Centered_And_Sized no (poiché ha un argomento).
Per le procedure Sub accessibili dalla cartella di lavoro, un modo semplice per eseguirle è:
- Aprire la finestra di dialogo ‘Macro‘:
- Facendo clic sull’opzione Macro dalla scheda ‘Sviluppo‘ della barra multifunzione di Excel, oppure
- Utilizzando la scorciatoia da tastiera Alt + F8 (ovvero premendo il tasto Alt e, tenendolo premuto, premendo F8).
- Nella finestra di dialogo ‘Macro‘, seleziona la macro che desideri eseguire e fai clic sul pulsante Esegui.
Assegnare una scorciatoia da tastiera a una Sub
È possibile assegnare una combinazione di tasti alla propria procedura Sub per consentire l’esecuzione rapida e semplice del codice. Per fare questo:
- Apri la finestra di dialogo ‘Macro‘:
- Facendo clic sull’opzione Macro nella scheda ‘Sviluppo’ della barra multifunzione di Excel, oppure
- Utilizzando la scorciatoia da tastiera Alt + F8 (ovvero premendo il tasto Alt e mantenendolo premuto, premendo F8).
- Nella finestra di dialogo ‘Macro‘, seleziona la macro a cui desideri assegnare una combinazione di tasti;
- Fai clic su Opzioni… per aprire la finestra di dialogo ‘Opzioni macro‘;
- Digita la scorciatoia da tastiera richiesta nella finestra di dialogo ‘Opzioni macro‘;
- Fai clic su OK, quindi chiudi la finestra di dialogo ‘Macro‘.
Ambito delle procedure VBA
Nella parte 2 di questo tutorial, abbiamo discusso l’ambito delle variabili e delle costanti e il ruolo delle parole chiave Public e Private. Queste parole chiave hanno lo stesso significato quando applicate alle procedure VBA:
Public Sub AddToCells(i As Integer) . . . End Sub ______________________________ Se la dichiarazione di un procedura è preceduta dalla parola chiave Public, ciò rende la procedura accessibile a tutti gli altri moduli del Progetto VBA. |
Private Sub AddToCells(i As Integer) . . . End Sub ______________________________ Se la dichiarazione di una procedura è preceduta dalla parola chiave Private, questa procedura è disponibile solo per il modulo corrente. Non è possibile accedervi da nessun altro modulo o dalla cartella di lavoro di Excel. |
Se non viene inserita alcuna parola chiave all’inizio di una Function o di una Sub VBA, l’impostazione predefinita prevede che la procedura sia Public (ovvero sia accessibile da qualsiasi parte del progetto VBA). Ciò differisce dalle dichiarazioni delle variabili, che sono Private per impostazione predefinita.
Uscita anticipata dalle Function e dalle Sub di VBA
Se si desidera uscire da una Function o da una Sub prima che sia stata eseguita fino alla fine, è possibile farlo utilizzando il comando Exit Function oppure Exit Sub. Questo è illustrato di seguito, in una semplice Function che prevede di ricevere un valore positivo con cui lavorare. Se il valore ricevuto non è positivo, la funzione non può continuare, quindi evidenzia l’errore all’utente ed esce immediatamente dalla procedura:
Function VAT_Amount(sVAT_Rate As Single) As Single
VAT_Amount = 0
If sVAT_Rate <= 0 Then
MsgBox "Era atteso un valore positivo di sVAT_Rate ma è stato ricevuto " & sVAT_Rate
Exit Function
End If
.
.
.
End Function