Comment renvoyer un résultat 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 retourne un entier?
Comment renvoyer un résultat 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 retourne un entier?
Réponses:
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 Set
mot clé 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 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 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
Range
par exemple), vous devez utiliser Set
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 à ceci set test = Range("A1")
.
set
peut entraîner des problèmes. J'ai eu des problèmes pour le faire sans, mais si j'utilise set
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:
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.
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:
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
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:
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 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:
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
Variant
et 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 Integers
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 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 à test
comme valeur de retour. Pour manipuler davantage, comme l' ReDim
ing, vous devez affecter la valeur retournée à une variable, par exemple Dim x as Variant
et appel x = test
, après x
quoi vous avez fait le test
être!