3
votes

Longueur maximale de la ligne d'ajout dans VBA

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.


6 commentaires

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


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.


3 Réponses :


2
votes

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


4 commentaires

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 😉



2
votes

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)


0 commentaires

5
votes

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


0 commentaires