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

Macros et VBA Excel Discussion :

Entier plus long que les entiers longs, quel type utilise Excel ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut Entier plus long que les entiers longs, quel type utilise Excel ?
    Bonjour à toutes et tous et merci de votre temps et de votre aide.

    J'ai un fichier Excel qui récupère des numéros d'éléments. Un numéro d'élément est un entier séquentiel assigné par le système source sur lequel je n'ai pas le contrôle. Je pense qu'il peut comporter jusqu'à 16 chiffres.
    Ayant, par erreur, négligé ce détail j'ai typé mes variables qui manipulent ces numéros en Long (entier long) et je viens d'avoir un dépassement de capacité sur un des mes numéros :-(.

    J'ai regardé parmi les types disponibles en VBA pour Excel 2010 et je n'ai sauf erreur pas de type entier plus grand que les Long.

    Mais Excel lui est capable d'accepter dans ses cellules des entiers à 16 chiffres. Donc ma question est quel type utilise-t'il ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par marot_r Voir le message
    J'ai un fichier Excel qui récupère des numéros d'éléments. Un numéro d'élément est un entier séquentiel assigné par le système source sur lequel je n'ai pas le contrôle. Je pense qu'il peut comporter jusqu'à 16 chiffres.
    S'il s'agit simplement d'un code (c'est-à-dire s'il n'y a pas à faire dessus d'opération ou d'inégalité), le plus simple serait d'utiliser une variable de type String.

    Un code qui ne contient que des chiffre (comme un numéro de téléphone, de compte en banque ou de sécurité sociale) reste une chaine de caractères et non un nombre et doit être traité comme tel.


    Pour répondre à ta question, il existe le type LongLong mais il n'est utilisable que par les système 64 bit et je ne suis pas sûr qu'il soit utilisable en VBA Excel.
    https://docs.microsoft.com/fr-fr/off...long-data-type

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour.

    Pour des raisons de tri il faut que si j'ai 1, 2, 10 et 100 après le tri je n'ai pas 1, 10, 100 et 2.
    Si je passe par un chaîne de caractères en interne, il n'y pas de risque que Excel change le type de ma donnée ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Citation Envoyé par marot_r Voir le message
    J'ai un fichier Excel qui récupère des numéros d'éléments. Un numéro d'élément est un entier séquentiel assigné par le système source sur lequel je n'ai pas le contrôle. Je pense qu'il peut comporter jusqu'à 16 chiffres.
    [...]
    Mais Excel lui est capable d'accepter dans ses cellules des entiers à 16 chiffres. Donc ma question est quel type utilise-t'il ?
    Tout d'abord, Excel n'accepte que 15 chiffres significatifs (et pas 16) pour représenter les nombres. Si on utilise un format nombre de plus de quinze chiffres, les chiffres à partir du 16ème sont à 0.
    Cependant, tous les nombres (entiers ou pas) saisis (ou calculés) dans des cellules sont stockés au format Double.
    Si tes numéros comportent plus de 15 chiffres, pour pouvoir conserver tous les chiffres, tu est obligé de les stocker sous forme de chaine, sinon tu auras des pertes.
    Pour le tri, il faut développer une procédure spécifique.
    J'ai des procédures pour faire les 4 opérations élémentaires sur des [très] grands nombres exprimés en String mais pas pour le tri (j'en avais pas besoin).

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour.

    Merci Patrice740, le 16 est un estimé on devrait être correct avec 15 pour un petit bout de temps.
    Pas besoin de sortir la grosse artillerie.
    Je vais remplacer mes long par des double.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    À mon avis c'est 15 chiffres parce qu'ils sont codés su 2 octets et qu'ils gardent 1 bit pour signe moins.

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Pour des raisons de tri il faut que si j'ai 1, 2, 10 et 100 après le tri je n'ai pas 1, 10, 100 et 2.
    Raison de plus.
    Avec des nombres, tu ne pourras pas obtenir un tel tri : le 2 viendra se mettre entre 1 et 10.

    Par contre, avec des String, c'est possible, à condition d'ajouter le paramètre DataOption1:=xlSortNormal à la méthode Sort.
    https://docs.microsoft.com/fr-fr/off...cel.range.sort
    https://docs.microsoft.com/fr-fr/off...sortdataoption

    Crois-moi, j'ai déjà donné : "Code = String", ça t'évite bien des migraines et des nuits blanches.

    Si je passe par un chaîne de caractères en interne, il n'y pas de risque que Excel change le type de ma donnée ?
    Il suffira de mettre les cellule au format de nombre "Texte".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").NumberFormat = "@"
    https://msdn.microsoft.com/fr-fr/lib...1(v=office.15)
    https://support.office.com/fr-fr/art...rs=fr-FR&ad=FR

    Et du coup, tu n'as plus besoin de te préoccuper de savoir si la limite est 15 ou 16 chiffres (Patrice740 a raison, c'est 15) : si je ne me trompe pas, la limite d'un String en tant que variable, c'est 2 milliards de caractères.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour à tous,

    tu as aussi CDec qui a une mantisse de 27 chiffres.
    Au moins en interne à VBA tu auras la valeur exacte si besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
        Dim a, s As String
        s = "123456789012345678901234567"
        a = CDec(s)
        Debug.Print a
        [A1] = a 'perte de précision, conversion en Double
    End Sub
    eric

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour le fil,

    Citation Envoyé par clementmarcotte Voir le message
    À mon avis c'est 15 chiffres parce qu'ils sont codés su 2 octets et qu'ils gardent 1 bit pour signe moins.
    Dans les cellules tous les nombres sont codés en Double (i.e. en virgule flottante en double précision sur 8 octets).
    C'est dans ce format que la mantisse est limitée à 15 chiffres significatifs donc, aussi pour les nombres entiers (dont l'exposant est nul).

    Comme dit Eric, en interne VBA on peut obtenir une précision supérieure à Long (ex. CDec) mais pas dans les cellules.
    Dès qu'un nombre de plus de 15 chiffres significatifs doit être mis dans une cellule il faut utiliser un format texte (String).

    Mais pour marot_r, il semble que le passage d'un entier Long (10 chiffres max) à un entier Double (15 chiffres max) soit suffisant.

  10. #10
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    bonjour,
    si je formate en "000001" le tri ce fait correctement!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Format(String(25, "1"), String(30, "0"))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Set dicohDesc = CreateObject("System.Collections.SortedList")
    For i = 10 To 1 Step -1
        dicohDesc(Format(CStr(i) + 5, String(30, "0"))) = Chr(64 + i)
    Next
    Dim v()
    ReDim v(dicohDesc.Count - 1)
    For i = 0 To dicohDesc.Count - 1
        v(i) = dicohDesc.GetByIndex(i)
    Next
     
    Debug.Print dicohDesc("000000000000000000000000000015")
    End Sub

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour.

    Et merci de vos contributions. Je ne connaissais pas CDec(), ça veut dire qu'il y a un type Decimal non documenté en VBA ?

    Je ne veux pas de 0 devant mon numéro, l'utilisateur ne s'y attend pas et ma source n'en comporte pas.

    Citation Envoyé par Menhir
    Avec des nombres, tu ne pourras pas obtenir un tel tri : le 2 viendra se mettre entre 1 et 10.
    Et c'est exactement ce que je veux. Je ne souhaites pas du tout avoir un tri alphabétique sur des nombres.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Re,
    Citation Envoyé par marot_r Voir le message
    Je ne connaissais pas CDec(), ça veut dire qu'il y a un type Decimal non documenté en VBA ?
    On ne peut pas déclarer une variable de type Décimal mais le type existe et est crée sur un Variant par CDec().
    https://docs.microsoft.com/fr-fr/off...imal-data-type

  13. #13
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Et c'est exactement ce que je veux. Je ne souhaites pas du tout avoir un tri alphabétique sur des nombres.
    Je n'avais pas vu le "ne ... pas" dans ta phrase.

    Dans ce cas, avec des String, il faut utiliser l'option DataOption1:=xlSortTextAsNumbers pour la méthode Sort.
    Tes String seront classés comme s'il s'agissait de nombres : 1, 2, 10, 20, 100, etc.

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

Discussions similaires

  1. Google Wave va intégrer un outil plus puissant que les Google Docs
    Par Gordon Fowler dans le forum Actualités
    Réponses: 56
    Dernier message: 07/12/2009, 11h55
  2. Les versions 64-bits de Windows plus sûres que les 32-bits ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 9
    Dernier message: 23/11/2009, 20h45
  3. Réponses: 2
    Dernier message: 07/08/2009, 12h42
  4. Réponses: 1
    Dernier message: 31/01/2007, 11h49

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