Come restituire un risultato da una funzione VBA


Risposte:


430

Per i tipi di ritorno non oggetto, devi assegnare il valore al nome della tua funzione, in questo modo:

Public Function test() As Integer
    test = 1
End Function

Esempio di utilizzo:

Dim i As Integer
i = test()

Se la funzione restituisce un tipo di oggetto, è necessario utilizzare la Setparola chiave in questo modo:

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

Esempio di utilizzo:

Dim r As Range
Set r = testRange()

Si noti che l'assegnazione di un valore restituito al nome della funzione non termina l'esecuzione della funzione. Se vuoi uscire dalla funzione, devi dire esplicitamente Exit Function. Per esempio:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

Documentazione: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx


32
Per completezza, si dovrebbe notare che quando si restituisce un oggetto (come Rangead esempio), è necessario utilizzare Setesattamente come si farebbe se si imposta una variabile oggetto in un metodo regolare. Quindi, se, ad esempio, "test" fosse una funzione che ha restituito un intervallo, l'istruzione return sarebbe simile a questa set test = Range("A1").
Jay Carr

Perché è @JayCarr?
PsychoData,

4
@PsychoData - Semplicemente perché è così che si imposta una variabile oggetto in generale, e farlo senza setpuò portare a problemi. Ho avuto problemi a farlo senza, ma se lo uso setnon lo faccio :).
Jay Carr,

1
Penso che valga anche la pena ricordare che il comportamento della funzione differisce quando lo chiami da un foglio di calcolo, rispetto al chiamarlo da un'altra funzione VBA o Sottotitolo.
Doug Jenkins,

2
Quando viene chiamata all'interno di VBA, la funzione restituisce un oggetto range, ma quando viene chiamata da un foglio di lavoro restituisce solo il valore, quindi set test = Range("A1")è esattamente equivalente a test = Range("A1").Value, dove "test" è definito come una variante, piuttosto che un intervallo.
Doug Jenkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.