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

  • Initiateur de la discussion Initiateur de la discussion Anne13
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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]
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
😉
 
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:
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
 
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
 
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

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
 
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, 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é
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
245
Réponses
2
Affichages
422
Réponses
5
Affichages
568
Réponses
3
Affichages
509
Retour