VBA Substitue ou remplace "." par ","

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

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 Sub

C'est vrai, je ne réponds pas à ta question.....

Mais, c'est une solution....

Bonne soirée

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 Sub

En 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 Sub

Bonne soirée

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 Sub

De +, 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 Sub

Je 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.

Rechercher des sujets similaires à "vba substitue remplace"