XL 2016 convertir des nombres avec . en chiffre en €

desmonts

XLDnaute Junior
Bonjour,
j'ai essayé de faire une petite macro qui supprime les points par des blancs. Cela marche très bien mais avec des chiffres important. (ex -35.581,12 cela devient 35 581€) mais cela ne fonctionne pas avec des chiffres sans point (ex 423,18 cela devient 42 318€ et non 423€)

Voici le code
Sub essaiMEF_AP07Macro()

Columns("I:I").Select
Selection.Style = "Currency"
Selection.Replace What:=".", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=",", Replacement:=".", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.NumberFormat = "_-* #,##0.0 $_-;-* #,##0.0 $_-;_-* ""-""?? $_-;_-@_-"
Selection.NumberFormat = "_-* #,##0 $_-;-* #,##0 $_-;_-* ""-""?? $_-;_-@_-"

End Sub
Par avance merci de votre aide
 

Fichiers joints

zebanx

XLDnaute Accro
Bonjour Desmonts.

Pas sûr que le format vous convienne mais on aboutit à un résultat similaire (remplacement des points, puis des virgules avant d'appliquer un dernier format)

++
zebanx

-----
Sub remplace()
Range(Cells(3, 9), Cells([I3].End(4).Row, 9)).Select
For Each Cell In Selection
Cell.Value = WorksheetFunction.Substitute(Cell, ".", "")
Cell.Value = WorksheetFunction.Substitute(Cell, ",", ".")
Cell.NumberFormat = "$#,##0_);($#,##0)"
Next
End Sub

edit : le "423,18" indiqué dans votre commentaire et fourni dans le fichier est "423.18"
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Essayez comme ça :
VB:
Sub essaiMEF_AP07Macro()
Dim Rng As Range, T(), Z As String, L As Long
Set Rng = Range([I2], Cells(&H100000, "I").End(xlUp))
T = Rng.Value
For L = 1 To UBound(T, 1)
   If VarType(T(L, 1)) = vbString Then
      Z = Replace(T(L, 1), ".", "")
      If IsNumeric(Z) Then T(L, 1) = CCur(Z)
      End If: Next L
Rng.Value = T
Rng.NumberFormat = "$#,##0_);($#,##0)"
End Sub
Faut arrêter de croire que les cellules contenant des nombres contiennent des textes formés de chiffres, de point et de virgules. Elle contiennent des nombres binaires en virgule flottante double précision, c'est tout. Alors en voulant remplacer des points dans des nombres vous l'obligez à convertir ces nombre en textes dont vous ne connaissez pas du tout l'aspect.
À propos de texte, la colonne H en contient, justement aussi, alors qu'il me semble qu'ils devrait être des dates… Et à ce propos les dates ne contiennent ni point ni slash: elle contiennent le nombre de jours écoulé depuis le 1er janvier 1900.
Débarrassez vous une bonne fois pour toutes de la croyance selon laquelle ce que vous voyez dans une cellule est un modèle exact de sa valeur. Ce n'est à peu près ça que s'il s'agit d'un texte.
À votre place, je profiterais de la procédure pour les convertir en dates. Ce qui donne ça :
VB:
Sub essaiMEF_AP07Macro()
Dim Rng As Range, T(), Z As String, L As Long
Set Rng = Range([H2], Cells(&H100000, "I").End(xlUp))
T = Rng.Value
For L = 1 To UBound(T, 1)
   If VarType(T(L, 1)) = vbString Then
      Z = Replace(T(L, 1), ".", "/")
      If IsDate(Z) Then T(L, 1) = CDate(Z)
      End If
   If VarType(T(L, 2)) = vbString Then
      Z = Replace(T(L, 2), ".", "")
      If IsNumeric(Z) Then T(L, 2) = CCur(Z)
      If Z = "" Then T(L, 2) = Empty
      End If: Next L
Rng.Value = T
Rng.Columns(2).NumberFormat = "$#,##0_);($#,##0)"
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Les valeurs sont correctes chez moi et le nombre est bien affiché avec des espaces comme séparateurs de milliers mais pas de séparateur de décimales puisque le dernier format spécifié dans le code d'origine semble indiquer qu'il ne voulait pas voir les centimes. Mais c'est vrai qu'il vaudrait mieux mettre à la fin :
VB:
Rng.Columns(2).NumberFormat = "$#,##0.00_);($#,##0.00)"
 
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Eriiic, bonjour Dranreb

Merci pour les précisions et le code de Dranreb.

@Dranreb
Le résultat du code est idéal pour les dates mais, sauf erreur, on conserve le "." sur les chiffres de le colonne "i" (pas compris).
Si vous avez un instant, je vous en remercie par avance.
bon apm++
zebanx
 

Dranreb

XLDnaute Barbatruc
Peut être est-ce une question de paramétrage dans votre classeur ?
Dans les option avancées la case Utiliser les séparateurs système ne serait pas cochée et le séparateur de milliers personnalisé spécifié serait le point ?
 

zebanx

XLDnaute Accro
Re-

Merci pour l'information et le (double) retour rapide.
Cela ne fonctionne pas après modification des séparateurs système mais si cela fonctionne parfaitement chez vous, c'est clair que c'est à moi de chercher !

Bon apm
zebanx

Le code suivant fonctionne aussi mais sur une plage longue, il sera nettement plus long que l'utilisation d'une varialbe t() utilisée dans votre code :
Sub remplace()
For Each cell In [I3:I20]
cell.Value = Replace(cell, ".", "")
cell.Value = Replace(cell, ",", ".")
Next
End Sub

Bref, à moi de trouver -).
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui et en plus ce code ne me paraît bas bon.
Parce que Replace exige un String comme 1er paramètre. Si donc cell.Value est de type Double ou Currency il est converti en String et il n'est pas absolument certain que le résultat du dernier Replace soit bien reconverti en Double ou en Currency comme il se doit.
Et puis même si ça marche, ça me paraît complètement idiot de transiter via un String une valeur de cellule qui n'a rien à se reprocher !
 
Dernière édition:

Discussions similaires


Haut Bas