Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Bonjour,
étant débutant, je connais très peu les variables et crois que mon problème se trouve dans celles ci. Lors de l'exécution du programme, une erreur #5, Argument ou appel de procédure incorrect, survient à cette ligne:
y1y2 = Sqr((y1 - y2) * Sqr(y1 - y2)). Voici le code:
Sub Macro1()
Dim y1 As String
Dim y2 As String
Dim x1 As String
Dim x2 As String
En regardant très rapidement votre code et à mon humble avis.
1) Toutes vos variables sont déclarées comme étant des chaines de caractères. Même si cela peut fonctionner car souvent VBA essaye de convertir d'un type à l'autre en cas de besoin et y réussit, ce n'est pas très logique. Il vaut mieux déclarer vos variables sans type, dans ce cas. VBA les considérera comme étant de type implicit Variant et à la première affectation essaira de leur attribuer le type le plus logique ou bien alors leur attribuer un type qui soit dans la logique de votre programme.
Ex: la fonction SQR retourne un nombre de type Double et non pas une chaine de caractères.
2) y1y2 = Sqr( (y1 - y2) * Sqr(y1 - y2) )
Si les parenthèses sont bien placées, vous désirez calculer la racine carrée du nombre X * racine(X) avec X=y1-y2
Il faut dans ce cas s'assurer que X ( qui est égal à y1-y2) est positif pour pouvoir calculer la racine carrée de X et
que le produit X * racine(X) soit aussi positif pour pouvoir en extraire la racine carré (ce qui est vrai si X est positif)
Si dans tous les cas, positif ou non, vous voulez faire ce calcul, on peut passer en valeur absolue:
dim y1y2 as double
y1y2 = Sqr( abs(y1 - y2) * Sqr(abs(y1 - y2)) )
ou bien pour plus de lisibilité avec deux instructions:
dim y1y2 as double
y1y2=abs(y1-y2)
y1y2=Sqr(y1y2 * Sqr(y1y2))
3) Je ne voit pas d'affectation aux variables a et b
Si vous avez des difficultés à corriger votre code, revenez nous en parler. Tout plein de gentils membres vous aideront.
Edit : par rapport à mon premier message, les parenthèses peuvent être bien placées! j'avais lu trop vite.
Bonjour
OUI TRES IMPORTANt
SQR doit être déclaré AS DOUBLE ( j'ai eu , et cherché longtemps là dessus)
Une leçon que j'ai retenue , mettre : OPTION EXPLICIT
comme ça on est obligé de déclarer toutes les variables utilisées , sinon erreur
donc en cherchant l'erreur sur la variable ( ex ici sur Y1Y2) on voit SQR : on regarde dans l'aide et l'on voit que ca doit être déclaré AS DOUBLE
Bonjour,
Merci beaucoup à vous tous pour vos réponses rapides! Mon code fonctionne à présent à merveille. Par contre, je ne suis pas sûr de saisir tout ce que vous me dites. Pour commencer, je dois vous dire que mes parenthèses étaient bien placées et que mon réel code est beaucoup plus long. J'en ai synthétisé le contenu important donc mes variables a et b sont bel et bien déclarées mais j'ai jugé impertinent de les montrer. J'aurais probablement dû.
1) Mapomme, pour décalrer des variables sans type faut-il simplement écrire «Dim variable»? Laisser VBA chercher le type le plus logique pourrait-il ralentir l'exécution?
2) Je me demandais aussi de ce que signifiais AS DOUBLE. D'autres pages du forum disent que «Les variables de type Double peuvent avoir des valeurs comprises entre -1,79769313486231E308 et -4,94065645841247E-324 pour les nombres négatifs et entre 4,94065645841247E-324 et 1,79769313486231E308 pour les positifs.» Je ne comprends pas la nécéssité d'utiliser en particulier ce type.
3) Et pour finir, VBA ne rencontre plus aucune erreur lorsque je mets «abs» dans la formule. Je me questionnais sur qu'est-ce qu'est, exactement, «abs» et quel est son rôle.
VBA ne rencontre plus aucune erreur lorsque je mets «abs» dans la formule. Je me questionnais sur qu'est-ce qu'est, exactement, «abs» et quel est son rôle.
La fonction ABS(X) renvoit toujours une valeur positive. Si X est positif , Abs(X) renvoit X et si X est négatif Abs(X) renvoit -X (moins par moins donne plus, comme on dit) qui est aussi positif. Ex: Abs(3.5) renvoit 3.5 et Abs(-3.5) renvoit aussi 3.5.
pour décalrer des variables sans type faut-il simplement écrire «Dim variable»?
Effectivement il suffit d'écrire Dim Toto, N as integer pour déclarer Toto comme un variant (suivi de N qui est déclaré comme Entier).
C'est normalement une bonne habitude de typer les variables.
Laisser VBA chercher le type le plus logique pourrait-il ralentir l'exécution?
Typer les variables est plus rapide. D'autres que moi pourront sans doute te répondre plus précisément. Typer les variables est aussi une bonne habitude de programmation que la fainéantise a souvent vite fait de faire perdre (moi compris)
D'autres pages du forum disent que «Les variables de type Double peuvent avoir des valeurs comprises entre -1,79769313486231E308 et -4,94065645841247E-324 pour les nombres négatifs et entre 4,94065645841247E-324 et 1,79769313486231E308 pour les positifs.» Je ne comprends pas la nécéssité d'utiliser en particulier ce type.
Dans ton cas, la fonction SQR renvoit un nombre réel (à virgule). Il faut donc que la variable qui reçoit le résultat soit d'un type comptatible. Deux types existent.
L'un est Single, l'autre est Double. Le second va pouvoir contenir des nombres plus grand en double précision.
Si on consulte l'aide de Excel-VBA on voit que la fonction Sqr renvoit renvoit un résultat de type Double; autant prendre un type qui correspond à ce que renvoie la fonction. Si on emploie, par exemple, un autre type, VBA va essayer de le convertir en perdant de la précision. Le plus important est de ne pas utiliser un type qui va sérieusement tronquer le résultat (comme le type Integer voir ci-dessous).
Tu peux tester le petit programme suivant:
Code:
Sub test()
Dim A As Integer, B As Single, C As Double
A = Sqr(2): MsgBox Format(A, "0.000 000 000 000 000")
B = Sqr(2): MsgBox Format(B, "0.000 000 000 000 000")
C = Sqr(2): MsgBox Format(C, "0.000 000 000 000 000")
End Sub
Bonsoir
2) Là tu cherches à comprendre le "langage machine" , les micros travaillent pratiquement tous à 32bits donc possibilité de coder à 2 ^¨32 , et sans aller plus loin..... ce sont les concepteurs pour leurs besoins ( et contraintes) qui ont dû appliquer les types de variables en relation avec la fonction ....... cherche pas plus !!!!
3) ABS = valeur Absolue en Maths Abs(-1) = 1 , car on ne peux pas chercher une racine carrée d'un nombre Négatif ( sauf avec les "complexes" ou j^2 =-1) , donc avec Abs t'es sûr de pouvoir faire un Sqr
Merci à tous. Dranreb, ton point est exact et est effectivement le meilleur sur un point de vu pratique, mais j'essayais plutôt de mieux comprendre les syntaxes et moins me concentrer sur le côté mathématique de la chose. Sinon, encore merci. Je viens de m'inscrire et est agréablement surpris de votre rapidité à répondre et de votre pertinence. Cordialement,
Bonjour.
De même que le type Long est la forme la plus naturelle d'entier chargé en registre de processeur 32 bits, le type de donnée Double est le plus approprié à la soumission sans adaptation préalable de la variable au coprocesseur arithmétique.
P.S. Autrement dit, les calculs sont toujours effectués en double précision, alors autant les faire porter sur des données Double.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD