VB déduit le typage du résultat d'un calcul implicitement du typage le plus large des opérandes du calcul.
Si on lui propose une opération impliquant des Long, le résultat sera typé Long (de même avec un Integer et un Long).
Si le calcul concerne deux Integer, il cherchera à placer le résultat dans un Integer.
Évidemment cela peut entraîner des dépassements de capacité puisque le produit de 2 Integer peux faire plus de 32767 (donc un Long).
Pour pallier ce problème, il suffit de convertir artificiellement une opérande dans un typage plus large pour que le résultat soit aussi de ce type.
D'où la syntaxe de Lord Nelson : 150& * 250
En effet le & est l'abréviation d'une conversion de type à la volée pour le nombre 150 qui devient ainsi un Long.
VB va donc récupérer le résultat du calcul dans un Long, et non plus dans un Integer comme la syntaxe 150 * 250 l'aurait fait.
Attention, même si votre variable VBA réceptionnant le résultat est d'un type assez large pour réceptionner le résultat, le dépassement de capacité interviendra si vous ne procédez pas comme indiqué.
Le code suivant plante, alors que la variable l est d'un type suffisant pour récupérer le résultat
Dim l As Double
l = 145626546 * 165168465 ' dépassement de capacité !
|
VB effectue d'abord le calcul à droite - et le dépassement de capacité intervient dès lors - avant de l'affecter à l.
La bonne syntaxe est
Dim l As Double
l = 145626546# * 165168465
|
où # désigne le type de données Double (le produit des deux Long donne un Double donc on type une des opérandes en Double)
Un dernier détail, la syntaxe suivante plante aussi. J'espère que vous comprenez pourquoi.
Dim l As Double
l = 145626546# * (165168465 * 49641321) ' dépassement de capacité |
Il faut donc faire très attention quand on utilise des formules mathématiques impliquant de nombreuses opérandes, et bien typer chaque sous-partie de la-dite formule.
Spoiler :
Cette syntaxe fonctionne
Dim l As Double
l = 145626546# * (165168465 * 49641321#)
|
J'espère avoir été clair, même si non exhaustif
Message édité par tegu le 03-03-2006 à 10:55:31