Convertir en format nombre

  • Initiateur de la discussion Initiateur de la discussion roidurif
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

roidurif

XLDnaute Occasionnel
Bonjour,

Mon fichier :

J'ai dans ma colonne AH plusieurs prix écrit de cette façon 12,98 en format texte avec le triangle vert dans le coin haut de la celulle, qui dit quand on click dessus "convertir en nombre stocké"

Ma demande :

A travers une macro, j'aimerai convertir la liste des prix au format "nombre" 0.00 et s'il manque un prix, c'est à dire une cellule vide, la macro ne devra pas remplir cette cellule par des zéros (ex:0.00)

Important sachant qu'il peut y avoir entre 1000 à 8000 prix, j'aimerai que la macro soit rapide et ne plus y avoir ces triangle vert

merci de votre aide

Code:
Sub test()
Dim R As Range
With Sheets("feuil1")
Set R = .Range("AH2", .[AH65536].End(xlUp))
  For Each C In R
  C.NumberFormat = "0.00"
  C.Value = Replace(C.Text, ",", ".")
Next C
End With
End Sub
 
Re : Convertir en format nombre

Bonjour,

J'ai une importante lenteur avec cette macro lorsque j'atteins un certain nombre de ligne soit entre 8000 à 10 000 lignes.

Pourriez svp m'aider à accélérer cette macro?

Code:
sub test()
For Each c In Sheets("feuil1").Range("AH2:" & Sheets("catalogue").Range("AH65536").End(xlUp).Address)
  c.NumberFormat = "0.00"
  c.Value = Replace(c.Text, ",", ".")
Next c
End Sub
merci

cordialement
 
Re : Convertir en format nombre

Bonsoir roidurif
Code:
Sub test2()
Dim i As Long, oDat()
    oDat = Sheets("feuil1").Range("AH2:" & Sheets("catalogue").Range("AH65536").End(xlUp).Address).Value
    For i = 1 To UBound(oDat, 1)
        oDat(i, 1) = Replace(oDat(i, 1), ",", ".")
    Next i
    Sheets("feuil1").Range("A2:" & Sheets("feuil1").Range("A65536").End(xlUp).Address).Value = oDat
End Sub
devrait nettement accélérer les choses.
Par contre, je ne comprends pas cette ligne :
Code:
For Each c In Sheets("[B][COLOR="Red"]feuil1[/COLOR][/B]").Range("AH2:" & Sheets("[B][COLOR="Red"]catalogue[/COLOR][/B]").Range("AH65536").End(xlUp).Address)
Bonne nuit.
ROGER2327
 
Re : Convertir en format nombre

Bonsoir Temjeh
D'accord avec vous, on peut utiliser Convertir... deux fois et éviter d'écrire quelques lignes de code. Mais c'est plus lent : avec 64 000 données, le code que je propose fait le travail en 0.6s, c'est-à-dire beaucoup plus vite que Convertir.... Et il y a moins de manipulations. (Encore moins si ce code est intégré dans un code plus large.)
Il peut donc y avoir intérêt à utiliser un code.​
Cordialement,
ROGER2327
 
Re : Convertir en format nombre

Bonjour ROGER2327,

J'ai fait ce que vous m avez dit et je remarque en colonne AH ca ne transforme pas les chiffres textes en nombre
J'essaye de faire cela dans la colonne AH

Code:
Sub test2()
Dim i As Long, oDat()
    oDat = Sheets("feuil1").Range("AH2:" & Sheets("feuil1").Range("AH65536").End(xlUp).Address).Value
    For i = 1 To UBound(oDat, 1)
        oDat(i, 1) = Replace(oDat(i, 1), ",", ".")
    Next i
    Sheets("feuil1").Range("AH2:" & Sheets("feuil1").Range("AH65536").End(xlUp).Address).Value = oDat
End Sub

merci
 

Pièces jointes

Dernière édition:
Re : Convertir en format nombre

ROGER2327

J'essaye de faire la même chose mais cette fois ci dans le sens inverse, convertir nombre en nombre texte avec le petit triangle vert

J'ai fait cela mais je rencontre une lenteur lorque j'ai des lignes de 1000 à 8000 lignes
Code:
Sub Convertir_Prix_TXT()
With Sheets("DATA")
Dim i As Integer, temp As String, Fin As Integer
For i = 2 To .Range("AH" & .Rows.Count).End(xlUp).Row
temp = Replace(.Range("AH" & i), ",", ".")
.Range("AH" & i).ClearContents
.Range("AH" & i).NumberFormat = "@"
.Range("AH" & i).Value = temp
Next
End With
End Sub

merci d'avance
 
