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
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 pointET CELA SANS AUCUNE DISTINCTION
démo avec des nombre valable et des nons valables
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
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
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
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
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
et oui mais là sur ton fichier il faut nettoyer le format millier d'abords
mais quelle idée d’écrire un nombre dans un format il y a numberformat pour ça ou format par le menu
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
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
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
@Yeahou oui aussi
attention a ce qu'il ai des nombre en numerique
la mienne normalement prévoit tout (séparateur millier, séparateur décimal, vide)
sauf des éventuelles valeurs text qui pourraient se trouver dans la colonne
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