depassement de capacité - VB/VBA/VBS - Programmation
Marsh Posté le 01-03-2006 à 13:54:59
J'apporte mon soutien, je compathie, j'espère que ça te fait plaisir.
Pour la réponse, désolé, je n'en ai pas.
Par contre, j'ai des questions supplémentaires :
- Est-ce que c'est du VB, VBS, du VBA pour Excel, ou du VBA pour Access ?
- D'où vient ce nombre ? Est-ce qu'il vient d'une importation d'une formule "=...", d'un calcul dans VBA ? Si oui, quelle donnée est importée, ou quelle est la formule, ou quel est le calcul VBA ?
- Est-ce que le nombre contient bien des chiffres, et non pas des lettres, ou des espaces ?
- Est-ce qu'il n'y aurait pas une confusion entre le point et la virgule (il faut mettre le séparateur qui est indiqué dans le panneau de configuration, paramètres régionnaux) ?
- Est-ce que la celulle ou le champ de destination est au bon format ?
- Est-ce que l'on pourrait voir la ligne qui correspond au message d'erreur et la ligne précédente ?
Marsh Posté le 01-03-2006 à 15:23:42
merci pour le soutien
alors c'est du vba pour excel
le pb vient bien d'un resultat de cacul (via formule)
Dia_fonte = Int(((((1.601 * (a(i, 1) / 3600) ^ 1.975) / (1.28 * 10)) ^ (1 / 5.25)) * 1000) * 0.8)
avec a(i,1) en integer pour a(i,1) =2 c'est ok, pour 22 ok pour 100 "depassement de validité"!!
j'ai essaye de placer clng () devant la formule comme donne dans l'aide mais rien de plus.
je sais pas trop ou sa bloque, (je debute en vba) mais c'est au moment de calculer ces nombres.
c'est d'autant vexant que je n'ai besoin que de la partie entière.
il semble que vba a rapidement des limites!
Marsh Posté le 01-03-2006 à 17:23:05
Salut,
Ton problème vient de a(i,1) en Integer. Il faut déclarer ce tableau en Single ou en Double (de préférence) compte tenu des calculs effectués avec des nombres réels.
|
Cette procédure accepte des entrées de plusieurs milliards sans sourciller.
A+
Horatio
Marsh Posté le 01-03-2006 à 18:11:16
MERCI BIEN
effectivement ça marche, j'ai déclaré comme single a(i,1) et aucun problème. très fort!
par contre j'ai pas compris pourquoi!
enfin, je continue....
Marsh Posté le 01-03-2006 à 22:02:32
Re bonsoir,
Pas facile d'expliquer pourquoi...
Il semble que VB, faute d'élément explicite dans un calcul, travaille en Integer.
Par exemple, ceci ne passe pas :
MsgBox 150 * 250
parce que le résultat dépasse 32000 !
en revanche ceci passe très bien :
MsgBox 150& * 250
Car on lui indique un élément de type long dans l'opération.
C'est un piège dans lequel on tombe tous un jour ou l'autre.
A+
Horatio
Marsh Posté le 03-03-2006 à 10:50:36
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 |
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 |
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 |
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 |
J'espère avoir été clair, même si non exhaustif
Marsh Posté le 01-03-2006 à 11:53:26
Bonjour a tous,
j'ai un depassement de capacité sur un nombre. J'ai essayé un format long, variant, double etc mais j'ai tjs le meme probleme.
j'obteins un chiffre a virgule, mais je n'ai pas besoin des virgules. j'ai donc mis int (x) et declare en integer
mais toujours le meme probleme.
comment sans sortir, sous excel cela fct bien pourquoi pas en vba ?
merci pour soutien