Fonction valeur plus efficace que la fonction val de visual basic.

Contenu du snippet

Code à insérer dans un module

Source / Exemple :


'La fonction Val arrête la lecture de la chaîne au premier caractère ne faisant apparemment 
'pas partie d'un nombre. Les symboles et caractères fréquemment associés aux valeurs numériques,
'comme le signe $ et les virgules ne sont pas reconnus. En revanche, la fonction reconnaît les 
'préfixes &O (pour octal) et &H (pour hexadécimal). Les espaces, les tabulations et les 
'caractères de saut de ligne ne sont pas pris en compte dans l'argument.
'Dans l'exemple suivant, la fonction renvoie la valeur 161517 :
'Val("    1615 17e siècle")
'La fonction Valeur ci dessous permet de convertir en nombre des chaines sous la forme 
'Valeur("  -  1615.36 e +17 Siecle") = -1615,36E17
'Elle reconnait également le séparateur décimal défini dans le panneau de configuration

Public Function Valeur(ByVal Nombre As Variant) As Double
   Dim NombreNegatif, NombreDefini As Boolean
   Dim MantisseNegative, MantisseDefinie As Boolean
   Dim Resultat As String
   Dim Mantisse As String
   Dim Chiffre As String
   Dim Position As Integer
   Dim SeparateurDecimal As String
   Dim NombreDecimal As Single

   If IsNumeric(Nombre) Then Valeur = Nombre: Exit Function
   If Nombre = "" Then Valeur = 0: Exit Function

   'Definition du séparateur décimal défini dans le panneau de configuration
   NombreDecimal = Val("1.1")
   SeparateurDecimal = Mid(NombreDecimal, 2, 1)
      
      Resultat = ""
      Mantisse = ""
      NombreNegatif = False
      Position = 1
      Chiffre = Mid(Nombre, Position, 1)
      Do While InChaine("0123456789.,-+E " & SeparateurDecimal, Chiffre)
         Select Case Chiffre
           Case "."
                If InChaine(Resultat, SeparateurDecimal) Then
                   Exit Do
                ElseIf InChaine(Resultat, "E") Then
                   Exit Do
                Else
                   Resultat = Resultat & SeparateurDecimal
                End If
           Case ","
                If InChaine(Resultat, SeparateurDecimal) Then
                   Exit Do
                ElseIf InChaine(Resultat, "E") Then
                   Exit Do
                Else
                   Resultat = Resultat & SeparateurDecimal
                End If
           Case "E", "e"
                If InChaine(Resultat, "E") Then
                   Exit Do
                Else
                   Resultat = Resultat & "E"
                   MantisseNegative = False
                   MantisseDefinie = False
                End If
           Case "+"
                If InChaine(Resultat, "E") Then
                   If MantisseDefinie Then Exit Do
                Else
                   If NombreDefini Then Exit Do
                End If
           Case "-"
                If InChaine(Resultat, "E") Then
                   If MantisseDefinie Then
                      Exit Do
                   Else
                      MantisseNegative = Not MantisseNegative
                   End If
                Else
                   If NombreDefini Then
                      Exit Do
                   Else
                      NombreNegatif = Not NombreNegatif
                   End If
                End If
           Case "0" To "9"
                If InChaine(Resultat, "E") Then
                      MantisseDefinie = True
                      Mantisse = Mantisse & Chiffre
                Else
                      NombreDefini = True
                      Resultat = Resultat & Chiffre
                End If
         End Select
         If Position = Len(Nombre) Then
            Exit Do
         Else
            Position = Position + 1
            Chiffre = Mid(Nombre, Position, 1)
         End If
      Loop
      If Resultat = "" Then Valeur = 0: Exit Function
      If NombreDefini Then
         If MantisseDefinie Then
            If MantisseNegative Then Mantisse = "-" & Mantisse
            Resultat = Resultat & Mantisse
         ElseIf InChaine(Resultat, "E") Then
            Resultat = Left(Resultat, Len(Resultat) - 1)
         End If
         If NombreNegatif Then Resultat = "-" & Resultat
         Valeur = Resultat
      Else
         Valeur = 0
      End If
End Function 

Public Function InChaine(ByVal ChaineContenante As String, ByVal Chaine As String) _
                           As Boolean
     If InStrC(ChaineContenante, Chaine) <> 0 Then
        InChaine = True
     Else
        InChaine = False
     End If
End Function

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.