Formater des chiffres

Bonjour à tous,

Je suis en train de créer plusieurs macro pour retraiter automatiquement des données issues d'un système tiers.

Je reçois de ce système des valeurs avec des "." comme séparateurs décimaux (que je cherche à remplacer par des virgules) et également, ces chiffres sont vus par excel comme du texte (j'ai alors la petite icone me demandant si je souhaite les convertir en chiffres). Enfin, je cherche à formater ces chiffres (décimal deux digits ou currency Euro).

A date, j'ai créé ces deux macros :

Sub Clean_data()
' Macro pour remplacer les points par des virgules
   Sheets("RAW from system").Select
   Range("E2:R2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Range("B2").Select
End Sub
Sub Format_numbers()
' Macro pour formater les nombres'
    Sheets("RAW from system").Select
    Range("G:G,H:H,J:J,L:L,N:N,P:P,Q:Q,R:R,T:T,U:U,V:V,W:W,X:X,Y:Y,Z:Z,AA:AA").Select
    Range("AA1").Activate
    Selection.Style = "Currency"
    Range("E:E,F:F,M:M,O:O,S:S").Select
    Range("S1").Activate
    Selection.Style = "Comma"
    Range("B2").Select
End Sub

J'arrive donc à répondre au point 1/ (remplacer "." par ",") et au point 2/ (formater les nombres en chiffres ou en euro)

Le problème est donc pour le point 2/, je n'arrive pas à créer une macro qui va venir convertir le texte en "chiffre".

J'ai lu pas mal de messages identiques mais sans jamais réussir à trouver un code qui réponde à ce souhait, j'espère donc que vous allez pouvoir m'aider (je n'en doute pas )

Et pour couronner le tout, est ce que vous savez s'il est possible de mettre une ligne de code disant que si le format (tous les paramètres, virgules, deux digit et stocké sous format nombre) est déjà respecté, Excel ne doit pas traiter cette ligne (pour optimiser les temps de traitements)?

Un grand merci par avance pour votre aide

Bonne journée

Pierre

Bonjour pedrosummer, le forum,

je n'arrive pas à créer une macro qui va venir convertir le texte en "chiffre".

Un exemple ci-joint, en espérant que cela t'aidera...

8classeur1.xlsm (17.76 Ko)

Cordialement,

Merci pour ta réponse

J'ai modifié le code pour l'adapter à mon fichier:

dl = .Range("E:R" & Rows.Count).End(xlUp).Row

mais j'ai une erreur. En fait je veux jouer cette macro uniquement sur les colonnes E à R

Comment dois-je corriger le code en conséquence?

Merci encore

Re,

Sub Bouton1_Cliquer()

 Dim dl As Integer, c As Range

  With Sheets("Feuil1")
   dl = .Range("A" & Rows.Count).End(xlUp).Row
    For Each c In .Range("E1:R" & dl)
     c.Value = CDbl(c.Value)
    ' c.Value = val(c.Value)
    Next c
  End With
End Sub

Cordialement,

Merci pour ta réponse

Le code fonctionne avec la deuxième ligne

c.Value = Val(c.Value)

Par contre, une fois que la macro tourne, les chiffres sont convertis sans les 2 décimales après la virgule, comment puis-je faire pour garder cette information?

Un grand merci encore une fois

Bonjour pedrosummer,

Merci pour ton retour,

Par contre, une fois que la macro tourne, les chiffres sont convertis sans les 2 décimales après la virgule, comment puis-je faire pour garder cette information?

Il faut peut-être préciser le format des cellules (je n'ai pas ce problème chez moi...).

A tester....

Sub Bouton1_Cliquer()

 Dim dl As Integer, c As Range

 Application.ScreenUpdating = False
  With Sheets("Feuil1")
   dl = .Range("A" & Rows.Count).End(xlUp).Row
    For Each c In .Range("E1:R" & dl)
     c.Value = Val(c.Value)
     c.NumberFormat = "0.00"
    Next c
  End With
 Application.ScreenUpdating = True
End Sub
7classeur1-1.xlsm (20.05 Ko)

Cordialement,

Merci pour ta réponse

Cela ne marche pas

Le temps de traitement est en plus très long

En fait, voici un fichier d'exemple, ce sera sans doute beaucoup plus simple...

L'idée est de convertir les données des colonnes E à R en chiffres avec deux décimales (sachant que dans l'exemple j'ai uniquement 15 lignes mais chaque jour je rajoute des lignes...)

Est ce que vous pouvez m'aider quant au code qu'il faut crééer pour y arriver?

Désolé mais je n'y arrive pas malgré mes nombreux essais...

un grand merci

4test.xlsx (10.03 Ko)

Re,

Cela ne marche pas

Tu es sûre ?

Le temps de traitement est en plus très long

Pour 2000 lignes à traiter : à peine 8 secondes....c'est vrai que c'est un peu long, je l'admets,

Je ne peux pas faire mieux, je passe donc la main....

6test-3.xlsm (119.09 Ko)

Bonne soirée,

Re,

Une dernière tentative....en utilisant une variable tablo.....chez moi le traitement est immédiat,

Sub Bouton1_Cliquer()

Dim Montab As Variant, cmpt1 As Long, cmpt2 As Long

 With Sheets("Sheet1")
  Montab = Range("E3:R" & .UsedRange.Rows.Count + 1).Value
   For cmpt1 = LBound(Montab, 1) To UBound(Montab, 1)
    For cmpt2 = LBound(Montab, 2) To UBound(Montab, 2)
        Montab(cmpt1, cmpt2) = Val(Montab(cmpt1, cmpt2))
    Next cmpt2
   Next cmpt1

   Range("E3:R" & .UsedRange.Rows.Count + 1).Value = Montab
   Range("E3:R" & .UsedRange.Rows.Count + 1).NumberFormat = "0.00"
 End With
End Sub
2test-4.xlsm (118.30 Ko)

Cordialement,

Un grand merci xorsankukai pour ton aide, je suis reparti de ton fichier "test 3" et cela fonctionne

Et le temps de traitement n'était pas lié à ton code, c'est juste que j'avais une petite dizaine de colonnes ad'hoc avec des recherchev, d'où le temps de traitement élevé chez moi

C'est donc parfait, merci encore

J'ai une dernière question, j'ai un autre onglet quasi similaire mais pour le coup, là, je voudrais uniquement appliquer ce traitement sur les colonnes C,D et G (donc pas un range continu de colonnes).

Sais-tu comment je dois modifier le code pour qu'il fonctionne avec cette nouvelle contrainte?

Merci et bonne journée

Bonjour pedrosummer,

Merci pour ton retour,

J'ai une dernière question, j'ai un autre onglet quasi similaire mais pour le coup, là, je voudrais uniquement appliquer ce traitement sur les colonnes C,D et G (donc pas un range continu de colonnes).

Sais-tu comment je dois modifier le code pour qu'il fonctionne avec cette nouvelle contrainte?

Un essai:

Sub Bouton1_Cliquer()

 Dim c As Range, plage1 As Range, plage2 As Range

 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
  With Sheets("Sheet1")
   Set plage1 = .Range("C3:D" & .UsedRange.Rows.Count + 1)
   Set plage2 = .Range("G3:G" & .UsedRange.Rows.Count + 1)

    For Each c In Range(plage1, plage2)
     c.Value = Val(c.Value)
     c.NumberFormat = "0.00"
    Next c
  End With
 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub
5test-5.xlsm (136.43 Ko)

Cordialement,

merci, c'est parfait tout fonctionne

un énorme merci c'est top

bonne journée

Rectification, cela me scrapp quand même le format des colonnes E et G alors que je veux les laisser sur le format initial HELPPPPPP

Bonjour pedrosummer,

Rectification, cela me scrapp quand même le format des colonnes E et G alors que je veux les laisser sur le format initial

Oups ! J'e n'avais pas fait attention,

je voudrais uniquement appliquer ce traitement sur les colonnes C,D et G

Un nouvel essai....

Sub Bouton1_Cliquer()

 Dim c As Range, plage As Range, plage1 As Range, plage2 As Range

 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
  With Sheets("Sheet1")
   Set plage1 = .Range("C3:D" & .UsedRange.Rows.Count + 1)
   Set plage2 = .Range("G3:G" & .UsedRange.Rows.Count + 1)
   Set plage = Union(plage1, plage2)
    For Each c In plage
     c.Value = Val(c.Value)
     c.NumberFormat = "0.00"
    Next c
  End With
 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub
4test-6.xlsm (135.15 Ko)

Cordialement,

Merci encore une fois, c'est parfait cela fonctionne bien

Merci et très bonne journée

Rechercher des sujets similaires à "formater chiffres"