Comment retourner un résultat à partir d'une fonction ?
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 ?
Comment retourner un résultat à partir d'une fonction ?
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 ?
Pour les types de retour non-objets, 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 l'attribut Set
mot-clé comme celui-ci :
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 voulez quitter la fonction, vous devez dire 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
Pour être complet, il faut noter que lorsque vous retournez 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 normale. Ainsi, si, par exemple, "test" était une fonction qui renvoie un Range, l'instruction de retour ressemblerait à ceci set test = Range("A1")
.
@PsychoData - Tout simplement parce que c'est ainsi que l'on définit une variable d'objet en général, et le faire 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 :).
Les fonctions VBA traitent le nom de la fonction elle-même comme une sorte de variable. Ainsi, au lieu d'utiliser un " return
"Vous diriez simplement :
test = 1
Remarquez cependant que cela ne sort pas de la fonction. Tout code suivant cette instruction sera également exécuté. Ainsi, vous pouvez avoir de nombreuses instructions d'affectation qui attribuent différentes valeurs à test
et la valeur renvoyée sera celle que l'on obtient à la fin de la fonction.
En fait, vous avez répondu à la question de manière plus claire avec des informations supplémentaires (ce qui pourrait potentiellement conduire à une autre question d'un novice en VBA). Continuez à faire du bon travail
Désolé, j'avais l'impression que vous aviez répondu à la même chose que ma réponse, que j'avais donnée en premier, mais en ajoutant simplement le fait qu'elle ne sort pas de la fonction. C'est une belle addition, j'ai juste pensé que ce serait plus approprié comme commentaire. Je ne sais pas quelle est l'étiquette appropriée, je suppose que c'était un peu grossier de rétrograder pour cela, parce que c'est une bonne réponse, mais il ne me laisse pas l'annuler.
Le fait d'attribuer la valeur de retour au nom de la fonction n'est toujours pas exactement le même que celui de Java (ou autre) 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;
}
En VB, le exact L'équivalent prend deux lignes si vous ne définissez pas la valeur de retour à la fin de votre fonction. . Ainsi, en VB, le corollaire exact serait le suivant :
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 c'est le cas, il est également bon 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 travaux (mais pas nécessairement un bon exemple de la façon dont vous devriez coder en réalité) - 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
"il est également agréable de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable dans la méthode" est principalement vrai -- mais par exemple, si le type de retour est Variant
et que votre objectif est de retourner un tableau, alors quelque chose comme ReDim test(1 to 100)
déclenchera une erreur. En outre, même si elle est Il est possible de traiter le type de base comme Integers
comme le fait qu'elle soit considérée comme peu idiomatique. Cela rend le code plus difficile à lire. Les programmeurs VBA recherchent les lignes qui affectent le nom de la fonction pour comprendre ce que fait une fonction. Le fait d'utiliser le nom de la fonction comme une variable ordinaire rend cela inutilement obscur.
@JohnColeman, totalement d'accord sur les deux points. Le dernier exemple ne doit en aucun cas être une méthodologie recommandée. Mais, le sujet de la question est de savoir comment retourner une variable, et donc c'est juste une tentative d'explication complète des résultats de retour de VB, et par extension comment ils fonctionnent. Il est certain que le dernier cas n'est pas une recommandation. (Je ne le coderais certainement pas plus qu'un exemple.) Donc, vos points sont bien pris, et de bons ajouts. Je vous remercie.
Il est Il s'agit d'un élément que tout programmeur VBA devrait connaître, et je n'avais donc aucun problème à ce que vous le mentionniez. J'ai simplement pensé qu'un avertissement devait être inclus.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
12 votes
Documentation : msdn.microsoft.com/en-us/library/office/