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 :

Une bizarrerie de VBA Excel 2007


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Administration et finances
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administration et finances
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut Une bizarrerie de VBA Excel 2007
    Dans un module VBA (Excel 2007), j'ai voulu utiliser la fonction Val pour convertir un texte en nombre. Tout allait bien jusqu'à ce que j'envoie à cette fonction un paramètre du type :
    nombre1 & "d" & nombre2
    En principe, la fonction Val(nombre1 & "d" & nombre2) devait tout simplement retourner nombre1. Au lieu de cela, elle a renvoyé nombre1 * 10 ^ nombre2

    Voici le code utilisé dans un module VBA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function retVal(v As String) As Double
    retVal = Val(v)
    End Function
    Avec la saisie dans la feuille Excel de
    =retVal("77d8")

    avec nombre1 = 77 et nombre2 =8
    je m'attendais à avoir comme résultat : 77

    mais j'ai obtenu : 7 700 000 000

    ou, selon le format des nombres de la cellule : 77 E+8
    autrement dit : 77 * 10 puissance 8

    La lettre "d" dans ce cas représente-t-elle un caractère spécial ?
    Y a-t-il une explication à cela ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    La lettre "d" dans ce cas représente-t-elle un caractère spécial ?
    Bonjour,
    Oui, c'est le nombre de 0 (zéro) qui va être ajouté.
    77d2 donnera 7700
    77d0 donnera 77
    77d3 donnera 77000

    Pour pallier vous pouvez faire un code comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function retVal(v As String) As Double
    Dim i&
    Dim A$
    '---
    For i& = 1 To Len(v)
      If IsNumeric(Mid(v, i&, 1)) Then
        A$ = A$ & Mid(v, i&, 1)
      Else
        Exit For
      End If
    Next i&
    If Len(A$) > 0 Then retVal = CDbl(A$)
    End Function

  3. #3
    Membre confirmé
    Profil pro
    Administration et finances
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administration et finances
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    Merci PMO2017 pour la réponse.
    En fait, je voulais savoir si ce "caractère spécial" était documenté par Microsoft.
    Pour ce qui est de la solution pour contourner le problème, j'ai utilisé dans une variante la fonction Replace et dans l'autre la fonction Instr
    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
     
    'utilisation de la fonction Replace
    'en espérant que la lettre "a" n'est pas un autre caractère spécial
    Function retVal(v As String) As Double
        Dim strV As String
        strV = Replace(UCase(v), "D", "a")
        retVal = CDbl(Val(strV))
    End Function
     
    'utilisation de la fonction Instr
    Function retVal2(v As String) As Double
        Dim c As Long
        Dim strV As String
        c = InStr(UCase(v), "D")
        strV = IIf(c > 0, Left(v, c - 1), v)
        retVal2 = CDbl(Val(strV))
    End Function

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Jouad
    Pour ce qui est de la solution pour contourner le problème, j'ai utilisé dans une variante la fonction Replace et dans l'autre la fonction Instr
    Je ne veux pas te démolir le moral, mais regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Val("8E2") & vbCrLf & Val("8d2") & vbCrLf & Val("&H320") & vbCrLf & Val("&o1440")
    Il ne faut tout simplement pas abuser de la très (trop) grande tolérance de la fonction Val de VB. Et savoir déterminer avec précision ce que l'on attend d'elle, en fonction de ce que l'on veut très précisément traiter et (surtout) du contexte.
    EDIT : traduire "tolérance" par "élasticité".
    Il y aurait du avoir DEUX fonctions : l'une pour retourner la valeur décimale de toute expression (quelle qu'en fût la notation) numérique, l'autre pour ne retourner que la valeur de la chaîne précédant tout caractère non numérique.

  5. #5
    Membre confirmé
    Profil pro
    Administration et finances
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administration et finances
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    Bonjour unparia,
    Merci pour les précisions.

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

Discussions similaires

  1. VBA Excel 2007 - Insertion d'images avec Enregistreur de Macros
    Par PhilC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/10/2007, 02h05
  2. Additionner une colone en VBA Excel
    Par lafrot dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/10/2007, 15h39
  3. ruban excel avec lien sur une feuille du classeur excel 2007
    Par corbisier dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/09/2007, 15h00
  4. programmer une tâche via VBA/Excel
    Par simstef dans le forum Excel
    Réponses: 5
    Dernier message: 07/08/2007, 15h53
  5. documentation pour une formation au vba excel version 2000
    Par zobusfr dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2007, 19h17

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