Microsoft 365 remplacement . ou , par séparateur de décimal en VBA

Anne13

XLDnaute Nouveau
Bonjour,
je m'arrache les cheveux sur une question pourtant simple et abordée de nombreuses fois ...
J'ai besoin dans un ficher excel de remplacer les , ou les . par le séparateur de décimal de l'application.
En effet selon les postes celà peut varier.
J'ai trouvé comment récupérer le séparateur défini sur le poste. ( merci le forum)
J'ai donc écrit une macro, le problème c'est que du coup tous mes chiffres passent en texte, alors que si je le fait manuellement avec la fonction remplacer cela fonctionne.
Je ne comprends pas ce que je fais mal ...
Merci de votre aide,

VB:
Sub SepDec()
'
' Remplacement des points ou virgules par le séparateur de décimal configuré
'

'
Dim dec As String

    dec = Application.DecimalSeparator
 

     Range(Selection, Selection.End(xlDown)).Select
    Selection.Replace What:=".", Replacement:=dec, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:=",", Replacement:=dec, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    
End Sub
 

Pièces jointes

  • test.xlsm
    11.8 KB · Affichages: 23
Solution
Bonsoir Anne Bernard, Phil 69970, le forum

essayes ton code modifié comme cela

Cordialement, @+
VB:
Sub Remplace()
Range(Selection, Selection.End(xlDown)).Select

For Each Cell In Selection
     Cell.Value = CDec(Numerique(Cell.Value))
Next
End Sub

Function Numerique$(Num$)
'remettre le bon séparateur numérique sur une saisie en textbox quelque soit le paramètre régional
'by Ti_ (Thierry Pourtier) le 06-08-2006
Dim DSep$, Sep$
  DSep = Mid$(2.1, 2, 1)
  Sep = IIf(DSep = ".", ",", ".")
  Numerique = Replace(Num, Sep, DSep)
End Function

[édition : salut @Anne13 j'ai modifié la fonction avec celle la, valeur#, qui fonctionne dans tous les cas, plus besoin de cdec avec la Fonction Valeur]

patricktoulon

XLDnaute Barbatruc
Bonjour @Yeahou la fonction que tu a donné pour le séparateur décimal n'est pas tout a fait valable dans le sens ou elle test sur une donnée codée en dur et non l'application elle même
perso j'ai un truc infaillible
en fait en VBA le séparateur est TOUJOURS !!!!!le point et cela quelque soit le séparateur décimal paramétré dans l'application


comme tu utilise le return d'une fonction qui est sensée te renvoyer la donnée en numérique
ben c'est simple tu remplace la virgule par le point ET CELA SANS AUCUNE DISTINCTION

démo avec des nombre valable et des nons valables
demo7.gif


voila on vois bien que je remplace toutes les virgules par le point en VBA et les données se retrouvent bien numériques dans la feuille mais avec le séparateur décimal (virgule) celui qui est paramétré dans mon application
;)
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour @Yeahou la fonction que tu a donné pour le séparateur décimal n'est pas tout a fait valable dans le sens ou elle test sur une donnée codée en dur et non l'application elle même
perso j'ai un truc infaillible
en fait en VBA le séparateur est TOUJOURS !!!!!le point et cela quelque soit le séparateur décimal paramétré dans l'application
Bonjour Patrick

Bien sur ! regarde la date de la discussion et du post concerné !
on a déjà discuté longuement tous les deux de ce code et cela a donné pour finir le remplacement de la fonction numérique par la fonction valeur héritée aussi de Ti et qui a remplacé ce code.
Ce n'est pas beau de vieillir ! 🤣
Thierry avait posté cela le 13 septembre 2005 dans ce fil très intéressant, ce qui ne nous rajeunit pas !
https://www.excel-downloads.com/threads/ou-avec-vba-userform.45149/post-224114

Bonne journée
Avec l'autorisation de David, voici, en son hommage, une fonction personnalisée de Ti_ (Thierry Pourtier) remettant le bon séparateur décimal dans une valeur quel que soit le séparateur décimal paramétré dans excel.
Utilisable par VBA ou formule, compatible toutes versions d'Excel depuis Excel 97.
Citation de Ti_ parlant du séparateur décimal: "la fonction Val n'a que faire de ces subtilités internationales puisqu'elle n'utilise jamais que le point, quel que soit le système utilisé, et je trouve ça très bien ainsi."

Bien cordialement, @+
VB:
Code:
Function Valeur#(ByVal StrVal$)
'remettre le bon séparateur décimal dans une valeur quel que soit le paramètre régional
'by Ti_ (Thierry Pourtier)
Valeur = Val(Replace(StrVal, ",", "."))
End Function
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
@Yeahou
je sais pas j'ai survolé le truc
toujours est il que comme je l'ai montré la méthode val(replace(valeur,",",point forcé)) est infaillible
on a plus a se demander quel est le séparateur car Val même si il attend un long (et non un double) il restitue la valeur avec ces décimales en tant que numérique vba!!! la conversion selon le séparateur paramétré dans l'application se fait automatiquement lors de l'injection dans la cellule

j'ajoute que l'on pourrait faire l'inverse c'est a dire
forcer la virgule et utiliser CdbL a la place de Val
c'est du (
bonnet blanc / blanc bonnet )
et là encore une fois sans distinction

VB:
Sub Remplace()
Dim cel As Range
For Each cel In [A1:A5].Cells
     cel.Value = Numerique(cel)
Next
End Sub

Function Numerique(cel)
Numerique = CDbl(Replace(cel, ".", ","))
End Function

