XL 2013 Conversion d'une colonne en numérique

Daniel Desch

XLDnaute Nouveau
Bonjour,

Je cherche à faire une macro qui pourrait me transformer une colonne (avant) avec des champs qui devraient être en théorie numériques mais que les utilisateurs arrivent à remplir sous différents formats en colonne (après) avec des cases vraiment numériques (voir tableau ci-joint)

Cela doit être relativement simple et j'y arrive assez facilement par manip sous Excel. Mais quand j'enregistre une macro et que je la rejoue cela ne donne pas le résultat escompté.

Merci pour votre aide
 

Pièces jointes

  • Zone numérique.xlsx
    9.8 KB · Affichages: 11

M12

XLDnaute Accro
Bonjour
teste cette formule en C2 et tire vers le bas
Sélectionne la colonne --> Format personnalisée 0,00000
VB:
=SUBSTITUE(A2;".";",")*1

ou alors par macro pour les placer en colonne B
Code:
Sub Test()
  '********************************
  '*  DECLARATIONS DES VARIABLES  *
  '********************************
  Dim i%, Dl%
  Dim Ws As Worksheet
  '********************************
  '* INITIALISATION DES VARIABLES *
  '********************************
  Set Ws = Sheets("Saisie")
  Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To Dl
      Cells(i, 2).Value = Application.WorksheetFunction.Substitute(Cells(i, 1), ".", ",") * 1
      Cells(i, 2).NumberFormat = "0.00000"
    Next i
End Sub
 
Dernière édition:

Daniel Desch

XLDnaute Nouveau
Bonjour M12,

Et merci pour votre réponse. Effectivement votre macro fonctionne dans mon exemple précis

J'avais de mon côté programmé quelque chose de ressemblant mais légèrement différent car dans la vraie vie je veux modifier des plages de cellules (pas forcément des colonnes) sans les recopier, mais je ne parviens pas à voir ce qui cloche dans ce que j'ai fait

Mon test sur la Colonne 6 donne un résultat incorrect (en partie surement car je ne multiplie pas par *1)
Et mon test sur la Colonne 7 plante en erreur 13



Sub Test()
Dim c As Range, plage As Range

Set plage = Range("A1").CurrentRegion.Columns(6)
For Each c In plage.Cells
c.Value = Application.WorksheetFunction.Substitute(c, ".", ",")
Next
plage.NumberFormat = "0.00000"

Set plage = Range("A1").CurrentRegion.Columns(7)
For Each c In plage.Cells
c.Value = Application.WorksheetFunction.Substitute(c, ".", ",") * 1
Next
plage.NumberFormat = "0.00000"
End Sub

Sauriez-vous me dire ce qui cloche dans ce code qui me semble pourtant simple et proche du vôtre ?

Cordialement
 

Pièces jointes

  • Zone numérique.xlsm
    15.3 KB · Affichages: 6

Jacky67

XLDnaute Barbatruc
Bonjour à tous,

Je cherche à faire une macro qui pourrait me transformer une colonne (avant) avec des champs qui devraient être en théorie numériques mais que les utilisateurs arrivent à remplir sous différents formats en colonne (après) avec des cases vraiment numériques (voir tableau ci-joint)

Cela doit être relativement simple et j'y arrive assez facilement par manip sous Excel. Mais quand j'enregistre une macro et que je la rejoue cela ne donne pas le résultat escompté.

Merci pour votre aide
Bonjour,
A tester
VB:
Sub Test()
    Dim plage As Range
    Set plage = Range("f2:f" & Cells(Rows.Count, "A").End(xlUp).Row)
    With plage
        .Formula = "=SUBSTITUTE($a2,"","",""."")*1"
        'ou selon Symbole décimal
        '     .Formula = "=SUBSTITUTE($a2,""."","","")*1"
        .Value = .Value
        .NumberFormat = "0.00000"
    End With
End Sub
 

patricktoulon

