IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Convertir en nombre sans plomber le CPU


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Par défaut Convertir en nombre sans plomber le CPU
    Bonjour,

    Dans mon boulot, il m'arrive d'extraire pas mal de données mal formatées que je dois adapter pour pouvoir les exploiter sous excel. J'ai fait pour cela la macro ci-dessous, mais elle met énormément de temps à tourner.
    Est-ce que des développeurs plus expérimentés pourraient m'indiquer comment faire la même chose en étant plus économe en ressources?

    Merci!
    Jules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub convertir_en_nombre()
    '
    ' convertir_en_nombre Macro
    '
     
    Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="*", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="€", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
     
    For Each Cellule In Selection
    Cellule.Value = Val(Cellule.Value)
    Next Cellule
     
    Selection.NumberFormat = "#,##0_);[Red](#,##0);* - _)"
     
    End Sub

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut

    ce sont probablement tes sélections successives qui sontr les responsables.
    Préfère-leur la référence directe aux plages concernées.

  3. #3
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour Jules.LT babaothe le forum .tu peus tester ce code relativement rapide!!! a adapter. pas le temps de tester toutes tes conditions.

    pour une colonne A pour l'exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub essai()
    Dim x As Variant, r As Long, c As Long
        With Application
        .Calculation = xlCalculationManual: .ScreenUpdating = False: .DisplayAlerts = False
        x = Range("a1", Cells(Rows.Count, "a").End(xlUp))
         For r = 1 To UBound(x, 1)
         For c = 1 To UBound(x, 2)
               x(r, c) = Replace(x(r, c), " ", "")
               x(r, c) = Replace(x(r, c), "€", "")
               x(r, c) = Replace(x(r, c), "*", "")
     
               x(r, c) = Val(x(r, c))
               'ou
               x(r, c) = x(r, c) * 1
       'pour le format idem   x(r, c) = format(x(r, c) ect...)
       Next c: Next r
       Range("a1", Cells(Rows.Count, "a").End(xlUp)) = x
      .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: .DisplayAlerts = True
      End With
    End Sub
    pour une selection !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub es()
    Dim x As Variant, r As Long, c As Long
         With Application
        .Calculation = xlCalculationManual: .ScreenUpdating = False: .DisplayAlerts = False
        x = Selection
         For r = 1 To UBound(x, 1)
         For c = 1 To UBound(x, 2)
          x(r, c) = Replace(x(r, c), " ", "")
               x(r, c) = Replace(x(r, c), "€", "")
               x(r, c) = Replace(x(r, c), "*", "")
     
               x(r, c) = Val(x(r, c))
               'ou
               x(r, c) = x(r, c) * 1
         'pour le format idem    x(r, c) = format(x(r, c) ect...)
        Next c: Next r
       Selection = x
       .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: .DisplayAlerts = True
       End With
    End Sub

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour à tous.

    Tu devrais gagner beaucoup de temps en passant par un tableau de valeurs si la plage à traiter est grande.

    Tu peux faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub subNettoie()
    Dim r As Excel.Range
    Dim v As Variant, i As Long, j As Integer
     
    Set r = Application.Selection
    v = r.FormulaLocal
     
    For i = 1 To UBound(v, 1)
        For j = 1 To UBound(v, 2)
            v(i, j) = Replace$(Replace$(Replace$(CStr(v(i, j)), " ", ""), "*", ""), "€", "")
            v(i, j) = Val(v(i, j))
        Next j
    Next i
     
    r.FormulaLocal = v
    r.NumberFormat = "#,##0_);[Red](#,##0);* - _)"
     
    Set r = Nothing
    End Sub
    Ici, j'ai considéré que la plage à traiter était sélectionnée, mais tu peux éviter en instanciant directement la variable d'objet r.
    A mettre au point.

    Cordialement,

    PGZ

  5. #5
    Membre averti
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Août 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2007
    Messages : 15
    Par défaut
    Merci beaucoup pour vos réponses!
    (désolé de ne pas avoir réagi plus vite, j'étais persuadé que je recevrais un mail du forum pour me prévenir mais l'option devait ê tre décochée)

    Je teste tout ça et je reviens vers vous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2014, 17h26
  2. [VB.NET] Convertir un nombre base 10 vers 9 sans 0
    Par Dayvid dans le forum Débuter
    Réponses: 0
    Dernier message: 24/05/2013, 18h25
  3. Réponses: 4
    Dernier message: 06/06/2004, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo