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

Excel Discussion :

Accélérer le traitement de suppression de l'espace de fin [XL-2010]


Sujet :

Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Bénévole super actif pour association sportive

    Informations forums :
    Inscription : Février 2015
    Messages : 64
    Points : 66
    Points
    66
    Par défaut Accélérer le traitement de suppression de l'espace de fin
    Bonjour,

    J'ai dans une macro une vérification que chaque cellule de ma plage se terminant par un espace, est remplacée par la même valeur mais sans l'espace.

    J'ai donc utilisé une imbrication de 2 boucles, mais dès que des espaces sont trouvés ça devient long :
    Extrait de code :
    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
     
            R = 4
            C = 1
            Do
                Do
                    If Right(Cells(R, C).Value, 1) = " " Then
                        Cells(R, C).Value = Left(Cells(R, C).Value, Len(Cells(R, C).Value) - 1)
                    End If
                    C = C + 1
                Loop While (C < 8)
                R = R + 1
                C = 1
                Application.StatusBar = "Soyez patient..." & Round((R - 4) / (NbLig - 4) * 100, 0) & "%"
            Loop While (R < NbLig)
            Application.StatusBar = ""
    Est-ce que quelqu'un aurait une idée pour accélérer ce traitement : jusqu'à 2 minutes pour une plage de 400 lignes * 8 colonnes ! d'où le rajout dans la barre de statut du %age d'avancement.

    Merci

  2. #2
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Salut,
    Petite visite dans les contributions : http://www.developpez.net/forums/d11...-trim-tableau/
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  3. #3
    Membre averti
    Homme Profil pro
    Ctrl Gestion
    Inscrit en
    Octobre 2011
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ctrl Gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 172
    Points : 356
    Points
    356
    Par défaut
    Bonjour Poussemousse, NVCfrm, Le Forum

    Déjà eu un problème de ce genre à traiter et sur un fichier de 10000 lignes et 8 colonnes, temps de traitement d'environ 15 secondes. Peut-être y a-t-il autre méthode plus rapide, à voir je vais suivre le fil.


    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
     
    Sub SuppimerEspace()
      Dim dtDeb As Date, dtFin As Date
      Dim i As Integer
     
      Application.ScreenUpdating = False
      dtDeb = Now
      Cells(1, 1).Select
      Do While Not IsEmpty(ActiveCell.Value)
        For i = 1 To 8
          Cells(ActiveCell.Row, i).Value = Trim(Cells(ActiveCell.Row, i).Value)
        Next
        ActiveCell.Offset(1, 0).Select
      Loop
      dtFin = Now
      Application.ScreenUpdating = True
      MsgBox dtDeb & Chr(13) & dtFin
    End Sub
    Slts

  4. #4
    Membre averti
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Points : 442
    Points
    442
    Par défaut plus vite...
    .... une idée pour accélérer ce traitement : jusqu'à 2 minutes pour une plage de 400 lignes * 8 colonnes ! d'où le rajout dans la barre de statut du %age d'avancement.....
    Bonsoir,

    J'ai essayé avec l'itération for each et cela semble très rapide, j'ai fait un essai avec 643 lignes avec toutes les cellules avec un espace.

    voilà mon code, il faudrait rendre vaviable le nombre de lignes en utilisant "Range.end(xlup)" par exemple et recalculer le % en comptant les cellules.
    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
    Sub essai()
     
    Dim Nblig As Integer
     
    Dim plage As Range, Cel As Range
     
    Set plage = Range("A4:H643")
     
    For Each Cel In plage
        If Right(Cel.Value, 1) = " " Then
            Cel.Value = Left(Cel.Value, Len(Cel.Value) - 1)
        End If
    Next Cel
    Application.StatusBar = "Soyez patient..."
    Application.StatusBar = ""
    End Sub
    le fichier :espaces2.xlsm

    a++
    geogeo70

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Autre alternative à adapter:

    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
    Sub Subst_test()
     
    Dim InpRng As Range, Cl As Range
     
    Set InpRng = ThisWorkbook.Worksheets(1).Range("B1").CurrentRegion.Columns(1)
    Debug.Print InpRng.Address
     
    ' Si il n'y a pas d'autres ' ', il vaut mieux faire un replace sur le range
    InpRng.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
     
    ' Autrement, voir les autres propositions
    For Each Cl In InpRng.Cells
        If Right(Cl.Value, 1) = " " Then Cl.Value = Left(Cl.Value, Len(Cl.Value) - 1)
    Next Cl
     
    End Sub
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  6. #6
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, comme indiqué plus haut : Trim$

  7. #7
    Membre du Club
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Bénévole super actif pour association sportive

    Informations forums :
    Inscription : Février 2015
    Messages : 64
    Points : 66
    Points
    66
    Par défaut
    Bonsoir à tous qui avez apporté votre soutien à mon problème.

    Après différents essais, voici mes résultats chronométrés :
    Ma double boucle de base avec équation de remplacement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     R = 4
            C = 1
            Do
                Do
                    If Right(Cells(R, C).Value, 1) = " " Then
                        Cells(R, C).Value = Left(Cells(R, C).Value, Len(Cells(R, C).Value) - 1)
                    End If
                    C = C + 1
                Loop While (C < 8)
                R = R + 1
                C = 1
               Application.StatusBar = "Soyez patient..." & Round((R - 4) / (NbLig - 4) * 100, 0) & "%"
           Loop While (R < NbLig)
    = 1min 16s


    Méthode de geogeo70
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       Set Rplage = Range("A4:G" & NbLig)
     
    For Each Cel In Rplage
        If Right(Cel.Value, 1) = " " Then
            Cel.Value = Left(Cel.Value, Len(Cel.Value) - 1)
        End If
    Next Cel
    = 1min 26


    Méthode mixte danixdb/geogeo70 en remplaçant le Trim par RTrim =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cel In Rplage
        Cel.Value = RTrim(Cel.Value)
    Next Cel
    =1min 29

    Si quelqu'un a réussi à faire 1000 lignes avec 8 colonnes en 15s je dois changer de machine (je n'ai qu'un Intel Core(TM)2 Quad CPU @2.50Ghz)...

    Pour aller très vite, je crois qu'il ne me reste plus qu'à prendre mon texte, le copier puis coller dans Word et faire un Remplacer "^t " par "^t" suivi d'un Remplacer "^p " par "^p".
    ce qui se fait en 1 à 2 secondes, puis revenir dans Excel et recoller les valeurs.

    Un nouveau conseil SVP ?

  8. #8
    Membre du Club
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Bénévole super actif pour association sportive

    Informations forums :
    Inscription : Février 2015
    Messages : 64
    Points : 66
    Points
    66
    Par défaut
    Bon j'ai fini par écrire un peu de VBA Word et ça marche impeccablement : 2 secondes au lieu de 90 à 95s sous Excel...
    Nom : 2s_execution.JPG
