Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3111 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  depassement de capacité

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

depassement de capacité

n°1316001
lepap
Posté le 01-03-2006 à 11:53:26  profilanswer
 

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
 

mood
Publicité
Posté le 01-03-2006 à 11:53:26  profilanswer
 

n°1316140
olivthill
Posté le 01-03-2006 à 13:54:59  profilanswer
 

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

n°1316233
lepap
Posté le 01-03-2006 à 15:23:42  profilanswer
 

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!

n°1316366
Lord Nelso​n
Posté le 01-03-2006 à 17:23:05  profilanswer
 

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
n°1316412
lepap
Posté le 01-03-2006 à 18:11:16  profilanswer
 

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

n°1316622
Lord Nelso​n
Posté le 01-03-2006 à 22:02:32  profilanswer
 

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

n°1317612
tegu
Posté le 03-03-2006 à 10:50:36  profilanswer
 

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
n°1320723
lepap
Posté le 08-03-2006 à 09:38:36  profilanswer
 

un grand merci pour toutes ces explications


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  depassement de capacité

 

Sujets relatifs
Réalisation un algoritheme pour capacitéDepassement Quota, activer les Logs Apache
delphi : augmenter la capacité du compilateur[Algo] Ford Fulkerson - Capacité d'un réseau routier
Capacité du VertexProcessing sous DirectX8 et 9Comment detecter un depassement de capacite dans une addition
[résolu] dépassement de capacitéDépassement de capacité incomprehenssible :/
[ACCESS] prob de requète --> dépassement de capacité ?!?!?[VBScript] Problème de dépassement de capacité
Plus de sujets relatifs à : depassement de capacité


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)