2010-05-06 7 views
186

Comment renvoyer un résultat d'une fonction?Comment renvoyer un résultat d'une fonction VBA

Par exemple:

Public Function test() As Integer 
    return 1 
End Function 

Cela donne une erreur de compilation.

Comment faire pour que cette fonction renvoie un nombre entier?

+5

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

Répondre

286

Pour les types de retour non-objet, vous devez affecter la valeur au nom de votre fonction, comme ceci:

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

Exemple d'utilisation:

Dim i As Integer 
i = test() 

Si la fonction retourne un objet le type, vous devez utiliser le mot-clé Set comme ceci:

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

Exemple d'utilisation:

Dim r As Range 
Set r = testRange() 

Notez que l'attribution d'une valeur de retour au nom de la fonction n'arrête pas l'exécution de votre fonction. Si vous voulez quitter la fonction, vous devez indiquer explicitement Exit Function. Par exemple:

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

Pour être complet, il convient de noter que lorsque vous renvoyez un objet (comme un 'Range' par exemple), vous devez utiliser' Set' comme vous le feriez si vous définissiez une variable objet dans une méthode régulière. Ainsi, si, par exemple, "test" était une fonction qui renvoyait un Range, l'instruction return ressemblerait à ceci: set test = Range ("A1") '. –

+0

Pourquoi est-ce @JayCarr? – PsychoData

+3

@PsychoData - Simplement parce que c'est ainsi que vous définissez une variable objet en général, et que vous le faites sans 'set' peut entraîner des problèmes. J'ai eu des problèmes en le faisant sans, mais si j'utilise 'set' je ne le fais pas :). –

75

fonctions VBA traitent le nom de la fonction elle-même comme une sorte de variable. Ainsi, au lieu d'utiliser une déclaration « return », vous dites simplement:

test = 1 

avis, cependant, que cela ne rompt pas la fonction. Tout code après cette instruction sera également exécuté. Ainsi, vous pouvez avoir de nombreuses instructions d'assignation qui assignent des valeurs différentes à test, et quelle que soit la valeur lorsque vous atteignez la fin de la fonction sera la valeur retournée.

+0

En fait, vous avez répondu à la question plus clairement avec des informations supplémentaires (ce qui pourrait potentiellement conduire à une autre question de nouveau à VBA guy). Continuez votre bon travail – Adarsha

+0

Désolé, il semble que vous venez de répondre à la même chose que ma réponse, que j'ai eue en premier, mais en ajoutant simplement le fait qu'il ne sort pas de la fonction. C'est un bel ajout, je pensais juste que ce serait plus approprié comme commentaire. Je ne suis pas sûr de la bonne étiquette, je suppose que c'était un peu impoli de dire ça, parce que c'est une bonne réponse, mais ça ne me laissera pas le défaire. – Dan

28

suffit de positionner la valeur de retour au nom de la fonction est toujours pas exactement les mêmes que Java (ou autre) déclaration return, car en java, return quitte la fonction, comme ceci:

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

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

Dans VB, l'équivalent exact prend deux lignes si vous ne définissez pas la valeur de retour à la fin de votre fonction. Ainsi, en VB le corollaire exact ressemblerait à ceci:

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 

Puisque tel est le cas, il est aussi agréable de savoir que vous pouvez utiliser la variable de retour comme toute autre variable dans la méthode.Comme ceci:

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 

Ou, l'extrême exemple de la façon dont la variable de retour fonctionne (mais pas nécessairement un bon exemple de la façon dont vous devriez le code réellement) -le qui vous tiendra la nuit:

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

"il est également bon de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable de la méthode" est * surtout * vrai - mais par ex. Si le type de retour est 'Variant' et que votre but est de retourner un tableau, quelque chose comme' ReDim test (1 à 100) 'déclenchera une erreur. En outre, même s'il est * possible * de traiter un type de base comme "Integers", il est considéré comme peu unidiomatique. Cela rend le code plus difficile à lire. Les programmeurs VBA recherchent les lignes qui affectent au nom de la fonction pour comprendre ce qu'une fonction fait. Utiliser le nom de la fonction comme une variable régulière obscurcit inutilement cela. –

+0

@JohnColeman, totalement d'accord sur les deux points. Le dernier exemple ne devrait en aucun cas être celui de la méthodologie recommandée. Mais, la question du sujet concerne Comment retourner une variable, et donc ceci est juste une tentative d'explication complète du résultat du retour de VB, et par extension comment ils fonctionnent. Certes, le dernier cas n'est pas une recommandation. (Je ne le coderais certainement pas comme un exemple.) Ainsi, vos points sont bien pris, et de bons ajouts. Je vous remercie. – LimaNightHawk

+0

Il est * utile * pour les fonctions de petite taille, et c'est quelque chose que tout programmeur VBA devrait savoir, donc je n'ai eu aucun problème avec vous le mentionner. Je pensais juste qu'un avertissement devrait être inclus. –

-2

le code ci-dessous stocke la valeur de retour à la variable retVal puis MsgBox peut être utilisé pour afficher la valeur:

Dim retVal As Integer 
retVal = test() 
Msgbox retVal 
Questions connexes