Y a-t-il une longueur maximale de ligne lors de l'ajout de nombres dans VBA? Par exemple dans MS Access:
Dim L As Long ' this works L = 2696 + 2630 + 2860 + 2860 + 2860 + 2860 + 2795 + 2795 + 2630 + 2630 + 2630 + 263 ' this gives an Overflow error L = 2696 + 2630 + 2860 + 2860 + 2860 + 2860 + 2795 + 2795 + 2630 + 2630 + 2630 + 2630 Debug.Print L
Je n'ai jamais vu cela documenté. De plus, cela ne génère pas d'erreur de débordement en C # dans Visual Studio.
3 Réponses :
Vous devez utiliser le type littéral:
Sub SSS() Dim sum As Variant, arr As Variant, num As Variant arr = Array(2696, 2630, 2860, 2860, 2860, 2860, _ 2795, 2795, 2630, 2630, 2630, 2630) For Each num In arr '// sum is Integer before last addition '// and Long - after it sum = sum + num Next MsgBox TypeName(sum) '//Long End Sub
UPDATE
Il est intéressant de noter que si vous déclarez votre variable somme comme Variante
, puis la conversion en Long
se fait automatiquement. Par exemple, dans le code suivant, la variable sum
est Integer
avant le dernier ajout - après cela, elle est de type Long
:
Sub FFF() Dim L As Long Dim V As Variant ' this works L = 2696 + 2630 + 2860 + 2860 + 2860 + 2860 + 2795 + 2795 + 2630 + 2630 + 2630 + 263 ' this DOES NOT give an Overflow error V = 2696& + 2630& + 2860& + 2860& + 2860& + 2860& + _ 2795& + 2795& + 2630& + 2630& + 2630& + 2630& MsgBox TypeName(V) '//Long End Sub
Intéressant, je n'ai jamais réalisé que VB interprétait d'abord chaque nombre comme un entier, puis essayait de les stocker comme un long. Logique. Je me souviens avoir lu quelque part, il y a longtemps, il n'y a plus de sens à utiliser des entiers réguliers dans VB parce que les tripes internes du processeur Intel doivent toujours convertir des entiers 16 bits en entiers longs 32 bits pour faire des mathématiques de toute façon, alors déclarez-les comme Integer au lieu de Long ne vaut pas la peine d'être dérangé. J'ai donc toujours déclaré tous les entiers comme Long depuis lors.
@BrianBattles J'ai mis à jour la réponse avec d'autres détails. Mais je me demande quel est le cas d'utilisation d'un tel ajout? :)
Salut Johny ... Je ne sais pas, je viens de le trouver dans un code hérité dans une application MS Access où je travaille et je me demande pourquoi cela a généré cette erreur
@BrianBattles je vois 😉
Vous devez spécifier le type de l'un des éléments de l'expression, VBA doit alors utiliser ce type. Je pense que les nombres entiers littéraux sont implicitement des nombres entiers (16 bits), cela pourrait être faux.
Donc quelque chose comme ça
Dim L As Long L = CLng(2696) + 2630 + 2860 + 2860 + 2860 + 2860 + 2795 + 2795 + 2630 + 2630 + 2630 + 2630 Debug.Print L, TypeName(L)
Ou cela fonctionnerait
Dim L As Long L = 2696& + 2630 + 2860 + 2860 + 2860 + 2860 + 2795 + 2795 + 2630 + 2630 + 2630 + 2630 Debug.Print L, TypeName(L)
Le type d'un littéral entier est un Integer
(Max +32767):
L = 2696& + 2630 + ..
Le résultat de l'ajout de n Integer
s est également de type Integer
:
?typename(2696 + 2630) Integer
Dès que l'accumulation dépasse les limites d'un Integer
, vous obtiendrez une exception de débordement, peu importe que la variable que vous attribuez est un Long
car l'accumulation est effectuée avant l'affectation.
La façon de résoudre ce problème est de faire de l'une des valeurs de l'addition un Long
que vous pouvez facilement faire avec le suffixe de type &
:
?typename(2696) Integer
C # et Visual Studio n'ont rien à voir avec VBA.
Les ajouts utilisent des nombres entiers (c'est-à-dire en ajoutant des entiers avant l'assignation au long), évitez cela en convertissant l'une des valeurs en long:
L = 2696 & + 2630 + ... code >
Notez que dans VB.Net, un int est de 32 bits contrairement à VBA / 6 où ils sont de 16 bits.
Vous vous demandez si cela est documenté quelque part
Eh bien, tout nombre entier littéral <32768 est de type entier, donc lorsque vous ajoutez ces nombres, le résultat devra également tenir dans un entier. Je ne sais pas si cela est documenté quelque part, les types de littéraux sont définis ici: msdn.microsoft .com / fr-fr / library / ee199514.aspx
Une Erreur de débordement est autre chose qu'une erreur Ligne trop longue . Le premier signifie qu'un résultat ne rentre pas dans la variable de gauche, le second serait déjà capturé avant que le code ne s'exécute réellement par l'interpréteur.