Re : Convertir en format nombre

Bonjour

en enregistrement auto de macro, une conversion texte en nombre donne

Columns("A:A").Select
Selection.NumberFormat = "0.00"
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

cel évite des boucles d'autant plus lentes que les données sont nombreuses

as-tu testé cette voie?
 
Re : Convertir en format nombre

Bonsoir à tous
Bilan de cette discussion
_
J'ai procédé à quelques tests. Ils sont effectués en utilisant le point comme séparateur décimal. Si on veut utiliser la virgule comme séparateur, il faut remplacer "." par "," (et "," par ".") dans les procédures qui suivent.
J'ai traité 65 536 données et testé chaque procédure six fois.
  1. Remplacement du point par la virgule.
    Code:
    Sub Convertir_Prix_TXT()
    Dim i As Long, temp As String
       For i = 1 To Rows.Count
          temp = Replace(Range("A" & i), ".", ",")
          Range("A" & i).ClearContents
          Range("A" & i).NumberFormat = "@"
          Range("A" & i).Value = temp
       Next
    End Sub
    Vitesse moyenne de traitement : 1 752 données par seconde.
    _
    Code:
    Sub PV() 'remplace les points par des virgules
       Columns("A:A").Select
       Selection.NumberFormat = "@"
       Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
          SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
          ReplaceFormat:=False
    End Sub
    Vitesse moyenne de traitement : 25 600 données par seconde.
    _
    Code:
    Sub test2() 'remplace les points par des virgules
    Dim i As Long, oDat()
       oDat = Columns("A:A").Value
       For i = 1 To UBound(oDat, 1)
          oDat(i, 1) = Replace(oDat(i, 1), ".", ",")
       Next i
       Columns("A:A").NumberFormat = "@"
       Columns("A:A").Value = oDat
    End Sub
    Vitesse moyenne de traitement : 76 204 données par seconde.
    _
  2. Remplacement de la virgule par le point.
    Code:
    Sub Convertir_TXT_Prix()
    Dim i As Long, temp As String
       For i = 1 To Rows.Count
          temp = Replace(Range("A" & i), ",", ".")
          Range("A" & i).ClearContents
          Range("A" & i).NumberFormat = "0.00"
          Range("A" & i).Value = temp
       Next
    End Sub
    Vitesse moyenne de traitement : 1 754 données par seconde.
    _
    Code:
    Sub VP() 'remplace les virgules par des points
       Columns("A:A").Select
       Selection.NumberFormat = "0.00"
       Selection.Replace What:=",", Replacement:=".", LookAt:=xlPart, _
          SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
          ReplaceFormat:=False
    End Sub
    Vitesse moyenne de traitement : 30 768 données par seconde.
    _
    Code:
    Sub test1() 'remplace les virgules par des points
    Dim i As Long, oDat()
       oDat = Columns("A:A").Value
       For i = 1 To UBound(oDat, 1)
          oDat(i, 1) = Replace(oDat(i, 1), ",", ".")
       Next i
       Columns("A:A").NumberFormat = "0.00"
       Columns("A:A").Value = oDat
    End Sub
    Vitesse moyenne de traitement : 96 376 données par seconde.
    _
Contrairement à certaines idées reçues, l'exécution de traitements avec de nombreuses boucles n'est pas nécessairement plus lente que l'exécution de certaines procédures intégrées.
Mais des boucles mal conçues peuvent être très longues à exécuter : c'est le cas de la première procédure, pénalisée par d'incessants rafraichissements d'écran et lectures/écritures dans la feuille. La suppression de la ligne
Code:
      Range("A" & i).ClearContents
fait chuter la durée d'éxécution d'environ 40 % (21 s au lieu de 37).
La deuxième méthode, quoique formellement sans boucle (je dis formellement, car si la boucle n'est pas écrite, elle existe en interne) est environ trois fois plus lente que la troisième. Deux raisons possibles : 1) la méthode Replace gère de nombreux paramètres (inutilisés ici) et 2) elle n'est peut-être pas optimisée.
Enfin, la troisième méthode est efficace parce qu'elle charge toutes les données en mémoire, réalise les opérations sans gérer l'interface, puis décharge la mémoire dans la feuille en une passe.
Voilà...
Bonne nuit !
ROGER2327
 
Re : Convertir en format nombre

Bonjour

par curiosité, si tu veux aller plus loin, regarde l'impact d'un

application.scrennupdating=false
...
application.scrennupdating=true

qui t'annule le raffraichissement

Sinon, les macros générées en automatique ne sont pas optimisées et bien sûr, un calcul purement interne sut tableau se fait "à la vitesse du processeur"
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour