Page 1 sur 1

Formater un numérique

MessagePublié: 28 Mars 2006 à 20:32
par Michael DELIQUE
il est des cas ou l'on a besoin d'un formatage bien précis, voici une fonction qui permet de le faire

Code : Tout sélectionner
Public Function FormatNumerique(wValeur As String,wFormat As String) As String
   
   'cette fonction format le numérique
   'wValeur est la valeur à formater
   'wFormat est le format à appliquer
   'ex 5V.4S-   => 5 chiffre avant la virgule, 4 chiffre apres la virgule, la vigule est un point le séparateur de millier est le tiret
   
   'Déclaration des Variables   
   Dim AvantVirgule As String
   Dim ApresVirgule As String
   Dim Valeur2 As String
   Dim Separator1000 As String
   Dim Virgule As String
   Dim VirguleOrigine As String
   Dim nbTaille As Integer
   Dim nbAvantVirgule As Integer
   Dim nbApresVirgule As Integer
   Dim i As Long
   Dim J As Long
   Dim nbValue As Integer
   
   On Error Goto ErreurFormatNumerique
   
   If Trim(wValeur) ="" Then
      FormatNumerique = ""
      Exit Function
   End If
   
   If Trim(wFormat) ="" Then
      FormatNumerique = wValeur
      Exit Function
   End If   
   
   'récupération des différente information du format passer en paramêtre
   nbAvantVirgule = Cint(Strleft(wFormat,"V"))
   If wFormat Like "*S*" Then
      Valeur2 = Strleft(Strright(wFormat,"V"),"S")
      If Left(Valeur2 ,1) Like "*[0-9]*" Then
         virgule = ""
      Else
         virgule = Left(Valeur2 ,1)
         Valeur2 = Right(Valeur2,Len(Valeur2)-1)
      End If
     
      nbApresVirgule = Cint(Valeur2)
      Separator1000 = Strright(wFormat,"S")
   Else
      Valeur2 = Strright(wFormat,"V")
      If Left(Valeur2 ,1) Like "*[0-9]*" Then
         virgule = ""
      Else
         virgule = Left(Valeur2 ,1)
         Valeur2 = Right(Valeur2,Len(Valeur2)-1)
      End If
      nbApresVirgule = Cint(Valeur2)
      Separator1000 = ""
   End If
   
   Valeur2 = ""
