3 votes

Comment faire en sorte qu'une sous-routine VBA appelle une fonction qui transmet un tableau à une autre fonction à l'intérieur de la sous-routine ?

J'essaie de faire en sorte que ma sous-routine VBA exécute une fonction qui crée un tableau, puis transmet ce tableau à une autre fonction qui traite ensuite les éléments de ce tableau. J'ai créé un exemple extrêmement simple qui fonctionne exactement comme mon code réel :

Sub SubRoutine()
ProcessArray CreateArray
End Sub
Function ProcessArray(Arr() As Variant) As Variant
End Function
Function CreateArray() As Variant
Dim Array1(1 To 4) As Variant
CreateArray = Array1
End Function

Il s'agit uniquement des deux fonctions et de la sous-routine qui appelle ces deux fonctions. Le compilateur refuse de compiler mon code et m'explique que :

Erreur de compilation :

Incompatibilité de type : tableau ou type défini par l'utilisateur attendu

Ce à quoi je ne peux que répondre que tout est du même type de données et que l'argument passé est bien un tableau. Juste au cas où vous vous poseriez la question, oui j'ai essayé avec un tableau auquel des données ont été allouées.

Je sais que c'est quelque chose de subtil qui m'échappe dans la syntaxe VBA, mais je n'ai jamais vu d'exemple de ce genre. Toute idée serait grandement appréciée.

4voto

Daniel Cook Points 8727

Modifier cette ligne :
Function ProcessArray(Arr() As Variant) As Variant
à cela :
Function ProcessArray(Arr As Variant) As Variant

Ainsi, votre fonction acceptera un Variant contenant un tableau, au lieu de rechercher un tableau de Variants. Comme vous l'avez dit, il s'agit d'une différence subtile mais significative.

0voto

Mr_Moneybags Points 102

Je pense que ce qui n'a pas été répondu, c'est pourquoi
1. MySub(MyArg)
fonctionne parfaitement, mais
2. MyOtherSub(MyArg1, MyArg2)
n'est pas

Cet article de blog l'explique bien.

Essentiellement, vous pouvez passer un argument qui serait normalement byref comme byval :
Call MySub(Arg1, (Arg2)) 'Arg1 is passed byref, Arg2 is passed byval

Le code 1 fonctionne parce que VBA pense que vous passez un argument parVal, ce qui fait que les parenthèses ne sont pas prises en compte dans un Sub sans l'appel Call mot-clé. Comme indiqué dans d'autres réponses, aucune parenthèse n'est autorisée dans un mot-clé de type Sub sans l'appel Call mot-clé.

En Call nécessite Params entre parenthèses. Ainsi, avec le mot-clé Call mot-clé Call MySub(MyArg) passerait effectivement MyArg byRef parce que les parenthèses sont utilisées comme enceinte pour les arguments.

Le code 2 ne fonctionne pas parce qu'il n'y a pas de façon valide de justifier les parenthèses dans la syntaxe (cela n'est permis qu'avec le code Call mot-clé.

Prograide.com

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.

Powered by:

X