IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

[2013 - 64 bit] Dépassement de capacité


Sujet :

VBA

  1. #1
    Invité
    Invité(e)
    Par défaut [2013 - 64 bit] Dépassement de capacité
    Bonjour,

    Suite à une question posé sur le forum, j'ai posté une réponse (qui n'était pas la bonne d'ailleurs).
    Dans la macro réponse, j'ai fais face à un dépassement de capacité qui a lieu lorsque le résultat d'une multiplication est supérieur à 32767 soit le Max d'un Integer.
    Voici 2 exemples, le 1er (CouleurAléatoire) sans erreur, l'autre (CouleurAléatoireV2) avec erreur code 6:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub TestFonction()
        Dim R8 As Byte, V8 As Byte, B8 As Byte, RVB24 As Long
        RVB24 = CouleurAléatoire
        RVB24 = CouleurAléatoireV2
    End Sub
     
    'Fonction permettant de sortir 3 valeurs ByRef (Byte) RVB en 3 x 8 bit et/ou 1 valeur (Long) 1 x 24 bit
    Public Function CouleurAléatoire(Optional ByRef SortieRouge As Byte, Optional ByRef SortieVert As Byte, Optional ByRef SortieBleu As Byte) As Long
       Randomize
       SortieRouge = CByte(Int(Rnd * (255 + 1)))
       SortieVert = CByte(Int(Rnd * (255 + 1)))
       SortieBleu = CByte(Int(Rnd * (255 + 1)))
     
       CouleurAléatoire = (SortieRouge + SortieVert * CLng(256) + SortieBleu * CLng(65536))
    End Function
     
    Public Function CouleurAléatoireV2(Optional ByRef SortieRouge As Byte, Optional ByRef SortieVert As Byte, Optional ByRef SortieBleu As Byte) As Long
       Randomize
       SortieRouge = CByte(Int(Rnd * (255 + 1)))
       SortieVert = CByte(Int(Rnd * (255 + 1)))
       SortieBleu = CByte(Int(Rnd * (255 + 1)))
     
       CouleurAléatoireV2 = SortieRouge + SortieVert * 256 + SortieBleu * 65536
    End Function
    Est-ce que cette erreur est connu et surtout, avez-vous aussi cette erreur où c'est uniquement moi qu'il ai ?

    On dirai que le VBA transtype mal le résultat de SortieVert * 256 comme si le résultat était stocké temporairement dans une variable de type Integer. Le fait de mettre des parenthèses et de forcer le résultat en type long avec Clng(SortieVert * 256) semble ne rien changer dutout.


    P.S.: Je me suis trompé de sous-forum, il aurai fallu poster dans Général VBA plutôt. Si un modérateur pouvait transporter cette discussion dans Général VBA, ça serait pas mal. Merci.
    Dernière modification par Invité ; 13/10/2013 à 11h33.

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    Bonjour,

    Citation Envoyé par Nouveau2 Voir le message
    comme si le résultat était stocké temporairement dans une variable de type Integer.
    Oui c'est ça, il prend le plus "grand" des types utilisés dans chaque opération.

    Et un nombre mis dans le code sans aucune précision est converti soit en Integer, soit en Long.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeName(256) => Integer (car <= 32767)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeName(65536) => Long (car > 32767)
    SortieVert est un Byte, 256 est un Integer => il calcule un Integer
    SortieBleu est un Byte, 65536 est un Long => il calcule un Long

    Il suffit donc de convertir le 256, soit avec CLng, soit avec un & (256&) qui est le suffixe pour un Long.

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour,
    Ah d'accord,

    Merci bien pour cette réponse éclairante . Maintenant, je le serais.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 17/10/2014, 16h08
  2. Transaction, Dépassement de capacité
    Par SkYsO dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 23/12/2008, 14h56
  3. Dépassement de capacité addition 8 bits
    Par hervett dans le forum Assembleur
    Réponses: 2
    Dernier message: 20/04/2007, 13h11
  4. Réponses: 8
    Dernier message: 06/02/2006, 14h34
  5. détection de dépassement de capacité
    Par tut dans le forum C++
    Réponses: 10
    Dernier message: 01/12/2004, 22h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo