VBA Substitue ou remplace "." par ","
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour à tous,
Pour aider Fabienne, je coince sur la macro,
Sub ChangeFormats()
Dim Lg As Long, Plg As Range, Cel As Range
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set Plg = Range("f9:f" & Lg & ", " & "h9:h" & Lg)
For Each Cel In Plg
Cel = WorksheetFunction.Substitute(Cel, ".", ",")
Cel = Cel.Value * 1
Cel.NumberFormat = "0.00"
Next Cel
End Subçà marche avec: 0.428994351046328
mais avec: 17835.5305014477, çà me supprime carrément le point
Le but est de remplacer le format texte en numérique avec 2 décimales
Comment feriez-vous ?
Bonne journée
Claude.
Edit Dan : Fil de Fabienne --> https://forum.excel-pratique.com/excel/integrer-un-fichier-csv-dans-une-base-excel-t14614.html
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
le lien de Fabienne est celui-ci (c'est peut-être en rapport ?)
https://forum.excel-pratique.com/excel/aide-sur-une-macro-lancee-par-bouton-t14619.html
Amicalement
Claude.
Bonsoir, Claude
Plutôt que d'essayer de comprendre le pourquoi du comment (PS, je n'ai pas essayé ton code.....
un autre code :
Sub ChangeFormats()
Dim Lg As Long
Dim Ar As Range, Plg As Range
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set Plg = Range("f9:f" & Lg & ", " & "h9:h" & Lg)
For Each Ar In Plg.Areas
Ar.TextToColumns Destination:=Ar(1), FieldInfo _
:=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
Ar.NumberFormat = "0.00"
Next
End SubC'est vrai, je ne réponds pas à ta question.....
Mais, c'est une solution....
Bonne soirée
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Salut cousinhub,
C'est vrai que là, on passe à un niveau supérieur !
dommage que je n'arrive pas à comprendre ton code (l'aide avec touche F1 n'apporte rien : mot clé introuvable)
de mon coté, j'en suis arrivé à insérer une colonne pour y coller une formule SUBSTITUTE
çà marche mais sans la classe de ton code !
Sub ChangeFormats2()
Dim Lg As Long, Plg As Range, Cel As Range
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set Plg = Range("f9:f" & Lg)
For Each Cel In Plg
Cel = WorksheetFunction.Substitute(Cel, ".", ",")
Cel = Cel.Value * 1
Cel.NumberFormat = "0.00"
Next Cel
Range("i:i").Insert
Range("i9:i" & Lg).FormulaR1C1 = "=SUBSTITUTE(RC[-1],""."","","")"
For Each Cel In Range("h9:h" & Lg)
Cel = Cel.Offset(0, 1).Value * 1
Cel.NumberFormat = "0.00"
Next Cel
Range("i:i").Delete
End SubEn tout cas merci, peut-être qu'un jour je comprendrais.
Amicalement
Claude.
Re,
le code commenté
Sub ChangeFormats()
Dim Lg As Long 'ça, c'est toi
Dim Ar As Range, Plg As Range ' Ar c'est une plage, tout comme Plg
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row ' c'est toi qui le dit
Set Plg = Range("f9:f" & Lg & ", " & "h9:h" & Lg) 'tout pareil
For Each Ar In Plg.Areas ' c'est ici que ça commence....
' je "balaie" chaque zone de la plage déterminée
' sachant que la commande qui suit ne supporte pas
' des zones non contigues
Ar.TextToColumns Destination:=Ar(1), FieldInfo _
:=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
' donc, chaque zone est transformée en nombre
' via la commande "Données/Convertir
' chaque zone convertie étant "recopiée" dans la première cellule
' de cette zone : Ar(1)
' et on utilise le séparateur décimal "."
Ar.NumberFormat = "0.00" 'ici, je mets le format à 2 décimales
Next
End SubBonne soirée
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Merci pour ta patience, j'y vois un peu + clair sans avoir tout assimiler mais bon, çà viendra,
Question subsidiaire:
Toujours dans le tableau de Fabienne, il y a un pavé à traiter, les colonnes sont contigues, j'ai essayé avec ton
code, mais il ne semble pas accepter plusieurs colonnes ? : Set Plg = Range("n9:r" & Lg)
Sub suite()
Dim Lg As Long
Dim Ar As Range, Plg As Range
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set Plg = Range("n9:r" & Lg)
For Each Ar In Plg.Areas
Ar.TextToColumns Destination:=Ar(1), FieldInfo _
:=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
Ar.NumberFormat = "0.00%"
Next
End SubDe +, là il faut mettre en %, çà me décale la décimale de 100 (ex: 196% au lieu de 1,96%)
Je suis nul sur ce coup là !
Claude.
-- Jeu Déc 17, 2009 10:03 pm --
re,
dans cette 2ème partie, en tâtonnant et en supprimant ".Areas" dans le "For Each Ar In Plg '****.Areas"
tout est rentré dans l'ordre.
ce qui donne:
Sub suite()
Dim Lg As Long
Dim Ar As Range, Plg As Range
Lg = Range("A65536").End(xlUp).Row
Set Plg = Range("n9:p" & Lg)
For Each Ar In Plg '****.Areas
Ar.TextToColumns Destination:=Ar(1), FieldInfo _
:=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
Ar.NumberFormat = "0.00%"
Next
End SubJe crois comprendre que le .Areas n'a plus lieu d'être ici, puisqu'une seule plage contigue (n9:p15)
Je continue en regroupant tout sur le fichier de Fabienne.
Bonne soirée
Claude.