Pour les types de retour non-objet, vous devez affecter la valeur au nom de votre fonction, comme ceci:
PublicFunction test()AsInteger
test =1EndFunction
Exemple d'utilisation:
Dim i AsInteger
i = test()
Si la fonction renvoie un type d'objet, vous devez utiliser le Setmot clé comme ceci:
PublicFunction testRange()As Range
Set testRange = Range("A1")EndFunction
Exemple d'utilisation:
Dim r As Range
Set r = testRange()
Notez que l'attribution 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 le dire explicitement Exit Function. Par exemple:
Function test(ByVal justReturnOne AsBoolean)AsIntegerIf justReturnOne Then
test =1ExitFunctionEndIf'more code...
test =2EndFunction
Pour être complet, il convient de noter que lorsque vous retournez un objet (comme un Rangepar exemple), vous devez utiliser Setcomme vous le feriez si vous définissez une variable d'objet dans une méthode régulière. Ainsi, si, par exemple, "test" était une fonction qui renvoyait une plage, l'instruction return ressemblerait à ceci set test = Range("A1").
Jay Carr
Pourquoi est-ce @JayCarr?
PsychoData
4
@PsychoData - Tout simplement parce que c'est ainsi que vous définissez une variable d'objet en général, et le faire sans setpeut entraîner des problèmes. J'ai eu des problèmes pour le faire sans, mais si j'utilise setje ne le fais pas :).
Jay Carr
1
Je pense qu'il convient également de mentionner que le comportement de la fonction diffère lorsque vous l'appelez à partir d'une feuille de calcul, par rapport à l'appel d'une autre fonction VBA ou Sub.
Doug Jenkins
2
Lorsqu'elle est appelée dans VBA, la fonction renvoie un objet de plage, mais lorsqu'elle est appelée à partir d'une feuille de calcul, elle renvoie uniquement la valeur, elle set test = Range("A1")est donc exactement équivalente à test = Range("A1").Value, où "test" est défini comme un variant, plutôt que comme une plage.
Doug Jenkins
86
Les fonctions VBA traitent le nom de la fonction lui-même comme une sorte de variable. Donc, au lieu d'utiliser une returninstruction " ", vous diriez 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 de nombreuses instructions d'affectation qui affectent des valeurs différentes à test, et quelle que soit la valeur lorsque vous atteignez la fin de la fonction, la valeur sera renvoyée.
En fait, vous avez répondu plus clairement à la question avec des informations supplémentaires (ce qui pourrait potentiellement conduire à une autre question de nouveau à VBA). Continuez votre bon travail
Adarsha
Désolé, il semble que vous venez de répondre à la même chose que ma réponse, que j'avais d'abord, mais en ajoutant simplement le fait qu'elle ne sort pas de la fonction. C'est un bel ajout, je pensais juste que ce serait plus approprié comme commentaire. Je ne sais pas quelle est la bonne étiquette, je suppose que c'était un peu grossier de voter pour cela, car c'est une bonne réponse, mais cela ne me permettra pas de l'annuler.
Dan
41
Le simple fait de définir la valeur de retour sur le nom de la fonction n'est toujours pas exactement le même que l' returninstruction Java (ou autre) , car en java, returnquitte la fonction, comme ceci:
publicint test(int x){if(x ==1){return1;// exits immediately}// still here? return 0 as default.return0;}
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:
PublicFunction test(ByVal x AsInteger)AsIntegerIf x =1Then
test =1' does not exit immediately. You must manually terminate...ExitFunction' to exitEndIf' Still here? return 0 as default.
test =0' no need for an Exit Function because we're about to exit anyway.EndFunction
Comme c'est le cas, il est également agréable de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable de la méthode. Comme ça:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test <>1Then' Test the currently set return value
test =0' Reset the return value to a *new* valueEndIfEndFunction
Ou, l'extrême exemple de la façon dont la variable de retour des œuvres (mais pas nécessairement un bon exemple de la façon dont vous devriez le code réellement) -Celle qui vous tiendra la nuit:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test >0Then' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test -1)EndIfEndFunction
"il est également agréable de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable de la méthode" est généralement vrai - mais par exemple, si le type de retour est Variantet que votre objectif est de renvoyer un tableau, quelque chose comme ReDim test(1 to 100)cela déclenchera une erreur. De plus, même s'il est possible de traiter le type de base Integerscomme ça, il est considéré comme quelque peu unidiomatique. Cela rend le code plus difficile à lire. Les programmeurs VBA recherchent les lignes qui sont affectées au nom de la fonction pour comprendre ce qu'une fonction fait. L'utilisation du nom de la fonction comme variable régulière masque cela inutilement.
John Coleman
@JohnColeman, totalement d'accord sur les deux points. Le dernier exemple ne doit en aucun cas être celui de la méthodologie recommandée. Mais, la question du sujet concerne comment renvoyer une variable, et ce n'est donc qu'une tentative d'explication complète du résultat de retour de VB, et par extension comment ils fonctionnent. Certes, le dernier cas n'est pas une recommandation. (Je ne voudrais certainement pas coder cela comme plus qu'un exemple.) Donc, vos points sont bien pris et de bons ajouts. Je vous remercie.
LimaNightHawk
Il est utile pour les petites fonctions, et c'est quelque chose que tout programmeur VBA devrait connaître, donc je n'ai eu aucun problème à le mentionner. Je pensais juste qu'un avertissement devrait être inclus.
John Coleman
Merci d'expliquer comment se Exit Functionrapporte àreturn
Austin D
@JohnColeman, Évidemment, vous ne pouvez pas ReDim test(1 to 100)sans déclencher une erreur simplement parce que 'test' n'est pas déclaré comme un tableau! et pour aucune autre raison! Vous ne pouvez pas déclarer une fonction en tant que tableau. Déclarez-le en tant que Variant, puis créez simplement votre tableau de sortie (il peut être dynamique ou statique) à l'intérieur de cette fonction test, puis affectez ("=") ce tableau à testcomme valeur de retour. Pour manipuler davantage, comme l' ReDiming, vous devez affecter la valeur retournée à une variable, par exemple Dim x as Variantet appel x = test, après xquoi vous avez fait le testêtre!
Gene
-6
Le code ci-dessous stocke la valeur de retour dans la variable retValet MsgBoxpeut ensuite être utilisé pour afficher la valeur:
Dim retVal AsInteger
retVal = test()
Msgbox retVal
Réponses:
Pour les types de retour non-objet, vous devez affecter la valeur au nom de votre fonction, comme ceci:
Exemple d'utilisation:
Si la fonction renvoie un type d'objet, vous devez utiliser le
Set
mot clé comme ceci:Exemple d'utilisation:
Notez que l'attribution 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 le dire explicitement
Exit Function
. Par exemple:Documentation: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
la source
Range
par exemple), vous devez utiliserSet
comme vous le feriez si vous définissez une variable d'objet dans une méthode régulière. Ainsi, si, par exemple, "test" était une fonction qui renvoyait une plage, l'instruction return ressemblerait à ceciset test = Range("A1")
.set
peut entraîner des problèmes. J'ai eu des problèmes pour le faire sans, mais si j'utiliseset
je ne le fais pas :).set test = Range("A1")
est donc exactement équivalente àtest = Range("A1").Value
, où "test" est défini comme un variant, plutôt que comme une plage.Les fonctions VBA traitent le nom de la fonction lui-même comme une sorte de variable. Donc, au lieu d'utiliser une
return
instruction " ", vous diriez simplement:Notez cependant que cela ne sort pas de la fonction. Tout code après cette instruction sera également exécuté. Ainsi, vous pouvez avoir de nombreuses instructions d'affectation qui affectent des valeurs différentes à
test
, et quelle que soit la valeur lorsque vous atteignez la fin de la fonction, la valeur sera renvoyée.la source
Le simple fait de définir la valeur de retour sur le nom de la fonction n'est toujours pas exactement le même que l'
return
instruction Java (ou autre) , car en java,return
quitte la fonction, comme ceci: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:
Comme c'est le cas, il est également agréable de savoir que vous pouvez utiliser la variable de retour comme n'importe quelle autre variable de la méthode. Comme ça:
Ou, l'extrême exemple de la façon dont la variable de retour des œuvres (mais pas nécessairement un bon exemple de la façon dont vous devriez le code réellement) -Celle qui vous tiendra la nuit:
la source
Variant
et que votre objectif est de renvoyer un tableau, quelque chose commeReDim test(1 to 100)
cela déclenchera une erreur. De plus, même s'il est possible de traiter le type de baseIntegers
comme ça, il est considéré comme quelque peu unidiomatique. Cela rend le code plus difficile à lire. Les programmeurs VBA recherchent les lignes qui sont affectées au nom de la fonction pour comprendre ce qu'une fonction fait. L'utilisation du nom de la fonction comme variable régulière masque cela inutilement.Exit Function
rapporte àreturn
ReDim test(1 to 100)
sans déclencher une erreur simplement parce que 'test' n'est pas déclaré comme un tableau! et pour aucune autre raison! Vous ne pouvez pas déclarer une fonction en tant que tableau. Déclarez-le en tant queVariant
, puis créez simplement votre tableau de sortie (il peut être dynamique ou statique) à l'intérieur de cette fonctiontest
, puis affectez ("=") ce tableau àtest
comme valeur de retour. Pour manipuler davantage, comme l'ReDim
ing, vous devez affecter la valeur retournée à une variable, par exempleDim x as Variant
et appelx = test
, aprèsx
quoi vous avez fait letest
être!Le code ci-dessous stocke la valeur de retour dans la variable
retVal
etMsgBox
peut ensuite être utilisé pour afficher la valeur:la source