Fonction vb6

Fermé
dutche Messages postés 73 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 21 mai 2010 - 22 mai 2008 à 19:46
dutche Messages postés 73 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 21 mai 2010 - 23 mai 2008 à 12:14
Bonjour,

J'ai un souci avec une fonction vb6 que j'ai créer dans crystal report sensée convertir un nombre en lettre.
Mais le problème est que lorsque j'exécute la fonction il ya un bug: pour les nombres <1000 ça fonctionne
mais lorsque le nbre est >1000 ex: 1 000 il me renvoit dix mille, 10 000 il me renvoit cent mille.
Aidez moi à trouver mon erreur.
NB: ce programme fonction bien (en remplaçant tmpBuff = tmpBuff & Milliers(nPosition / 3 ) & " " par tmpBuff = tmpBuff & Milliers(nPosition / 3 +1) & " " ) lorsque je le fais tourner sur Vb.net
voici ma fonction:

Function NbVersTexte(ValNum As Double) As String
Dim Unites(10) As String 'tableau des unités
Dim Dixaines(10) As String 'tableau de dixaines
Dim LesDixaines(10) As String 'tableau des dixaines
Dim Milliers(5) As String 'tableau des millièmes

Dim i As number
Dim nPosition As number 'position du chiffre dans le nombre
Dim ValNb As number 'valeur en nombre de l'extrait de strTemp
Dim LesZeros As Boolean 'le nombre de zero après les nombres
Dim strResultat As String 'valeur de retour de la fonction
Dim strTemp As String 'variable de conservation temporaire du nbre converti en string
Dim tmpBuff As String

Unites(1) = "zero"
Unites(2) = "un"
Unites(3) = "deux"
Unites(4) = "trois"
Unites(5) = "quatre"
Unites(6) = "cinq"
Unites(7) = "six"
Unites(8) = "sept"
Unites(9) = "huit"
Unites(10) = "neuf"

Dixaines(1) = "dix"
Dixaines(2) = "onze"
Dixaines(3) = "douze"
Dixaines(4) = "treize"
Dixaines(5) = "quatorze"
Dixaines(6) = "quinze"
Dixaines(7) = "seize"
Dixaines(8) = "dix-sept"
Dixaines(9) = "dix-huit"
Dixaines(10) = "dix-neuf"

LesDixaines(1) = ""
LesDixaines(2) = "dix"
LesDixaines(3) = "vingt"
LesDixaines(4) = "trente"
LesDixaines(5) = "quarante"
LesDixaines(6) = "cinquante"
LesDixaines(7) = "soixante"
LesDixaines(8) = "soixante-dix"
LesDixaines(9) = "quatre-vingt"
LesDixaines(10) = "quatre-vingt-dix"

Milliers(1) = ""
Milliers(2) = "mille"
Milliers(3) = "million"
Milliers(4) = "millard"
Milliers(5) = "mille"


strTemp = CStr(Int(ValNum))

For i = Len(strTemp) To 1 Step -1
ValNb = Val(Mid(strTemp, i, 1))
'Mid$ renvoie l'extrait de strTemp qui commence au caractère numéro i
'et d'une longueur de 1 caractères
' Val convertit les caractères d'une chaîne en nombre

nPosition = (Len(strTemp) - i) + 1
Select Case (nPosition Mod 3)
Case 1
LesZeros = False
If i = 1 Then
If ValNb >= 1 Then
tmpBuff = Unites(ValNb + 1) & " "
Else
tmpBuff = ""
End If
ElseIf Mid(strTemp, i - 1, 1) = "1" Then
tmpBuff = Dixaines(ValNb + 1) & " "
i = i - 1
ElseIf Mid(strTemp, i - 1, 1) = "9" Then
tmpBuff = LesDixaines(9) & " " & Dixaines(ValNb + 1) & " "
i = i - 1
ElseIf Mid(strTemp, i - 1, 1) = "7" Then
tmpBuff = LesDixaines(7) & " " & Dixaines(ValNb + 1) & " "
i = i - 1
ElseIf ValNb > 0 Then
tmpBuff = Unites(ValNb + 1) & " "
Else
LesZeros = True
If i > 1 Then
If Mid(strTemp, i - 1, 1) <> "0" Then
LesZeros = False
End If
End If
If i > 2 Then
If Mid(strTemp, i - 2, 1) <> "0" Then
LesZeros = False
End If
End If
tmpBuff = ""
End If
If LesZeros = False And nPosition > 1 Then
tmpBuff = tmpBuff & Milliers(nPosition / 3 ) & " "
End If
strResultat = tmpBuff & strResultat
Case 2
If ValNb > 0 Then
strResultat = LesDixaines(ValNb + 1) & " " & strResultat
End If
Case 0
If ValNb > 0 Then
If ValNb > 1 Then
strResultat = Unites(ValNb + 1) & " cent " & strResultat
Else
strResultat = "cent " & strResultat
End If
End If
End Select
Next i

If Len(strResultat) > 0 Then
strResultat = UCase(Left(strResultat, 1)) & Mid(strResultat, 2)
End If


NbVersTexte = strResultat
End Function
A voir également:

3 réponses

Bonjour,

Le type Number n'existe pas en VB6, il faudra remplacer par Integer.

Dim i As Integer
Dim nPosition As Integer 'position du chiffre dans le nombre
Dim ValNb As Integer 'valeur en nombre de l'extrait de strTemp 


Ensuite, ajoute ces instructions qui suppriment les séparateur de milliers ( "1 000" -> "1000" )

strTemp = CStr(Int(ValNum)) 
i = InStr(1, strTemp, " ")
While i > 0
strTemp = Left(strTemp, i - 1) & Right(strTemp, Len(strTemp) - i)
i = InStr(1, strTemp, " ")
Wend


A+.
0
dutche Messages postés 73 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 21 mai 2010
23 mai 2008 à 11:55
Merci pour ta reponse.
Mais je crois que j'ai mal utilisé le mot vb6 c'est du basic que crystal report utilise pour la création de ces fonctions. Il ne reconnais pas le type Integer.
0
dutche Messages postés 73 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 21 mai 2010
23 mai 2008 à 12:14
J'ai bien essayé avec ton code pour supprimer les zeros amigo mais ça ne marche pas. Le problème ne se situe peut être pas là.
0