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 :

Optimisation exécution de code : suppression espace de fin sur plage de données


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    83
    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 : 83
    Par défaut Optimisation exécution de code : suppression espace de fin sur plage de données
    Bonjour,
    après avoir ouvert une discussion, mais sur le mauvais forum, maintenant résolue :
    http://www.developpez.net/forums/d14...-l-espace-fin/
    je sollicite votre aide pour savoir qu'elle est l'optimisation maximale que je peux atteindre pour enlever le dernier caractère d'une plage de cellules si c'est un espace.

    Je passe mes hésitations du début :
    1) imbrication de 2 boucles For
    2) itération For Each
    Rien d'intéressant, le traitement se faisait en plus d'une minute.

    Ensuite, j'ai cherché à faire un rechercher/remplacer, mais ne sachant pas comment trouver l'espace dans Excel, je suis passé par un traitement sous Word : traitement fait en 2s environ.

    Finalement, on m'a conseillé d'utiliser une variable de type Tableau, qui je suppose réside en RAM, sur lequel le traitement est bien plus rapide que de passer par un sondage cellule par cellule d'Excel.
    J'en suis donc à un traitement en 0.05859s ce qui est sans commune mesure avec mes résultats initiaux.

    Extrait de mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dtDeb = Timer
     
        Montab = Range("A4:G" & NbLig).Value
        For R = LBound(Montab, 1) To UBound(Montab, 1)
            For C = LBound(Montab, 2) To UBound(Montab, 2)
                Montab(R, C) = RTrim(Montab(R, C))
            Next C
        Next R
        Range("A4:G" & NbLig).Value = Montab
    MsgBox ("Durée d'exécution : " & Timer - dtDeb & "secondes.")
    Pour faire le test, j'utilise les données issues en bas de cette page que je copie/colle dans Excel en A4 avant exécution du nettoyage :
    http://badmania.fr/club-Flume+Ille+Badminton-1900

    On m'a dit que c'était encore optimisable, curieux par nature, j'attends vos propositions d'amélioration.

    Merci d'avance de votre support,
    Poussemousse

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Poussemousse,

    Si je comprends bien, tu veux optimiser une macro qui tourne en 0.05859 sec ?

    Cordialement,
    Kimy

  3. #3
    Membre confirmé
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    83
    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 : 83
    Par défaut
    Citation Envoyé par Kimy_Ire Voir le message
    Bonjour Poussemousse,

    Si je comprends bien, tu veux optimiser une macro qui tourne en 0.05859 sec ?

    Cordialement,
    Kimy
    J'ai été challengé par Marc_L, voir sa dernière réponse sur mon lien initial :
    Citation Envoyé par Marc-L Voir le message
    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 …
    Je n'ai plus de problème de temps d'exécution, mais c'est toujours intéressant de savoir ce qu'on peut gagner dans l'hypothèse où la quantité des données à traiter augmente.

  4. #4
    Membre émérite

    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
    Par défaut
    Bonjour,

    Sur le fil en question, je t'avais proposé une solution par variable-tableau qui t'offrais une durée de 0,046 secondes pour 400 lignes...
    Pas de réponse de ta part -très sympa -mais peut-^tre as tu confondu les contributeurs car je ne vois nulle part d'autres propositions avec cette technique sur cette discussion

  5. #5
    Expert éminent
    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
    Par défaut

    Bonjour,

    c'est exact, je l'ai bien titillé :

    Citation Envoyé par Marc-L Voir le message
    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) …
    Du reste je ne comprends pas sur ce message pourquoi on m'a collé un vote négatif !
    Donc je persiste et signe : possible sans boucle ni variable tableau via le B-A-BA d'Excel : une fonction de feuille de calculs !
    Manuellement il ne m'a pas fallu plus d'une douzaine de secondes et avec l'Enregistreur de macros,
    le squelette du code est livré aussi rapidement !

    Comme je n'ai pas enregistré mon test et que j'entrevois une variante,
    je vais vérifier de nouveau puis te proposer un bonus, patience donc !

    Edit : pas besoin de classeur source vu le lien sur le site que je n'avais pas vu …

    __________________________________________________________________________________________________
    Tous unis, tous Charlie

  6. #6
    Expert éminent
    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
    Par défaut

    Avant d'écrire la première ligne de code VBA, se poser d'abord la question :
    « Excel dispose-t-il d'une fonction permettant de résoudre mon besoin, même partiellement ? »

    Quand la réponse est affirmative, nombre d'usines à gaz pures VBA sont évitées !

    Ici, y-a-t-il une fonction permettant de supprimer l'espace en fin d'une plage de cellules ?
    Rien que par la consultation de l'aide d'Excel - et pas celle du VBA - des fonctions manipulant du texte,
    il y en a une qui est plutôt explicite : SUPPRESPACE !

    Sachant que même dans une version française les fonctions et le VBA reste nativement en anglais,
    voici comment s'en sortir s'en se perdre sur le net !

    Laisser une colonne vide après les données et par exemple saisir cette formule de calculs dans la cellule L2 :

    =SUPPRESPACE(A2)

    Dans la fenêtre Exécution du VBE entrer ? [L2].FormulaR1C1 et valider : la formule native apparait en dessous !

    Le code utilise donc juste cette formule native sans boucle ni même une variable tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Demo1()
        Application.ScreenUpdating = False
     
        With Feuil1.Cells(1).CurrentRegion.Columns(1).Offset(, 11)
                    .FormulaR1C1 = "=TRIM(RC[-11])"
            .Offset(, -11).Value = .Value
            .Clear
        End With
    End Sub
    Comme annoncé, exécution immédiate en moins de dix lignes de code ‼
    Les fonctions d'Excel étant déjà compilées, toute opération VBA est interprétée et donc forcément plus longue …

    __________________________________________________________________________________________________
    Il n'y a pas que les aigles qui atteignent les sommets, les escargots aussi mais ils en bavent !

  7. #7
    Membre confirmé
    Homme Profil pro
    Bénévole super actif pour association sportive
    Inscrit en
    Février 2015
    Messages
    83
    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 : 83
    Par défaut
    Citation Envoyé par Michel_M Voir le message
    Bonjour,

    Sur le fil en question, je t'avais proposé une solution par variable-tableau qui t'offrais une durée de 0,046 secondes pour 400 lignes...
    Pas de réponse de ta part -très sympa -mais peut-être as tu confondu les contributeurs car je ne vois nulle part d'autres propositions avec cette technique sur cette discussion
    Désolé Michel de ne pas t'avoir personnellement remercié de ta contribution.
    Je n'ai pu comprendre ta réponse codée, qu'avec le lien de Marc qui explique comment travailler avec les tableaux.
    J'ai fait un mixte des 2, et vous ai mis à chacun un "+1".

    Sans rancune, la prochaine fois je ferai plus attention.

Discussions similaires

  1. [XL-2007] enlever un espace de fin sur chaque cellule en vba
    Par jords dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/06/2012, 17h44
  2. [PowerShell] Comment récupérer le code d'erreur à la fin d'exécution d'une commande ?
    Par spynux dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 26/11/2010, 10h18
  3. Exécuter un code javascript lors du clique sur un textbox
    Par krolis dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 31/03/2010, 16h46
  4. Réponses: 12
    Dernier message: 09/06/2009, 11h26
  5. [Animation] Comment exécuter du code à la fin d'une animation ?
    Par Finality dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/10/2008, 12h44

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