Erreur#5 racine carré

ldetienne100

XLDnaute Nouveau
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

Dim y1y2 As String
Dim x1x2 As String

y1 = Range("b" & a).Value
y2 = Range("b" & b).Value
x1 = Range("c" & a).Value
x2 = Range("c" & b).Value

y1y2 = Sqr((y1 - y2) * Sqr(y1 - y2))
x1x2 = Sqr((x1 - x2) * Sqr(x1 - x2))


Merci de m'éclairer.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Erreur#5 racine carré

Bonjour ldetienne100 et bienvenu :)

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.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Erreur#5 racine carré

Bonjour
Donnant aussi le même résultat:
VB:
If y1 > y2 Then y1y2 = (y1 - y2) ^ 0.75 Else y1y2 = 0
Pareil pour x1x2
Tout à déclarer en Double.

P.S. Ou bien
VB:
If y1 <> y2 Then y1y2 = Abs(y1 - y2) ^ 0.75 * Sgn(y1 - y2) Else y1y2 = 0
Si ça a un sens. Tout dépend de ce que vos données modélisent.
Cordialement.
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Erreur#5 racine carré

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
 

ldetienne100

XLDnaute Nouveau
Re : Erreur#5 racine carré

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.

Merci à tous.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Erreur#5 racine carré

Bonsoir ldetienne100,

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
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Erreur#5 racine carré

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
 

ldetienne100

XLDnaute Nouveau
Re : Erreur#5 racine carré

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,
 

Dranreb

XLDnaute Barbatruc
Re : Erreur#5 racine carré

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.

Cordialement.
 
Dernière édition:

Statistiques des forums

Discussions
312 754
Messages
2 091 686
Membres
105 048
dernier inscrit
Nicoeum