Type d'argument ByRef incompatible

Résolu/Fermé
Robix - 20 avril 2020 à 09:32
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 20 avril 2020 à 11:10
Bonjour,

Une nouvelle question à l'intention de la communauté...
Voici le problème :
Celui-ci se divise en deux parties:

[1] Une première partie constituée d'un module dans laquelle j'ai créé une fonction spécifique :
Function Cam_2_Contacts(A0 As Double, A1 As Double, A2 As Double, levee_max As Double, l As String, t2 As Double, t3 As Double, t4 As Double, t5 As Double, t6 As Double, t7 As Double, t8 As Double)
Celle-ci devant retourner un ensemble de valeur sur une page excel.

[2] Une deuxième partie constituée d'un Userform dans lequel je rentre les valeurs souhaitées pour faire tourner ma fonction (A0,A1,....). Pour se faire, j'ai décidé qu'une fois les valeurs rentrées dans mon formulaire, il me suffit d'appuyer sur un bouton pour exécuter la fonction plus haut et me retourner les valeurs calculées par cette même fonction dans une page Excel. J'ai donc codé de la manière suivante:

Private Sub CommandButton1_Click()
B0 = CDbl(frmcam1.A0.Value)
B1 = CDbl(frmcam1.A1.Value)
B2 = CDbl(frmcam1.A2.Value)
l = CDbl(frmcam1.levee_max.Value)
p2 = CDbl(frmcam1.t2.Value)
p3 = CDbl(frmcam1.t3.Value)
p4 = CDbl(frmcam1.t4.Value)
p5 = CDbl(frmcam1.t5.Value)
p6 = CDbl(frmcam1.t6.Value)
p7 = CDbl(frmcam1.t7.Value)
p8 = CDbl(frmcam1.t8.Value)
test = Cam_2_Contacts(B0, B1, B2, l, frmcam1.ldmvt.Value, p2, p3, p4, p5, p6, p7, p8)
End Sub

frmcam1 étant le nom de mon userform.

Le problème est donc le suivant...
Lorsque je clique sur le CommandButton1 de mon userform en ayant au préalable rentré l'intégralité de mes données le programme me renvoie un message d'erreur:
Type d'argument ByRef incompatible
J'ai testé l'ensemble des données (MsgBox VarType()) elles sont toutes conformes au type requis pour l'exécution de ma fonction plus haut.

Je précise que je suis novice en VBA...

En vous remerciant de l'aide que vous pouvez m'apporter...

Robix
Configuration: Windows / Chrome 80.0.3987.163

3 réponses

yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 20 avril 2020 à 09:43
bonjour, pour commencer, peux-tu utiliser les balises de code quand tu postes du code, et indiquer sur quelle ligne se produit le message d'erreur?
ensuite, si ce n'est pas encore fait, peux-tu ajouter
option explicit
en début de module?
ensuite, nous montrer la réponse (MsgBox VarType()) pour chacune de ces variables?

tu as choisi, pour un des paramètres, de ne pas passer par une variable. as-tu essayé d'utiliser une variable pour ce paramètre?
1
Ok yes désolé pour la présentation un peu ignoble...

Je viens de refaire quelques tests: En voulant y aller un peu en force j'ai, dans un premier temps, supprimé l'intégralité des types de mes variables dans ma fonction:
Function Cam_2_Contacts(A0, A1, A2 , levee_max , l , t2, t3 , t4, t5 , t6 , t7 , t8)

En procédant comme ça plus de problème, tout marche...