mais perso je préfère le natif VBA qui est le point
ça fait partie des bonnes habitudes a prendre (je pense)
quand on code des conversions de chaîne le natif c'est toujours plus simple
 

onyirimba

XLDnaute Occasionnel
Supporter XLD
re
@Yeahou
je sais pas j'ai survolé le truc
toujours est il que comme je l'ai montré la méthode val(replace(valeur,",",point forcé)) est infaillible
on a plus a se demander quel est le séparateur car Val même si il attend un long (et non un double) il restitue la valeur avec ces décimales en tant que numérique vba!!! la conversion selon le séparateur paramétré dans l'application se fait automatiquement lors de l'injection dans la cellule

j'ajoute que l'on pourrait faire l'inverse c'est a dire
forcer la virgule et utiliser CdbL a la place de Val
c'est du (
bonnet blanc / blanc bonnet )
et là encore une fois sans distinction
VB:
Sub Remplace()
Dim cel As Range
For Each cel In [A1:A5].Cells
     cel.Value = Numerique(cel)
Next
End Sub

Function Numerique(cel)
Numerique = CDbl(Replace(cel, ".", ","))
End Function

mais perso je préfère le natif VBA qui est le point
ça fait partie des bonnes habitudes a prendre (je pense)
quand on code des conversions de chaîne le natif c'est toujours plus simple
bonjour,

Merci pour l'information

Cordialement
 

onyirimba

XLDnaute Occasionnel
Supporter XLD
re
@Yeahou
je sais pas j'ai survolé le truc
toujours est il que comme je l'ai montré la méthode val(replace(valeur,",",point forcé)) est infaillible
on a plus a se demander quel est le séparateur car Val même si il attend un long (et non un double) il restitue la valeur avec ces décimales en tant que numérique vba!!! la conversion selon le séparateur paramétré dans l'application se fait automatiquement lors de l'injection dans la cellule

j'ajoute que l'on pourrait faire l'inverse c'est a dire
forcer la virgule et utiliser CdbL a la place de Val
c'est du (
bonnet blanc / blanc bonnet )
et là encore une fois sans distinction
VB:
Sub Remplace()
Dim cel As Range
For Each cel In [A1:A5].Cells
     cel.Value = Numerique(cel)
Next
End Sub

Function Numerique(cel)
Numerique = CDbl(Replace(cel, ".", ","))
End Function

mais perso je préfère le natif VBA qui est le point
ça fait partie des bonnes habitudes a prendre (je pense)
quand on code des conversions de chaîne le natif c'est toujours plus simple

J'ai essayé ce codage pour supprimer les points => cela fonctionne très bien mais la macro s'arrête et un message d'erreur apparait

est-ce que cela est possible d'intégrer les cellules au de la de ligne 13 dans mon exemple car la dernière ligne de la base de donnée est amenée à varier ? comme cela le message d'erreur pourra disparaitre

J'ai joint un fichier illustrant mes propos

Merci beaucoup

1633698305851.png
 

Pièces jointes

  • suppresion des points.xlsm
    24.7 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
tiens je corrige le millier remplace le decimal et control en meme temps si ya valeur ou pas
VB:
Sub Remplace()
    Dim cel As Range
    For Each cel In [J4:J50].Cells
        cel.Value = Numerique(cel)
    Next
End Sub


Function Numerique(cel)
    If cel <> "" Then
        If cel Like "*.*,*" Then cel = Replace(cel, ".", "")
        Numerique = Val(Replace(cel, ",", "."))
    End If
End Function

et si tu veux que le nombre de lignes a travailler se determine automatiquement c'est ça!!
VB:
Sub Remplace()
    Dim cel As Range
    With Sheets(1) 'à adapter a ton cas
    For Each cel In .Range("J4:J" & .Cells(Rows.Count, "J").End(xlUp).Row).Cells
        cel.Value = Numerique(cel)
    Next
End With
End Sub


Function Numerique(cel)
    If cel <> "" Then
        If cel Like "*.*,*" Then cel = Replace(cel, ".", "")
        Numerique = Val(Replace(cel, ",", "."))
    End If
End Function
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour onyirimba, le forum

normal que cela ne fonctionne pas.
pour ton code il faut enlever les points et non remettre le bon séparateur
essaie avec ce code

VB:
VB:
Sub Remplace()
Range(Selection, Selection.End(xlDown)).Select

For Each Cell In Selection
Cell.Value = Replace(Application.Trim(Cell.Value), ".", "") / 1
Next
End Sub
Bien cordialement, @+
onyirimba, comme je te l'ai déja dit, ton problème n'est pas de remettre le bon séparateur décimal mais de supprimer le point, et aussi les espaces qui trainent dans tes cellules
Ce code tout simple devrait le faire
VB:
Sub Remplace()
Dim Cel As Range
For Each Cel In [J4:J50]
     If Not IsNumeric(Cel.Value) Then Cel.Value = Replace(Application.Trim(Cel.Value), ".", "") / 1
Next
End Sub
 

onyirimba

XLDnaute Occasionnel
Supporter XLD
onyirimba, comme je te l'ai déja dit, ton problème n'est pas de remettre le bon séparateur décimal mais de supprimer le point, et aussi les espaces qui trainent dans tes cellules
Ce code tout simple devrait le faire
VB:
Sub Remplace()
Dim Cel As Range
For Each Cel In [J4:J50]
     If Not IsNumeric(Cel.Value) Then Cel.Value = Replace(Application.Trim(Cel.Value), ".", "") / 1
Next
End Sub
Merci beaucoup

c'est noté
 

Discussions similaires

Statistiques des forums

Discussions
312 023
Messages
2 084 714
Membres
102 637
dernier inscrit
TOTO33000