Calcul de rang – Gestion des décimales
Dans plusieurs articles précédents, il a été question de calculer des rangs pour classer des valeurs numériques. Mais dans certaines formules fournies, un problème peut se poser sur les valeurs non entières. Voici comment le résoudre.
Le problème
Voici un calcul de rang inspiré des articles précédents. L’une des moyennes d’élève a des chiffres après la virgule, ce qui provoque une erreur dans la requête. M’étonne pas, vu l’élève… 🙂
Le problème vient d’un mauvais enchaînement :
- La moyenne contient une virgule (ou des décimales).
- Cette moyenne est utilisée par concaténation pour créer le critère de comparaison, dans la requête.
- L’ordinateur est français, ou en tout cas a un séparateur décimal réglé sur la virgule.
- Et ce #!&? d’Access ne traduit pas le nombre en valeur anglo-saxonne. La virgule reste donc une virgule, au lieu d’être transformée en point.
Première solution
La première solution consiste tout simplement à modifier le séparateur décimal de votre ordinateur. Celui-ci est défini dans le Panneau de configuration de votre machine (l’option s’appelle selon les version « Paramètres régionaux » ou « Modifier les paramètres de date, d’heure et de nombre« ).
Deuxième solution
Maintenant, si vous ne souhaitez ou ne pouvez pas modifier le séparateur décimal de votre ordinateur (parce que ça aurait un impact sur d’autres logiciels, par exemple), vous pouvez faire comme ceci :
- Recopiez le code VBA donné plus bas dans un module standard de votre base de données. Le code apporte deux nouvelles fonctions, dont
DecimalSep()
qui a déjà été traitée sur ce blog), etNumberUS()
qui nous intéresse ici. - Dans les requêtes qui posent problème, « embarquez » les valeurs décimales dans la fonction
NumberUS()
. Par exemple, cette formule :
1 |
Rang: CpteDom("*";"[tblElèves]";"[Moyenne] > " & [Moyenne] & " AND [Classe] = '" & [Classe] & "'") + 1 |
… devient :
1 |
Rang: CpteDom("*";"[tblElèves]";"[Moyenne] > " & NumberUS([Moyenne]) & " AND [Classe] = '" & [Classe] & "'") + 1 |
Le code VBA
1 2 3 4 5 6 7 |
Function DecimalSep() As String DecimalSep = Mid$(1 / 2, 2, 1) End Function Function NumberUS(ByVal varValue As Variant) As String NumberUS = Replace(str(varValue), DecimalSep(), ".") End Function |
Bonjour,
Dans mon cas, il ne reconnais pas (NumberUS)
C’est parce qu’il faut la recopier dans la base de données, comme indiqué en bas de l’article.
La fonction
NumberUS()
n’existe pas en VBA nativement.Bonjour et merci pour cet article qui me tire une sérieuse épine du pied 🙂
Pourriez-vous donner une solution similaire pour la gestion des dates ?
Merci d’avance!
Si c’est un problème de conversion de dates dans des filtres SQL, cet article peut aider.
Merci pour ce vrai bijou tu est tro fort et j’avous que j’ai eu beucoup d’expérience a traver le grenier access une fois de plus merci mais en ce qui concerne les rangs pourquoi les rangs font 1,2,2,4…en sautant la place qui suit les mêmes moyennes en cas de mêmes moyennes je pensai que ça allai continuer 1,2,3,4… meme si les 2 moyenne du milieu sont égaux? ou bien encor 1,2,2,3,…si tu pouvai nous trouver une solution a cela ce serai parfait merci je n’arive pas a m’ensortir fait pas attention aux fautes d’orthographe merci encor j’esper en toi tu es notre héro
Faisal > Effectivement, pour les fautes, c’est un record ! (j’en ai compté 22, sans compter la ponctuation) 😉
Sinon, pour ce qui est des rangs : la numérotation gère les ex-aequos (voir cet autre article).