2010-05-06 20 views
186

Come restituire un risultato da una funzione?Come restituire un risultato da una funzione VBA

Ad esempio:

Public Function test() As Integer 
    return 1 
End Function 

Questo dà un errore di compilazione.

Come si fa a rendere questa funzione un numero intero?

+5

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

risposta

286

Per i tipi di ritorno non-oggetto, è necessario assegnare il valore al nome della funzione, in questo modo: l'utilizzo

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

Esempio:

Dim i As Integer 
i = test() 

Se la funzione restituisce un oggetto tipo, quindi è necessario utilizzare la parola chiave Set in questo modo: l'utilizzo

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

Esempio:

Dim r As Range 
Set r = testRange() 

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

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

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

+26

Per completezza si noti che quando si restituisce un oggetto (come un 'Range' per esempio), devi usare' Set' proprio come faresti se impostassi una variabile oggetto in un metodo normale. Quindi, se, ad esempio, "test" fosse una funzione che restituiva un Range, l'istruzione return sarebbe simile a 'set test = Range (" A1 ")'. –

+0

Perché @JayCarr? – PsychoData

+3

@PsychoData - Semplicemente perché è così che si imposta una variabile oggetto in generale, e farlo senza 'set' può portare a problemi. Ho avuto problemi a farlo senza, ma se uso 'set' non lo faccio :). –

75

funzioni VBA trattano il nome della funzione stessa come una sorta di variabile. Così, invece di utilizzare un "return" l'istruzione, si potrebbe semplicemente dire:

test = 1 

noti, però, che questo non si rompe fuori della funzione. Anche qualsiasi codice dopo questa dichiarazione verrà eseguito. Pertanto, è possibile avere molte istruzioni di assegnazione che assegnano valori diversi a test e qualunque sia il valore quando si raggiunge la fine della funzione sarà restituito il valore.

+0

In realtà hai risposto più chiaramente alla domanda con informazioni aggiuntive (che potrebbero potenzialmente portare ad un'altra domanda da un nuovo utente di VBA). Continuate così, – Adarsha

+0

Scusa, mi è sembrato che tu abbia appena risposto la stessa cosa della mia risposta, che prima avevo, ma aggiungendo semplicemente il fatto che non si interrompe. È una bella aggiunta, ho solo pensato che sarebbe stato più appropriato come commento. Non sono sicuro di quale sia l'etichetta corretta, immagino che sia stato un po 'scortese parlare di down solo per questo, perché è una buona risposta, ma non mi permetterà di annullarlo. – Dan

28

Basta impostare il valore di ritorno al nome della funzione non è ancora esattamente lo stesso del Java (o altro) return dichiarazione, perché in java, return esce la funzione, in questo modo:

public int test(int x) { 
    if (x == 1) { 
     return 1; // exits immediately 
    } 

    // still here? return 0 as default. 
    return 0; 
} 

In VB, l'equivalente esatto richiede due righe se non si imposta il valore restituito alla fine della funzione. Così, in VB corollario esatto sarebbe simile a questa:

Public Function test(ByVal x As Integer) As Integer 
    If x = 1 Then 
     test = 1 ' does not exit immediately. You must manually terminate... 
     Exit Function ' to exit 
    End If 

    ' Still here? return 0 as default. 
    test = 0 
    ' no need for an Exit Function because we're about to exit anyway. 
End Function 

Dal momento che questo è il caso, è anche bello sapere che è possibile utilizzare la variabile di ritorno come qualsiasi altra variabile nel metodo.Come questo:

Public Function test(ByVal x As Integer) As Integer 

    test = x ' <-- set the return value 

    If test <> 1 Then ' Test the currently set return value 
     test = 0 ' Reset the return value to a *new* value 
    End If 

End Function 

Oppure, all'estremo esempio di come la variabile di ritorno funziona (ma non necessariamente un buon esempio di come si dovrebbe in realtà codice) -quello che vi terrà sveglio la notte:

Public Function test(ByVal x As Integer) As Integer 

    test = x ' <-- set the return value 

    If test > 0 Then 

     ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT, 
     ' AND THE RESULT RESETTING THE RETURN VALUE. 
     test = test(test - 1) 

    End If 

End Function 
+2

"è anche bello sapere che è possibile utilizzare la variabile return come qualsiasi altra variabile nel metodo" is * mostly * true - ma ad es. se il tipo restituito è 'Variant' e il tuo obiettivo è quello di restituire un array allora qualcosa come' ReDim test (da 1 a 100) 'attiverà un errore. Inoltre, anche se * è * possibile trattare un tipo di base come "Interi" come quello, è considerato alquanto unidiomatico. Rende il codice più difficile da leggere. I programmatori VBA analizzano le linee che assegnano al nome della funzione per capire cosa fa una funzione. Usando il nome della funzione come variabile regolare oscuri inutilmente questo. –

+0

@JohnColeman, totalmente d'accordo su entrambi i punti. In nessun caso l'ultimo esempio dovrebbe essere uno dei metodi consigliati. Ma la questione dell'argomento riguarda come restituire una variabile, e quindi questo è solo un tentativo di una spiegazione completa del risultato di ritorno di VB e, per estensione, del modo in cui funzionano. Certamente l'ultimo caso non è una raccomandazione. (Certamente non lo codificherei più di un esempio.) Quindi, i tuoi punti sono ben presi e buone aggiunte. Grazie. – LimaNightHawk

+0

È * utile * per funzioni di piccole dimensioni, ed è qualcosa che qualsiasi programmatore VBA dovrebbe sapere, quindi non ho avuto alcun problema nel parlarne. Ho solo pensato che un avvertimento dovrebbe essere incluso. –

-2

il seguente codice memorizza il valore restituito alla variabile retVal e quindi MsgBox può essere utilizzato per visualizzare il valore:

Dim retVal As Integer 
retVal = test() 
Msgbox retVal 
Problemi correlati