Affichages : 275
Taille : 18,0 Ko
    Le code est moins compact, mais comme il n'y a plus de boucle c'est bien plus efficace.

    Pour danixdb qui était intéressé par le fil, voilà le morceau de code à insérer dans Excel.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
       Dim WordDoc As Word.Document
       Dim WordApp As Word.Application
    .....
    .....
     'ouvre session word
        Set WordApp = New Word.Application
        'word est masqué pendant l'opération
        WordApp.Visible = False
     
        ' Création d'un nouveau document :
        Set WordDoc = WordApp.Documents.Add
     
        ' Collage sous forme de texte simple du texte comprenant les espaces à supprimer,
        ' qui dans Excel sont en fin de cellule, ce qui correspond sous Word à devant une tabulation "^t" ou une marque de paragraphe "^p"
        WordApp.Selection.PasteSpecial DataType:=wdPasteText, DisplayAsIcon:=False
     
        ' Suppression des espaces devant Tabulation
        WordApp.Selection.Find.ClearFormatting
        WordApp.Selection.Find.Replacement.ClearFormatting
        With WordApp.Selection.Find
            .Text = " ^t"
            .Replacement.Text = "^t"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        WordApp.Selection.Find.Execute Replace:=wdReplaceAll
     
        ' Suppression des espaces devant marque de paragraphe
        With WordApp.Selection.Find
            .Text = " ^p"
            .Replacement.Text = "^p"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        WordApp.Selection.Find.Execute Replace:=wdReplaceAll
     
        ' Tentative de masquage des Alertes (sans succès) !!!
        ' Je sélectionne tout et copie le texte sans les espaces dans le presse-papier
        With WordApp
            .DisplayAlerts = wdAlertsNone
            .Selection.WholeStory
            .Selection.Copy
        End With
     
        ' Collage de retour dans Excel
        Range("A4").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
     
        ' Fermeture du document Word sans sauvegarde
        WordDoc.Close False
     
        'Comme le WordApp.Application.DisplayAlerts = False ne fonctionne pas, problème Office 2010 ?
        'je force le vidage du presse papier avant de quitter l'application, ce qui m'évite le message d'alerte
        Set objTexte = New DataObject
        objTexte.SetText ""
        objTexte.PutInClipboard
        Set objTexte = Nothing
     
        WordApp.Quit
        Set wdDoc = Nothing
        Set wdApp = Nothing
    J'attends encore un peu avant de clore le fil, au cas où quelqu'un aurait la recette miracle dans Excel, qui pour une fois, se fait battre par Word...

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Bonjour

    adapter les adresses de celules
    400 lignes, 8 colonnes en 0,046 secondes
    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
    23
    24
    25
    26
    Option Explicit
    Option Base 1
    '--------
    Sub supprimer_espace_fin()
    Dim Derlig As Integer, T_in
    Dim col As Byte, Lig As Integer, T_out
    Dim Start As Single
    'Dim xxx 'test
    'initialisations
        Start = Timer
        Application.ScreenUpdating = False
        Derlig = Columns("A").Find("*", , , , , xlPrevious).Row
        T_in = Range("A1:I" & Derlig)
        ReDim T_out(Derlig, 8)
    'traitement
        For Lig = 1 To UBound(T_in)
            For col = 1 To 8
                T_out(Lig, col) = Trim(T_in(Lig, col))
                'xxx = Len(T_out(Lig, col)) test de suppresssion
            Next
        Next
    'restitutrion
    Range("A1").Resize(UBound(T_out), 8) = T_out
    Application.ScreenUpdating = True
    MsgBox "durée: " & Timer - Start & " .sec"
    End Sub
    Michel_M

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Bonjour, bonjour !

    Plusieurs possibilités comme par exemple Utiliser les variables tableaux
    Voir les exemples dans le bon forum, là où il y a le plus de passage, ici c'est celui des formules de calculs !

    Peut aussi s'effectuer sans boucle via une fonction de feuille de calculs en moins de dix lignes de code,
    exécution inférieure à 0,04s pour 1000 lignes de 8 colonnes (tout dépend aussi du processeur) …


    __________________________________________________________________________________________________
    Tous unis, tous Charlie
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Membre du Club
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Bénévole super actif pour association sportive

    Informations forums :
    Inscription : Février 2015
    Messages : 64
    Points : 66
    Points
    66
    Par défaut
    Merci Marc,
    je ne connaissais pas cette possibilité de passer par un tableau "copie" du Tableau Excel.
    Bilan :
    Nom : 0s_execution.JPG
Affichages : 231
Taille : 15,1 Ko

    Je clos ce fil, encore un grand merci à la communauté pour le temps passé à aider ceux qui peinent.

    Poussemousse

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    De rien mais l'autre solution demande moins de lignes de code (<10) et pourrait s'avérer plus rapide !

    Si cela t'intéresse, ouvre une nouvelle discussion dans le bon forum, celui dédié au VBA Excel,
    en y postant ta solution actuelle et après tu pourras comparer …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

Discussions similaires

  1. [XL-2010] Suppression d'un "espace" en fin de saisie
    Par Alambik69 dans le forum Excel
    Réponses: 3
    Dernier message: 10/04/2012, 08h28
  2. Accélérer le traitement d'un array
    Par Kaliseo dans le forum Langage
    Réponses: 2
    Dernier message: 02/09/2008, 09h23
  3. Réponses: 2
    Dernier message: 18/03/2008, 09h51
  4. Suppression d'un espace dans une cellule excel
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/02/2008, 08h45
  5. Suppression d'un espace (=blanc) entre deux mots
    Par Echizen1 dans le forum Access
    Réponses: 18
    Dernier message: 10/04/2006, 17h51

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