> Tous les forums > Forum Bureautique
 Erreur n°6 (Overflow) dans fonction VBASujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
Loris
  Posté le 24/11/2008 @ 11:54 
Aller en bas de la page 
Petit astucien

Bonjour,

Je suis confronté à un problème que j'ai règlé par le biais d'une fonction en VBA. Voici les détails:

A. Problème initial sur la base d'un exemple simplifié
Le fichier annexé (http://cjoint.com/?lylTRXOuZb) contient deux colonnes:
- la colonne A contient trois montants dont le total figure en ligne 5. Cette colonne contient des valeurs détaillées à l'unité que l'on ne souhaite pas afficher pour le lecteur/l'utilisateur final;
- la colonne B contient les mêmes montants ayant été arrondis au millier. Le contenu de cette colonne est affiché.
Or, le total affiché pour la 2ème colonne est de 4 alors qu'il devrait être de 3 si l'on s'en réfère au contenu des cellules B2 à B4.

B. Solution envisagée
Afin de résoudre le problème décrit ci-dessus, j'ai écris la fonction suivante afin de l'utiliser comme formule dans ma feuille Excel (i.e. dans la cellule B5 de mon exemple):

[Code - Début]
Function getRoundedSum(rngFigures As Range, strRndType As String) As Integer

Dim i As Integer
Dim lngTotal As Long
Dim strSubPgm, strFormat As String
Dim varFiguresArray() As Variant

On Error GoTo ErrorHandler

strSubPgm = "Function 'getRoundedSum()'"
getRoundedSum = 0
lngTotal = 0

varFiguresArray() = rngFigures.Value
For i = 1 To UBound(varFiguresArray)
Select Case UCase(strRndType)
Case "T"
strFormat = "#,##0,"
Case "M"
strFormat = "#,##0,,"
Case Else
Exit Function
End Select
lngTotal = lngTotal + Format(CLng(varFiguresArray(i, 1)), strFormat)
Next i
getRoundedSum = lngTotal


ErrorHandler:
Call handleErrors(Err.Number, Err.Description, strSubPgm)

End Function
[Code - Fin]

Cette formule fonctionne parfaitement bien pour autant que le total final retourné dans la feuille Excel soit inférieur à 32'768, ce qui (est-ce un hasard...?) correspond à 2 puissance 15 (2^15). Le cas échéant (i.e. total étant supérieur ou égal à 32'768), l'erreur n° 6 (Overflow) est générée.

Quelqu'un a-t-il une explication et une piste que je puisse suivre afin de résoudre ce problème "d'Overflow"? D'avance merci pour vos commentaires et votre aide!

Meilleures salutations.

Publicité
Bérylion
 Posté le 24/11/2008 à 13:30 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Salut

c'est pas un hasard et c'est normal.

tu déclares ta fonction comme "entier" :

Function getRoundedSum(rngFigures As Range, strRndType As String) As Integer

l'espace de stockage de ta variable getRoundedSum est limité à 2 octets (=16 bits)

tu ne peux donc pas dépasser ±(2^15)-1 valeurs soit entre -32 768 et 32 767.

en déclarant ta function comme Long ce qui lui réserve 4 octets soit ±(2^31)-1 possibilités (entre -2 147 483 648 et 2 147 483 647), tu devrais pouvoir t'en sortir...

Loris
 Posté le 24/11/2008 à 14:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Salut Bérylion,

Merci beaucoup pour la réponse super-rapide et très claire! Après le changement de type à Long, cela fonctionne effectivement à merveille. Je suis quelque peu honteux de ne pas avoir décelé la source de mon problème par mes propres moyens. Comme quoi: lorsqu'on analyse quelque chose pendant trop longtemps, on ne remarque plus les éléments les plus évidents. Mille mercis encore!

Meilleures salutations.

Bérylion
 Posté le 24/11/2008 à 14:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Loris a écrit :

lorsqu'on analyse quelque chose pendant trop longtemps, on ne remarque plus...

... la 1ere ligne.

ça m'arrive souvent aussi !!

Bérylion
 Posté le 24/11/2008 à 21:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

re-

j'ai pas creuser trop profond dans ta fonction, mais en ré-ouvrant le cjoint (ça me taraude depuis le ), tu pourrais pas t'en sortir avec une vieille formule genre {=SOMME(PLANCHER((A2:A4+500)/1000;1))} ?

(enfin, sur l'exemple simplifié ça fonctionne...)

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
fonction LIGNE provoque une erreur dans SOMMEPROD
Excell 2007: erreur dans formule
Calculer date en fonction d'une valeur dans une plage de cellules
Message d'erreur dans Outlook 2007
Message d'erreur windows dans office 2003
Macro introuvable / Erreur de compilation dans le module caché
Recherche d'une fonction dans EXCEL
interdire une valeur dans une cellule en fonction d'une autre cellu
Resolution message d'erreur dans formules
erreur dans une formule
Plus de sujets relatifs à Erreur n°6 (Overflow) dans fonction VBA
 > Tous les forums > Forum Bureautique