Ensuite...
En remettant les types respectifs de chaque variable et en insérant des MsgBox VarType un peu partout j'obtiens ce qui suit:
5 (B0)
5 (B1)
5 (B2)
5 (l)
8 (ldmvt)
5 (p2)
5 (p3)
5 (p4)
5 (p5)
5 (p6)
5 (p7)
5 (p8)
En mettant option explicit en début de module (ce que je n'avais pas fait), le message m'indique une erreur à la ligne 5 du code suivant :
Private Sub CommandButton1_Click()
B0 = CDbl(frmcam1.A0.Value)
B1 = CDbl(frmcam1.A1.Value)
B2 = CDbl(frmcam1.A2.Value)
l = CDbl(frmcam1.levee_max.Value)
p2 = CDbl(frmcam1.t2.Value)
p3 = CDbl(frmcam1.t3.Value)
p4 = CDbl(frmcam1.t4.Value)
p5 = CDbl(frmcam1.t5.Value)
p6 = CDbl(frmcam1.t6.Value)
p7 = CDbl(frmcam1.t7.Value)
p8 = CDbl(frmcam1.t8.Value)
test = Cam_2_Contacts(B0, B1, B2, l, frmcam1.ldmvt.Value, p2, p3, p4, p5, p6, p7, p8)
End Sub

Cette erreur indique que la variable n'est pas définie...

Pour terminer mon dernier test a été de refaire le code de la manière suivante :
Private Sub CommandButton1_Click()
 A0 = CDbl(frmcam1.A0.Value)
 A1 = CDbl(frmcam1.A1.Value)
 A2 = CDbl(frmcam1.A2.Value)
 levee_max = CDbl(frmcam1.levee_max.Value)
 ldmvt = frmcam1.ldmvt.Value
 t2 = CDbl(frmcam1.t2.Value)
 t3 = CDbl(frmcam1.t3.Value)
 t4 = CDbl(frmcam1.t4.Value)
 t5 = CDbl(frmcam1.t5.Value)
 t6 = CDbl(frmcam1.t6.Value)
 t7 = CDbl(frmcam1.t7.Value)
 t8 = CDbl(frmcam1.t8.Value)
 test = Cam_2_Contacts(A0, A1, A2, levee_max, ldmvt, t2, t3, t4, t5, t6, t7, t8)
 
End Sub


J'ai volontairement renommé les variables par rapport à la réponse de la deuxième personne sur mon post ( = dans un soucis de clarté pour ceux qui vont l'utiliser).
ET LA... TOUT MARCHE!

Je reste perplexe sur l'origine : Peut-être que, comme tu avais l'air de le sous-entendre, l'erreur venait de ma volonté de ne pas affecter de variable à un de mes paramètres..

Merci pour le temps que tu m'as consacré! (Et merci pour le option explicit) que je ne connaissais pas...
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Robix
20 avril 2020 à 11:03
tu ne nous montres pas les déclarations, qui devraient se situer dans la sub.
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Robix
20 avril 2020 à 11:10
selon moi, il est préférable, dans la déclaration de la fonction, de déclarer les types de tous les paramètres.
il est préférable de ne pas utiliser les mêmes noms de variables dans la déclaration de la fonction et dans l'appel de la fonction.
il est préférable de ne pas laisser de flou sur le type de ce que tu utilises.
quand tu écris
frmcam1.ldmvt.Value
, tu ne contrôles pas son type.
si tu écris
cstr(frmcam1.ldmvt.Value)
, ou
dim ch as string
ch=frmcam1.ldmvt.Value
, tu es certain du type que tu obtiens.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
20 avril 2020 à 09:49
A mon avis, cela vient de la valeur "frmcam1.ldmvt.Value" (typée Object, je pense)

Une bonne pratique est que si tu n'as pas besoin de modifier les valeurs passées en paramètre dans ta fonction est de préciser dans la déclaration ByVal :
Sub MaSub(ByVal Parameter1 As Double, ...)


Aussi, pense à donner des noms explicites à tes variables (p1 p2 t3 b0, ce n'est pas très claire)
1
J'ai refais quelques tests que j'ai expliqué dans une réponse plus haut...
Visiblement "frmcam1.ldmvt.Value" semblait coincer en effet...
Pour faire suite à ta remarque je me permets de te poser une question : Quelle serait la valeur de retour lors de l'utilisation de la fonction VarType dans le cas où la valeur serait typée Object?
Merci pour ces deux petites leçons de codage ;-)
Pour ce qui est des noms explicites, les utilisateurs de ce programme préfère rester avec ces noms... J'exécute les ordres!

Merci pour tout!
0