XLDnaute Barbatruc
bonjour
des décimales a plus de 2 chiffre avec "€" a la fin tu risque pas d'y arriver ;)
d'une part par qu'avec euro c'est deux decimal
donc tu essai d'appliquer numberformat sur du texte en fait et ca c'est pas possible il te faut tout netoyer avant

donne un exemple de fichier avec 1 collonne avec les chaines et une colonne avec le résultat escompté la en l’état ton fichier on sait pas ce que tu veux
 

job75

XLDnaute Barbatruc
Bonjour Daniel Desch, M12, Jacky67, patricktoulon,

Voyez le fichier joint et cette macro :
VB:
Sub Convertir()
Dim tablo, i&
With [A1].CurrentRegion
    tablo = .Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        tablo(i, 1) = Val(Replace(tablo(i, 1), ",", "."))
    Next
    .NumberFormat = "0.00000"
    .Value = tablo
End With
End Sub
Elle est très rapide car elle utilise un tableau VBA.

Testée en copiant la plage A2:A19 sur 108 000 lignes, elle s'exécute en 0,25 seconde chez moi.

A+
 

Pièces jointes

  • Zone numérique(1).xlsm
    16.8 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re
bonjour job75 tu m'a devancé

sauf que je procède sans boucle

les petites astuce de patricktoulon ;)
VB:
Sub test()
'petite astuce de patricktoulon
'on ne remplace pas le "." par la "," mais on fait l'inverse
    Set plage = Range("A1").CurrentRegion.Columns(7)

    With plage
        .Replace What:=",", Replacement:=".", LookAt:=xlPart
        .Replace What:="€", Replacement:="", LookAt:=xlPart

        'en vba le séparateur c'est le point!!!!!!!!!!!!!!!!!!!! a l'inverse d'excel
        'comme on a remplacé la virgule par le point  pour vba ce sera donc des numériques (tous!!!)
        ' et maintenant  l'astuce
        'on remplace les valeurs par le tableau des valeurs
        'et donc vba se charge tout seul d'interpréter  tout ça en numérique

        .Value = .Value
        'reste plus qu'a formater tes cellules
        .NumberFormat = "#0.0000"
    End With

End Sub
demo3.gif
 

Daniel Desch

XLDnaute Nouveau
Bonjour Job25

Impeccable effectivement, je viens de la tester sur des tableaux énormes.

Cela fait exactement ce que je souhaite et presque instantanément.

Votre méthode qui consiste à travailler sur des tables VBA, que vous m'aviez déjà montrée dans un autre Topic, est vraiment à retenir

Merci Beaucoup



Bonjour Jacky67

J'ai essayé votre formule sur mes tableaux mais cela me renvoie souvent un problème de VALEUR

Merci quand même de votre proposition
 

Daniel Desch

XLDnaute Nouveau
Bonjour patricktoulon

Je vais également tester votre proposition car elle me semble vraiment très concise et très intéressante

Je ne savais pas que le point était la décimale du vba et la virgule celle d'excel
Surement pour ça qu'une macro enregistrée ne me donne pas les mêmes résultats lors de son enregistrement et lors de sa ré-exécution


Mais là je dois vraiment y aller, je verrai ça ce soir ou demain matin.

Bien Cordialement

Daniel
 

patricktoulon

XLDnaute Barbatruc
re
tu es sur Job75?
ça me parait improbable puisque je ne boucle pas et les éléments sont les mêmes

1°un range(toi/moi)

2°une variable tableau(toi/moi) (moi tableau anonyme)

2 bis ° boucle sur tableau( que toi)

3°insersion du tableau dans le range (toi/moi)

peut être est ce les deux replace sur cells qui ralentissent
 

Daniel Desch

XLDnaute Nouveau
Bonjour patricktoulon, bonjour job75,


J'ai fait les tests de mon côté.
Vos deux propositions fonctionnent parfaitement

C'est vrai que la syntaxe de patricktoulon est encore plus concise
Et c'est vrai aussi que la macro de job75 est un peu plus rapide sur des grandes plages de données

En tout cas merci à tous les deux

Bonne journée

Daniel
 

Discussions similaires