Rapport de message :*
 

Re: remplacer en VBA en respectant la casse

Titre du sujet : Re: remplacer en VBA en respectant la casse
par myDearFriend! le 08/09/2010 21:34:36

Bonsoir yaka, le Forum,

Là, tu tombes sur LE piège « classique » VBA et fort pénible pour tout le monde...

La première chose à prendre en compte, c'est que si en France le séparateur décimale est la virgule, chez les anglo-saxons, ça reste le point.
La deuxième chose à assimiler, c'est que VBA c'est le côté sombre de la force : dans l'environnement VBA, tout est en anglais.

Pour s'en convaincre, il suffit de saisir dans l'éditeur VBA :
Range("A1").Value = 13.4 'avec un "point"
... tu obtiens « 13,4 » (avec une "virgule") dans la cellule de feuille de calcul.

Sur nos versions Excel en français, il y a donc une multitude de conversions automatiques de format réalisées par le système pour traiter, puis ré-afficher les données numériques.

J'ai testé dans tous les sens, il me semble impossible d'y arriver en utilisant globalement la méthode Replace comme tu l'as fait.

En lieu et place, j'ai utilisé Replace() dans une boucle, mais en tant que fonction cette fois (voir l'aide VBA sur le mot clé Replace pour la distinction entre méthode Excel et fonction VBA). J'ai aussi usé de la propriété FormulaLocal des cellules et, pour rendre l'ensemble pas trop lent, j'ai optimisé pour ne cibler que les seules cellules concernées (celles contenant un nombre uniquement).

Je te propose donc cette procédure à la place de la tienne :
Sub ChangerVirguleEnPoint()
'myDearFriend!  -  www.mdf-xlpages.com
Dim Plage As Range, R As Range
Dim T As String
    Application.ScreenUpdating = False
    'Trouver la colonne contenant le mot "Données" en ligne 3
    Set Plage = Rows(3).Find("Données").EntireColumn
    'Ne cibler que les cellules contenant une valeur numérique
    Set Plage = Plage.SpecialCells(xlCellTypeConstants, 1)
    'Traitement de chaque cellule
    For Each R In Plage
        R.FormulaLocal = Replace(R.Value, ",", ".")
    Next R
    Application.ScreenUpdating = True
End Sub

J'espère que ça pourra te convenir...

Cordialement,