'   Valeur2 = wValeur
   
   'renvoi un nombre uniquement formé de chiffre avec juste le séparateur de décimal d'origine
   'est considére comme séparateur de décimal le premié point ou virgule trouvé lorsque l'on explore le nombre de droite à gauche
   For i = Len(wValeur) To 1 Step -1
      If Mid(wValeur , i,1) Like "*[0-9]*" Then
         Valeur2 = Mid(wValeur , i,1)+Valeur2
      Else   
         If Trim(VirguleOrigine) = "" Then
            Select Case Mid(wValeur , i,1)
            Case ".",","               
               VirguleOrigine = Mid(wValeur , i,1)
               Valeur2 = Mid(wValeur , i,1)+Valeur2
            Case Else
               VirguleOrigine = "PAS DE VIRGULE"
            End Select
         End If
      End If
   Next
   
   
   AvantVirgule  = ""
   nbTaille = Len(Valeur2)
   i = 0
   nbValue = True
   
   'met au format les chiffre avant la virgule
   While nbValue = True
     
      If Left(Valeur2 ,1) Like "*[0-9]*" Then
         AvantVirgule = AvantVirgule+Left(Valeur2,1)
         Valeur2 = Right(Valeur2,Len(Valeur2)-1)
      Else
         nbValue = False
      End If
     
      i = i + 1   
     
      If i>nbTaille  Then
         nbValue = False
      End If
   Wend
   
   Valeur2 =  ""
   i = 0
   
   'insere le séparateur de millier si nécessaire
   If Separator1000<>"" Then
      Valeur2 = AvantVirgule
      nbTaille = Len(AvantVirgule)
      AvantVirgule = ""
      J = 0
      While i<nbTaille
         J = J+1
         AvantVirgule = Right(Valeur2,1)+AvantVirgule
         Valeur2 = Left(Valeur2,Len(Valeur2)-1)
         If J = 3 Then
            J = 0
            AvantVirgule = Separator1000+AvantVirgule
         End If
         i =i+1
         
      Wend
     
   End If
   
   'si le chiffre avant la virgule est plus long que la taille passé en paramêtre, c'est indiqué par un # en fin de chiffre
   If  nbAvantVirgule > 0 Then
      If Len(AvantVirgule) > nbAvantVirgule Then
         AvantVirgule = Left(AvantVirgule,nbAvantVirgule-1)+"#"
      Else
         AvantVirgule = Complete_LS(AvantVirgule,"G","0",nbAvantVirgule)
      End If
   End If
   
   ApresVirgule  = ""
   
   'mise au format pour les chiffres apres la virgule
   Valeur2 = wValeur
   nbTaille = Len(wValeur)
   i = 0
   nbValue = True
   While nbValue = True
     
      If Right(Valeur2 ,1) Like "*[0-9]*" Then
         ApresVirgule = Right(Valeur2,1)+ApresVirgule
         Valeur2 = Left(Valeur2,Len(Valeur2)-1)
      Else
         nbValue = False
      End If
     
      i = i + 1   
     
      If i>nbTaille  Then
         nbValue = False
      End If
   Wend
   
   Valeur2 = ""
   
   i = 0
   
   If nbApresVirgule > 0 Then
      If Len(ApresVirgule) > nbApresVirgule Then
         ApresVirgule = Right(ApresVirgule,nbApresVirgule)
      Else
         ApresVirgule = Complete_LS(ApresVirgule,"D","0",nbApresVirgule)
      End If
   End If
   
   FormatNumerique = AvantVirgule+virgule+ApresVirgule
   
   Exit Function
ErreurFormatNumerique:
   Msgbox "(FormatNumerique)"+Chr(10)+"Erreur " + Str(Err) + " : " + Cstr(Error)+Chr(10)+"Ligne N° "+Cstr(Erl),16, " ERREUR !"
   FormatNumerique = ""
   Exit Function
End Function


Code : Tout sélectionner
Function Complete_LS(Byval wValeur As String, Byval wSens As String,Byval wChar As String, Byval wnbTaille As Long) As String
   
   'cette fonction permet de compléter une chaine de caratecre
   'wValeur = valeur a compléter
   'wSens = complétéer a gauche ou a droite
   ' wChar = Caratere a rajouter pour compléter
   'wnbTaille = nombre de caratere a renvoyer
   
   'Déclaration des Variables   
   Dim ValeurTempo As String
   
   On Error Goto ErreurComplete_LS
   
   If wChar = "" Then
      Complete_LS = wValeur
      Exit Function
   End If   
   
   If wnbTaille = 0 Then
      Complete_LS = wValeur
      Exit Function
   Else
      If Len(wValeur) >= wnbTaille Then
         Complete_LS = wValeur
         Exit Function
      End If
   End If
   
   ValeurTempo = wValeur
   
   While Len(ValeurTempo) < wnbTaille
      Select Case Ucase(Trim(wSens))
      Case "GAUCHE","G","LEFT","L"
         ValeurTempo = wChar+ValeurTempo
      Case "DROITE","D","RIGHT","R"
         ValeurTempo = ValeurTempo+wChar
      Case Else
         Complete_LS = wValeur
         Exit Function
      End Select
   Wend
   
   Complete_LS = ValeurTempo
   ValeurTempo = ""
   
   Exit Function
ErreurComplete_LS:
   Msgbox "(Complete_LS) Erreur " + Str(Err) + " : "+Chr(10) + Cstr(Error)+". "+Chr(10)+"Ligne N° "+Cstr(Erl),16," ERREUR !"
   Complete_LS = ""
   Exit Function
End Function