web-dev-qa-db-fra.com

Comment retourner un résultat d'une fonction VBA

Comment puis-je retourner un résultat d'une fonction?

Par exemple:

Public Function test() As Integer
    return 1
End Function

Cela donne une erreur de compilation.

Comment puis-je faire en sorte que cette fonction retourne un entier?

250
Mike

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 renvoie un type d'objet, vous devez utiliser le mot clé Set de la manière suivante:

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

Exemple d'utilisation:

Dim r As Range
Set r = testRange()

Notez que l'affectation d'une valeur de retour au nom de la fonction ne met pas fin à l'exécution de votre fonction. Si vous souhaitez quitter la fonction, vous devez explicitement dire 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

394
Dan

Les fonctions VBA traitent le nom de la fonction elle-même comme une sorte de variable. Ainsi, au lieu d’utiliser une instruction "return", vous direz simplement:

test = 1

Notez cependant que cela ne sort pas de la fonction. Tout code après cette instruction sera également exécuté. Ainsi, vous pouvez avoir plusieurs instructions d'affectation qui attribuent des valeurs différentes à test, et quelle que soit la valeur à atteindre lorsque la fin de la fonction est atteinte, la valeur renvoyée est renvoyée.

83
froadie

Définir simplement la valeur de retour sur le nom de la fonction n’est toujours pas exactement identique au Java (ou autre) return instruction, 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;
}

En VB, l'équivalent exact prend deux lignes si vous ne définissez pas la valeur de retour à la fin de votre fonction . Ainsi, dans 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 

Comme c'est le cas, il est également bon de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable de la méthode. Comme ça:

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 bien, l'exemple extrême du fonctionnement de la variable de retour (mais pas nécessairement un bon exemple de la façon dont vous devriez coder), celui qui vous empêchera de dormir 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
34
LimaNightHawk