Les meilleures sources Access

Les meilleures sources AccessConsultez toutes les sources
Nombre d'auteurs : 44, nombre de sources : 147, création le 19 mars 2013
Sommaire→Divers→Fonctions de conversion et de calcul- Calculer la médiane d'une colonne numérique d'une table (mathématique)
- Convertir des nombres en chiffres romains
- Convertir les noms et prénom en noms propres qu'ils soient composés ou non.
- Convertir une date Julienne au format jj/mm/yyyy
- Determiner le nombre de jours entre deux dates. (Par exemple nombre de lundi)
- Extraire et mettre en forme le nom de rue d'une adresse afin de faciliter la recherche.
- Fonctions mathématiques dérivées (Arcsinus, fonctions hyperboliques...)
- Mise en majuscule de la première lettre du prénom (simple, composé, avec espace, tiret ou non)
- Traduire une date
- Transformer des chiffres en lettres. Avec décimal ou non
- Convertir un nombre en base n vers une base m
Versions : Toutes
La médiane est la valeur qui se trouve au centre d'un ensemble de nombres. En d'autres termes, les nombres appartenant à la première moitié de l'ensemble ont une valeur inférieure à la médiane, tandis que ceux appartenant à l'autre moitié ont une valeur supérieure à la médiane.
Exemple :
MEDIAN(1, 2, 3, 4, 5) égal 3
MEDIAN(1, 2, 3, 4, 5, 6) égal 3.5, moyenne de 3 et 4
Public Function fMediane(strTable As String, strField As String) As Variant
Dim oDBS As DAO.Database
Dim oRST As DAO.Recordset
Dim blnEven As Boolean
Dim vntMedian As Variant
Set oDBS = CurrentDb()
Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " ORDER BY " & strField)
If oRST.EOF = False Then
oRST.MoveLast
'Is there an even number of records in the recordset?
blnEven = (oRST.RecordCount Mod 2 = 0)
'Rounds down if there is an even number of records...
oRST.PercentPosition = 50
vntMedian = oRST.Fields(strField)
If blnEven Then
oRST.MoveNext
'...so take the average of the this and the next value up
vntMedian = (vntMedian + oRST.Fields(strField)) / 2
End If
End If
fMediane = vntMedian
oRST.Close
Set oRST = Nothing
Set oDBS = Nothing
End FunctionTest :
Sub TesterExemple()
'Code client
'-----------
'ALFKI
'ANATR
'ANTON
'AROUT
'BERGS
'BLAUS
'BLONP
'BOLID
'BONAP
MsgBox fMediane("TBLClients", "[Code client]")
'Renvoie "BERGS"
End SubCe code permet de convertir des nombres en chiffres romains. La plage de conversion s'étend de 0 à 3999.
Dans un module :
Function ChiffreRomain(ByVal Nombre As Integer) As String
Dim TNombre() As String
Dim i As Integer, Unite As Integer
If Nombre < 4000 Then
TNombre = Split("I,V,X,L,C,D,M", ",")
While Nombre > 0
Unite = Nombre Mod 10
Nombre = Nombre \ 10
Select Case Unite
Case 1 To 3
ChiffreRomain = String(Unite, TNombre(i)) & ChiffreRomain
Case 4
ChiffreRomain = TNombre(i) & TNombre(i + 1) & ChiffreRomain
Case 5 To 8
ChiffreRomain = TNombre(i + 1) & String(Unite - 5, _
TNombre(i)) & ChiffreRomain
Case 9
ChiffreRomain = TNombre(i) & TNombre(i + 2) & _
ChiffreRomain
End Select
i = i + 2
Wend
End If
End FunctionUtilisation :
MsgBox ChiffreRomain(49)Versions : Access 2000 et supérieures. Access 97 avec utilisation de la fonction Split issues des codes sources.
Pour convertir une chaine de caractères en nom propre (1ère lettre du mot en majuscule) il est possible d'utiliser l'expression suivante:
strLastName=StrConv(strLastName, vbProperCase)Cela marche très bien si peu que le prénom ou le nom est composé d'un seul mot. En revanche, lorsqu'il y a une succession de mots séparés par un tiret ou un autre caractère, ce n'est plus opérationel. Voici une petite fonction qui répond au problème.
Public Function GetProperName(ByVal TextToConvert As String) As String
Dim aSeparatorStrings() As String
Dim aSeparatorChar() As String
Dim aSeparatorsPos() As String
Dim aWords() As String
Dim sSeparators As String
Dim sTempChar As String
Dim sTempResult As String
Dim I As Integer
Dim S As Integer
Dim sSeparatorsPos As String
Dim iNBSeparators As Integer
Dim sLastChar As String
On Error GoTo L_ErrConversion
sSeparators = "| |;|:|-|~|@|_|&|*|#|'| " 'Last space = 160
aSeparatorStrings = Split(sSeparators, "|")
For I = 1 To Len(TextToConvert)
sTempChar = Mid(TextToConvert, I, 1)
For S = LBound(aSeparatorStrings) To UBound(aSeparatorStrings)
If sTempChar = aSeparatorStrings(S) Then
iNBSeparators = iNBSeparators + 1
ReDim Preserve aSeparatorChar(0 To iNBSeparators)
aSeparatorChar(iNBSeparators - 1) = sTempChar
sSeparatorsPos = sSeparatorsPos + Trim(str(I)) & ";"
Exit For
End If
Next
Next
If iNBSeparators = 0 Then
sTempResult = UCase(Left(TextToConvert, 1)) & LCase(Mid(TextToConvert, 2))
Else
sSeparatorsPos = IIf(Right(sSeparatorsPos, 1) = ";", Left(sSeparatorsPos, _
Len(sSeparatorsPos) - 1), sSeparatorsPos)
sSeparatorsPos = "1;" & sSeparatorsPos & ";" & Trim(str(Len(TextToConvert)))
I = 0: S = 0
aSeparatorsPos = Split(sSeparatorsPos, ";")
ReDim aWords(1 To iNBSeparators + 1)
For I = 1 To iNBSeparators + 1
sLastChar = IIf(I = (iNBSeparators + 1), vbNullString, aSeparatorChar(I - 1))
If I = 1 Then
aWords(I) = UCase(Mid(TextToConvert, 1, 1)) & LCase(Mid(TextToConvert, _
2, aSeparatorsPos(I) - 2)) & sLastChar
Else
S = IIf(I = (iNBSeparators + 1), 1, 2)
aWords(I) = UCase(Mid(TextToConvert, aSeparatorsPos(I - 1) + 1, 1)) & _
LCase(Mid(TextToConvert, aSeparatorsPos(I - 1) + 2, aSeparatorsPos(I) - _
aSeparatorsPos(I - 1) - S)) & sLastChar
End If
Next
For I = 1 To iNBSeparators + 1
sTempResult = sTempResult & aWords(I)
Next
End If
L_ExConversion:
GetProperName = sTempResult
Erase aSeparatorStrings
Erase aSeparatorChar
Erase aSeparatorsPos
Exit Function
L_ErrConversion:
MsgBox "Une erreur est survenue durant la conversion de la chaîne de caractère...", _
48, "Conversion échouée"
sTempResult = TextToConvert
Resume L_ExConversion
End FunctionMode d'utilisation :
Debug.Print GetProperName("charles-henri de l'arbre aux mésanges bleues")Bien, c'est pas très commun comme nom de famille mais bon, cela retourne:
Charles-Henri De L'Arbre Aux Mésanges Bleues
Note :
Les caractères de séparation pris en compte sont:
L'espace, le point-virgule, les deux points, le tiret, le tilde, l'arobase, le underscore, le symbole de concaténation, l'astérisque, le dièse, l'apostrophe et l'espace caché.
Vous pouvez modifier ce tableau à votre convenance.
Cette fonction convertit une date julienne (utilisée par les AS400) du type 105047 en 16/02/2005. Si une erreur se produit lors de la conversion, la fonction retourne la date : 30/12/1899.
Function DateFromJulian(LaDate as string) as date
On error goto err
Dim Annee as integer
Dim Jour as integer
Dim Temp as date
Annee=1900+Cint(Left(Ladate,1))*100+Cint(mid(LaDate,2,2))
Temp=DateSerial(Annee,1,1)
Jour=Cint(Right(LaDate,3))
DateFromJulian=DateAdd("d",Jour-1,Temp)
err:
End functionUtilisation dans une requête :
SELECT DateFromJulian(MaDate) FROM MaTableExplications :
- Le premier chiffre de la date julienne correspond au siècle. 0 pour 1900, 1 pour 2000
- Les deux suivants, l'année dans le siècle.
- Enfin les trois derniers correspondent au numéro du jour dans l'année.
Versions : 2000 et supérieures
Public Function njour(jour As VbDayOfWeek, date1 As Date, date2 As Date) As Integer
Dim d As Date
Dim i As Integer
If date1 > date2 Then
MsgBox "Impossible de calculer, date2 doit être supérieur à date1"
Else
i = Weekday(date1)
If i > jour Then
i = 7 - i + jour
Else
i = jour - i
End If
d = DateAdd("d", i, date1)
If d < date2 Then njour = njour + 1
njour = njour + DateDiff("d", d, date2) \ 7
End If
End FunctionCe module complet propose des fonctions afin d'extraire et mettre en forme le nom de rue d'une adresse. Cette mise en forme offre la possibilité de trier de manière alphabétique les noms des rues dans une requête, alimentant par exemple une zone liste modifiable dans un formulaire de saisie des adresses.
Il permet par exemple de transformer :
46 bis Rue de la Paix par Rue de la Paix ou bien Paix (Rue de la).
Dans un module placez le code suivant :
Function fNomVoie(ByVal str As String) As String
Dim strMotsClés As String, strMotsSecondaires As String, _
strMot As String
'Vérifie qu'une chaine de longueur non nulle a été passée
If str = "" Then Exit Function
strMotsClés = Trim(str)
''fVoieSansNum sert uniquement à vérifier si strMotsClés commence _
'par un numéro de voie (avec ou sans Bis/B) _
'Afin de ne pas tenir compte de ce numéro s'il existe. _
'Cette procédure est donc facultative si vous stockez le numéro de voie _
'(et la mention "Bis ou B") dans un champ à part. _
'fVoieSansNum reconnait les doubles numéros _
's'ils sont séparés par un tiret, une virgule ou une esperluette _
'avec ou sans espaces.
strMotsClés = fVoieSansNum(strMotsClés)
strMot = fPremierMot(strMotsClés)
Do Until fMotClé(strMot)
strMotsSecondaires = strMotsSecondaires & " " & strMot
strMotsClés = LTrim(Right(strMotsClés, Len(strMotsClés) - Len(strMot)))
strMot = fPremierMot(strMotsClés)
Loop
If Len(LTrim(strMotsSecondaires)) > 0 Then _
strMotsSecondaires = " (" & LTrim(strMotsSecondaires) & ")"
fNomVoie = strMotsClés & strMotsSecondaires
End Function
Function fPremierMot(str As String)
'Cette fonction renvoie le premier mot contenu dans str
Dim lng As Long
Dim strMot As String
For lng = 1 To Len(str)
Select Case Mid(str, lng, 1)
Case " "
strMot = Left(str, lng - 1)
fPremierMot = strMot
Exit Function
Case "'"
strMot = Left(str, lng)
fPremierMot = strMot
Exit Function
End Select
Next lng
fPremierMot = str
End Function
Function fMotClé(str As String) As Boolean
'Cette fonction indique si str correspond à un mot clé. _
'C'est à dire s'il est différent d'un simple article ou d'un type de voie).
Select Case str
Case "Rue", "Boulevard", "Avenue", "Chemin", "Passage", "Traverse", _
"Route", "Place", "Allée", "Allées", "Esplanade", "Quai", _
"-", "le", "la", "les", "l'", "du", "de", "des", "d'", _
fMotClé = False
Case Else
fMotClé = True
End Select
End Function
Function fVoieSansNum(ByVal Voie As String) As String
'Cette fonction reconnait les doubles numéros _
's'ils sont séparés par un tiret, une virgule ou une esperluette _
'avec ou sans espaces.
'Cette fonction peut être utilisée seule ou en
'complément de la fonction fNomVoie
Dim str As String
Dim bte As Byte, bteFinNum As Byte
Voie = Replace(Voie, ",", "")
str = Left$(Voie, 1)
If Not IsNumeric(str) Then
fVoieSansNum = Voie
Else
bte = 1
Do
If IsNumeric(str) Then
bteFinNum = bte
Do
bte = bte + 1
str = Mid$(Voie, bte, 1)
Loop Until str <> " "
Else
Select Case str
Case "-", "&"
Do
bte = bte + 1
str = Mid$(Voie, bte, 1)
Loop While str = " "
If Not IsNumeric(str) Then
Exit Do
End If
Case "b"
If Mid$(Voie, bte, 3) = "bis" Then
Select Case Mid$(Voie, bte + 3, 1)
Case " "
bte = bte + 3
bteFinNum = bte
Do
bte = bte + 1
str = Mid$(Voie, bte, 1)
Loop While str = " "
Case "-", "&"
bte = bte + 3
str = Mid$(Voie, bte, 1)
Case Else
Exit Do
End Select
Else
Select Case Mid$(Voie, bte + 1, 1)
Case " "
bte = bte + 1
bteFinNum = bte
Do
bte = bte + 1
str = Mid$(Voie, bte, 1)
Loop While str = " "
Case "-", "&"
bte = bte + 1
str = Mid$(Voie, bte, 1)
Case Else
'Fin du numéro
Exit Do
End Select
End If
Case Else
'Fin du numéro
Exit Do
End Select
End If
Loop
fVoieSansNum = Trim$(Right$(Voie, Len(Voie) - bteFinNum))
End If
End FunctionUtilisation des fonctions :
Msgbox fVoieSansNum("90-92 Rue Meynadier")Affiche : Rue Meynadier
Msgbox fNomVoie("90-92 Rue Meynadier")Affiche : Meynadier (Rue)
Remarques :
Select Case str
Case "Rue", "Boulevard", "Avenue", "Chemin", "Passage", "Traverse", _
"Route", "Place", "Allée", "Allées", "Esplanade", "Quai", _
"-", "le", "la", "les", "l'", "du", "de", "des", "d'", _
fMotClé = False
Case Else
fMotClé = True
End SelectVous pouvez compléter vous-même la fonction fMotClé en ajoutant dans le premier Case, des mots "non-clés" (c'est à dire à ne pas considérer comme des noms de voie).
Vous trouverez une base de données utilisant ces fonctions dans une requête et un formulaire dans le fichier zip téléchargeable.
Versions : 97 et supérieures
Voici une liste de fonctions mathématiques dérivées des fonctions disponibles dans Access telles que sinus,cosinus et tangente.
Fonction sécante :
Public Function Secante(Valeur As Double) As Double
Secante = 1 / Cos(Valeur)
End FunctionFonction cosécante :
Public Function CoSecante(Valeur As Double) As Double
CoSecante = 1 / Sin(Valeur)
End FunctionFonction cotangente :
Public Function CoTangente(Valeur As Double) As Double
CoTangente = 1 / Tan(Valeur)
End FunctionFonction arcsinus :
Public Function ArcSinus(Valeur As Double) As Double
ArcSinus = Atn(Valeur / Sqr(-Valeur * Valeur + 1))
End FunctionFonction arccosinus :
Public Function ArcCosinus(Valeur As Double) As Double
ArcCosinus = Atn(-Valeur / Sqr(-Valeur * Valeur + 1)) + _
2 * Atn(1)
End FunctionFonction arcsécante :
Public Function ArcSecante(Valeur As Double) As Double
ArcSecante = Atn(Valeur / Sqr(Valeur * Valeur - 1)) + _
Sgn((Valeur) - 1) * (2 * Atn(1))
End FunctionFonction arccosécante :
Public Function ArcCoSecante(Valeur As Double) As Double
ArcCoSecante = Atn(Valeur / Sqr(Valeur * Valeur - 1)) + _
(Sgn(Valeur) - 1) * (2 * Atn(1))
End FunctionFonction arccotangente :
Public Function ArcCoTangente(Valeur As Double) As Double
ArcCoTangente = Atn(Valeur) + 2 * Atn(1)
End FunctionFonction sinus hyperbolique :
Public Function SinusHyperbolique(Valeur As Double) As Double
SinusHyperbolique = (Exp(Valeur) - Exp(-Valeur)) / 2
End FunctionFonction cosinus hyperbolique :
Public Function CosinusHyperbolique(Valeur As Double) As Double
CosinusHyperbolique = (Exp(Valeur) + Exp(-Valeur)) / 2
End FunctionFonction tangente hyperbolique :
Public Function TangenteHyperbolique(Valeur As Double) As Double
TangenteHyperbolique = (Exp(Valeur) - Exp(-Valeur)) / _
(Exp(Valeur) + Exp(-Valeur))
End FunctionFonction sécante hyperbolique :
Public Function SecanteHyperbolique(Valeur As Double) As Double
SecanteHyperbolique = 2 / (Exp(Valeur) + Exp(-Valeur))
End FunctionFonction cosécante hyperbolique :
Public Function CosecanteHyperbolique(Valeur As Double) As Double
CosecanteHyperbolique = 2 / (Exp(Valeur) - Exp(-Valeur))
End FunctionFonction cotangente hyperbolique :
Public Function CoTangenteHyperbolique(Valeur As Double) As Double
CoTangenteHyperbolique = (Exp(Valeur) + Exp(-Valeur)) / _
(Exp(Valeur) - Exp(-Valeur))
End FunctionFonction arcsinus hyperbolique :
Public Function ArcSinusHyperbolique(Valeur As Double) As Double
ArcSinusHyperbolique = Log(Valeur + Sqr(Valeur * Valeur + 1))
End FunctionFonction arccosinus hyperbolique :
Public Function ArcCosinusHyperbolique(Valeur As Double) As Double
ArcCosinusHyperbolique = Log(Valeur + Sqr(Valeur * Valeur - 1))
End FunctionFonction arctangente hyperbolique :
Public Function ArcTangenteHyperbolique(Valeur As Double) As Double
ArcTangenteHyperbolique = Log((1 + Valeur) / (1 - Valeur)) / 2
End FunctionFonction arcsécante hyperbolique :
Public Function ArcSecanteHyperbolique(Valeur As Double) As Double
ArcSecanteHyperbolique = Log((Sqr(-Valeur * Valeur + 1) + 1) / Valeur)
End FunctionFonction arccosécante hyperbolique :
Public Function ArcCosecanteHyperbolique(Valeur As Double) As Double
ArcCosecanteHyperbolique = Log((Sgn(Valeur) * _
Sqr(Valeur * Valeur + 1) + 1) / Valeur)
End FunctionFonction arccotangente hyperbolique :
Public Function ArcCoTangenteHyperbolique(Valeur As Double) As Double
ArcCoTangenteHyperbolique = Log((Valeur + 1) / (Valeur - 1)) / 2
End FunctionFonction logarithme de base N :
Public Function LogBaseN(Valeur As Double, BaseN) As Double
LogBaseN = Log(Valeur) / Log(BaseN)
End FunctionVous pouvez télecharger l'ensemble de ses fonctions regroupées dans un fichier .bas en cliquant sur le lien : télechargez le zip.
Versions : 2000 et supérieures
Cette fonction permet de mettre la première lettre de chaque mot en majuscule. Cela peut être très utile pour les prénoms composés
Option Compare Database
Function MiseEnMajuscule(Chaine As String) As String
Dim nCar As Integer 'Compteur (position dans la chaine à traiter)
Chaine = Trim$(Chaine) 'Récupère la chaîne sans les espaces facultatifs
'Traitement spécifique sur le premier caractère
MiseEnMajuscule = UCase$(Left(Chaine, 1))
'Début de la boucle sur les autres caractères
For nCar = 2 To Len(Chaine)
'Teste le caractère précédent (" " ou "-")
If (Mid$(Chaine, nCar - 1, 1) = " ") Or (Mid$(Chaine, nCar - 1, 1) = "-") Then
'Si c'est vrai, mettre en majuscule le caractère courant
MiseEnMajuscule = MiseEnMajuscule & UCase$(Mid(Chaine, nCar, 1))
Else
'Si c'est faux, mettre en minuscule le caractère courant
MiseEnMajuscule = MiseEnMajuscule & LCase$(Mid(Chaine, nCar, 1))
End If
'Fin de la boucle sur les caractères
Next
End FunctionUtilisation :
Msgbox MiseEnMajuscule("jean-paul")Ceci affichera : Jean-Paul
Version : Access 2000 et supérieures
Cet exemple de code vous propose une fonction de conversion permettant de traduire une date en différentes langues.
Par exemple :
| Langue | Date |
|---|---|
| Français | Paris, le 10 Mai 2005 |
| Anglais | Paris, May 10th 2005 |
| Allemand | Paris, den 10. Mai 2005 |
| Espagnol | Paris, 10 de mayo |
Dans un module, placez le code suivant :
Option Compare Database
Option Explicit
Public Enum Langue
langueFrancais
langueAnglais
langueAllemand
langueespagnol
End Enum
Public Function TradDate(strLocalite As String, dteDate As Date, lanLangue As Langue) As String
Dim strListeMoisLang(4) As String
Dim strTemp As String
'La taille doit correspondre au nombre de langue
Dim strMois() As String
'Initialise le tableau des langues
strListeMoisLang(Langue.langueFrancais) = _
"Janvier;Février;Mars;Avril;Mai;Juin;Juillet;Août;Septembre;Octobre;Novembre;Décembre"
strListeMoisLang(Langue.langueAnglais) = _
"January;February;Mars;April;May;June;July;August; September;October;November;December"
strListeMoisLang(Langue.langueAllemand) = _
"Januar;Februar; an März;April;Mai;Juni;Juli;August;September;Oktober;November;Dezember"
strListeMoisLang(Langue.langueespagnol) = _
"El enero;febrero;marzo;abril;mayo;junio;julio;agosto;septiembre;octubre;noviembre;diciembre"
'Récupère la liste des mois de la langue sélectionnée dans un tableau
strMois = Split(strListeMoisLang(lanLangue), ";")
Select Case lanLangue
Case Langue.langueFrancais
strTemp = "le " & Day(dteDate) & " " & strMois(Month(dteDate) - 1) & " " & Year(dteDate)
Case Langue.langueAnglais
strTemp = strMois(Month(dteDate) - 1) & " " & Day(dteDate)
'Ajoute la numérotaion ordinale
Select Case Day(dteDate)
Case 1: strTemp = strTemp & "st"
Case 2: strTemp = strTemp & "nd"
Case 3: strTemp = strTemp & "rd"
Case Else: strTemp = strTemp & "th"
End Select
strTemp = strTemp & ", " & Year(dteDate)
Case Langue.langueAllemand
strTemp = "den " & Day(dteDate) & ". " & strMois(Month(dteDate) - 1) & " " & Year(dteDate)
Case Langue.langueEspagnol
strTemp = Day(dteDate) & " de " & strMois(Month(dteDate) - 1) & " " & Year(dteDate)
End Select
TradDate = strLocalite & ", " & strTemp
End FunctionExemple d'utilisation :
MsgBox TradDate("Metz", Now, langueAllemand)N'hésitez pas à ajouter de nouvelles langues et à me les faire parvenir pour une future intégration dans cette page.
Versions : 97 et supérieures
Option Compare Database
Dim mot$(25), Résultat$, N$
Dim Virgule, B, K$, nombre$, longueur
Dim cdu$, C$, D$, U$, Et, Tiret
Sub Ajoute(MotSimple$)
'--- ajoute un nouveau terme traduit à la chaine résultat
If Résultat$ <> "" Then
'--- vérifie s'il est nécessaire de coller le nouveau terme au
'--- précédent dans le cas des "S" à rajouter, ou des tirets
If Right$(Résultat$, 1) = "-" Or _
MotSimple$ = "s" Or MotSimple$ = "-" Then
Résultat$ = Résultat$ + MotSimple$
'--- sinon, ajoute le terme après un espace
Else
Résultat$ = Résultat$ + " " + MotSimple$
End If
Else
Résultat$ = MotSimple$
End If
End Sub
Function Equivalent$(Valeur)
'--- recherche le mot équivalent à une valeur numérique
Select Case Valeur
Case Is < 21
Equivalent$ = mot$(Valeur)
Case Else
Equivalent$ = mot$(18 + (Valeur / 10))
End Select
End Function
Function Nb2Mot$(Valeur$)
Dim a$
'--- initialisation du tableau contenant les mots interprétés
mot$(1) = "un"
mot$(2) = "deux"
mot$(3) = "trois"
mot$(4) = "quatre"
mot$(5) = "cinq"
mot$(6) = "six"
mot$(7) = "sept"
mot$(8) = "huit"
mot$(9) = "neuf"
mot$(10) = "dix"
mot$(11) = "onze"
mot$(12) = "douze"
mot$(13) = "treize"
mot$(14) = "quatorze"
mot$(15) = "quinze"
mot$(16) = "seize"
mot$(20) = "vingt"
mot$(21) = "trente"
mot$(22) = "quarante"
mot$(23) = "cinquante"
mot$(24) = "soixante"
'--- récupération de paramètre passé
a$ = Valeur$ + " "
'--- initialisation des variables de travail
N$ = ""
Virgule = 0
Résultat$ = ""
'--- pour toute la longueur de celui-ci
For B = 1 To Len(a$)
'--- on extrait chacun de ses caractères
K$ = Mid$(a$, B, 1)
Select Case K$
'--- gère les montants négatifs
Case "-"
Ajoute "moins"
'--- si ceux-ci sont numériques, on batit la chaine n$
Case "0" To "9"
N$ = N$ + K$
'--- sinon, on teste si on est arrivé à une virgule
Case Else
If Virgule = 1 Then
'--- les centimes sont comptés sur 2 digits, réajustés de
'--- manière inverse aux euros, puisqu'on lit les unités
'--- et dizaines de manière inversée (0,2? = 20c et
'--- 0,02?=2c)
N$ = Right$("000" + Left$(N$ + "000", 2), 2)
If Val(N$) = 0 Then N$ = ""
End If
'--- on traduit le nombre stocké dans n$
TraduireEntier N$
'--- puis on détermine son unité en fonction de la présence
'--- ou non d'une virgule
If Virgule = 0 And Val(N$) > 0 Then
Ajoute "euro"
'--- et on accorde l'unité avec le nombre
If Val(N$) > 1 Then Ajoute "s"
ElseIf Virgule = 1 And Val(N$) > 0 Then
Ajoute "centime"
'--- en ajoutant un "s" si nécessaire
If Val(N$) > 1 Then Ajoute "s"
End If
N$ = ""
Select Case K$
Case Chr$(13)
B = B + 1
Case Is < " "
Case ",", "."
Virgule = 1
'--- si une valeur en euros est exprimée, et que le
'--- nombre de centimes est suffisant pour être traité,
'--- on lie les 2 par le mot "et"
If Val(a$) <> 0 And _
Val("0." + Mid$(a$, B + 1)) >= 0.01 Then Ajoute "et"
Case Else
End Select
End Select
Next
Nb2Mot$ = Résultat$
End Function
Sub TraduireEntier(NombreATraduire$)
'--- convertit un nombre entier contenu dans une chaine de caractères
'--- en son équivalent ordinal
nombre$ = NombreATraduire$
If nombre$ <> "" Then
'--- si le nombre est 0, on ne perd pas de temps
If Val(nombre$) = 0 Then
Ajoute "zéro"
Else
'--- sinon, on convertit celui-ci en une chaine de caractères
'--- de longueur multiple de 3, afin de pouvoir la lire par blocs
'--- de 3 caractères
nombre$ = Right$("000", -((Len(nombre$) Mod 3) <> 0) * (3 - (Len(nombre$) Mod 3))) _
+ nombre$
For longueur = Len(nombre$) To 3 Step -3
cdu$ = Left$(nombre$, 3)
nombre$ = Right$(nombre$, longueur - 3)
'--- on extrait ainsi des ensembles de 3 chiffres, de la
'--- gauche vers la droite
If cdu$ <> "000" Then
'--- dont on tire une valeur de centaines, dizaines et
'--- unités
C$ = Left$(cdu$, 1)
D$ = Mid$(cdu$, 2, 1)
U$ = Right$(cdu$, 1)
'--- on convertit les unités non muettes pour les
'--- centaines
If C$ >= "2" Then Ajoute Equivalent$(Val(C$))
'--- et on traite les 1 muets
If C$ >= "1" Then
Ajoute "cent"
'--- en appliquant les règles d'accords pour les
'--- centaines
If Val(nombre$) = 0 And D$ + U$ = "00" _
And Len(Résultat$) > 4 Then Ajoute "s"
End If
'--- on analyse si le mot ET est nécessaire (21, 31,
'--- 41 ...)
Et = (D$ >= "2") And (U$ = "1")
'--- ainsi que les tirets pour certains couples
'--- dizaines-unités
Tiret = ((D$ >= "2") And (U$ > "1") _
Or (D$ >= "1" And U$ >= "7")) And Not Et
'--- traitement des valeurs 80-99
If D$ >= "8" Then
Ajoute "quatre-vingt"
Et = 0
'--- retenue nécessaire pour 90 à 99
If D$ = "8" Then D$ = "0" _
Else D$ = "1": Tiret = True
'--- et traitement des unités
If U$ > "0" Then Tiret = True Else Ajoute "s"
'--- sinon on traite les valeurs 70 à 79
ElseIf D$ = "7" Then
Ajoute "soixante"
'--- avec une retenue pour les dizaines
D$ = "1"
If U$ <> "1" Then Tiret = True
End If
'--- valeurs entre 10 et 16
If (D$ = "1") And (U$ <= "6") Then
D$ = "0"
U$ = "1" + U$
End If
'--- sinon, on gère toutes les autres dizaines
If D$ >= "1" Then
'--- gère les tirets pour les dizaines composées
If Tiret And D$ = "1" _
And Val(Right$(cdu$, 2)) > 19 Then
Ajoute "-"
End If
'--- traduction de la dizaine...
Ajoute Equivalent$(Val(D$ + "0"))
'--- en accordant l'exception des vingtaines
If D$ + U$ = "20" And C$ <> "0" Then Ajoute "s"
End If
'--- si le mot Et est nécessaire, on l'ajoute
If Et Then Ajoute "et"
'--- ainsi que le tiret, liant une dizaine et une
'--- unité
If Tiret Then Ajoute "-"
'--- puis on traduit l'unité du nombre
If Val(U$) >= 22 Or ((Val(U$) >= 1 And (Val(cdu$) > 1 Or longueur <> 6))) Then
Ajoute Equivalent$(Val(U$))
End If
'--- enfin, la pondération du nombre est respectée,
'--- en ajoutant le multiple nécessaire, et en
'--- l'accordant s'il le faut
Select Case longueur
Case 6: Ajoute "mille"
Case 9: Ajoute "million"
If Val(cdu$) > 1 Then Ajoute "s"
Case 12
Ajoute "milliard"
If Val(cdu$) > 1 Then Ajoute "s"
Case Else
End Select
End If
Next
End If
End If
End Sub
Voici une fonction permettant de convertir un nombre donné en base n vers une base m.
Function base(ByVal FigDec As Long, ByVal Bas As Integer, ByVal Longueur As Integer) As String
Dim strH As String
Dim i As Integer, j As Integer
Dim FigX As Long
Dim Hexx As String
strH = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Hexx = vbNullString
FigX = FigDec
For i = Longueur - 1 To 0 Step -1
For j = Bas - 1 To 1 Step -1
If ((Bas) ^ i) * j <= FigX Then
Hexx = Hexx & Mid(strH, j + 1, 1)
FigX = FigX - ((Bas) ^ i) * j
GoTo found01
End If
Next j
Hexx = Hexx & "0"
found01:
Next i
base = Hexx
End Function
Function ConvertBase(ByVal StrSource As String, _
ByVal BasSource As Integer, _
ByVal BasDest As Integer, _
ByVal Longueur As Integer) As String
' conversion du Nombre base N en decimal
Dim strH As String
Dim FigDec As Long
Dim i As Integer
strH = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
FigDec = 0
For i = Len(StrSource) To 1 Step -1
FigDec = FigDec + (InStr(strH, Mid(StrSource, i, 1)) - 1) _
* BasSource ^ (Len(StrSource) - i)
Next i
'Debug.Print "la conversion décimale de " & _
StrSource & " de base " & _
BasSource & " donne un décimal de " & FigDec
' récupération du décimal en base N'
ConvertBase = base(FigDec, BasDest, Longueur)
End Function
L'entête de la fonction reçoit en paramètre : le nombre à convertir, la base source, la base destination et la longueur de la valeur retournée (nombre de caractères).
Exemple :
3 : le nombre à convertir, 10 : la base 10, 2 : la base et 8 la longueur de la chaine retournée.
ConvertBase("3", 10, 2, 8)
va retourner "00000011".
Autre exemple :
ConvertBase("B6", 16, 10, 4)va retourner "0182".



