depassement de capacité

depassement de capacité - VB/VBA/VBS - Programmation

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
 

Reply

Marsh Posté le 01-03-2006 à 11:53:26   

Reply

Marsh Posté le 01-03-2006 à 13:54:59    

:hello:  
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 ?
 :)

Reply

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!

Reply

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.


Sub Calcul()
Dim Dia_fonte As Long
Dim a() As Double
ReDim a(1, 1)
a(1, 1) = 78524
Dia_fonte = Int(((((1.601 * (a(1, 1) / 3600) ^ 1.975) / (1.28 * 10)) ^ (1 / 5.25)) * 1000) * 0.8)
MsgBox Dia_fonte
End Sub


Cette procédure accepte des entrées de plusieurs milliards sans sourciller.
A+
Horatio


Message édité par Lord Nelson le 01-03-2006 à 17:23:35
Reply

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....

Reply

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

Reply

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    
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
Reply

Marsh Posté le 08-03-2006 à 09:38:36    

un grand merci pour toutes ces explications

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed