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 :

Appliquer un traitement cellulaire plus rapidement [XL-2000]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut Appliquer un traitement cellulaire plus rapidement
    Bonjour à toutes et à tous,

    le titre est pas super explicite, j'ai pas trouvé de façon d'expliquer brièvement ce que je voulais... Pour les courageux qui sont là je détaille donc !

    J'ai actuellement un code qui transpose des valeurs d'une feuille à une autre.
    Sauf qu'Excel me fait n'importe quoi... Enfin pas tout à fait mais...
    Il me copie les valeurs en tant que Chaînes de caractères et ce quelque soit le format d'origine ou de destination.
    Par exemple 41,7 sera retranscris 41,7 dans ma colonne destination de type Number(2) mais ce n'est pas un chiffre ! Si j'édite la valeur sans rien modifier et que je valide avec entrée j'obtiens alors 41,70 qui lui est bien un chiffre...
    Et c'est ce fonctionnement manuel que je n'ai pas réussi jusqu'à maintenant à reproduire convenablement. J'ai bien tenté l'enregistrement d'une macro du procédé mais elle ne fait absolument rien.

    J'ai alors joué du format à la mano :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cell As Range
    For Each cell In Range("Q" + CStr(conf.lastRowOfData) + ":W" + CStr(conf.lastRowOfData + (endCell - 7) - 1))
            cell.FormulaR1C1 = CDec(cell.Value)
    Next cell
    Sauf que cellule par cellule c'est... Une horreur ! Sur 400 lignes j'ai le temps d'aller prendre au moins deux cafés, bref ce n'est pas viable. (Et encore je ne travaille que sur les lignes ajoutées et non pas tout le classeur, j'ai donc limité la casse...)

    Pour information voilà ce que j'utilise pour la copie si un début de piste peut être pris par là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Worksheets(conf.tmpSheet).Range("A7", "Z" + CStr(endCell - 1)).copy
    Worksheets(conf.finalBenchSheet).Activate
        Range(lib.toLetter(firstCellOfData.column) _
        + CStr(conf.lastRowOfData), lib.toLetter(firstCellOfData.column + 25) _
        + CStr(conf.lastRowOfData + (endCell - 7) - 1)).PasteSpecial xlValues
    Quelqu'un aurait-il une piste à me proposer pour améliorer cela ?

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Sans code en entier, difficile de te répondre, néanmoins quelques conseils

    1. Évites les Activate, Select, Selection, Activecell...
    2. Utilises en début du code (juste après les déclarations)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    et à la fin (juste avant End Sub)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    3. Le mieux est d'utiliser les variables tableaux

  3. #3
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour,

    c'est peut-être ridicule de te demander cela, mais, pour accélérer ton code version 1 as tu bien pensé à mettre ceci avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Application.ScreenUpdating = False
    et remettre à True après.

    Mais je suppose que bien sûr tu y auras pensé.
    -------Edit------ Grillé par Mercatog.

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    J'aurai du préciser aussi que je ne connais absolument pas Excel.

    J'ai tenté ces configurations mais cela n'apporte rien rien sur les cellules qui me posent problème, pire encore cela empêche toutes les formules de la feuille de s'exécuter.

    Évites les Activate, Select, Selection, Activecell...
    Autre chose à proposer ?

    Sinon concernant le code bah... J'ai donné tout le code concerné.
    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
    Sub copyParsedValues()
     
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
        End With
     
        ' Copy and paste the values into the benchOS sheet
        Worksheets(conf.tmpSheet).Range("A7", "Z" + CStr(endCell - 1)).copy
        Worksheets(conf.finalBenchSheet).Activate
        Range(lib.toLetter(firstCellOfData.column) _
        + CStr(conf.lastRowOfData), lib.toLetter(firstCellOfData.column + 25) _
        + CStr(conf.lastRowOfData + (endCell - 7) - 1)).PasteSpecial xlValues
     
        Dim cell As Range
        For Each cell In Range("Q" + CStr(conf.lastRowOfData) + ":W" + CStr(conf.lastRowOfData + (endCell - 7) - 1))
            cell.FormulaR1C1 = CDec(cell.Value)
        Next cell
        For Each cell In Range("Y" + CStr(conf.lastRowOfData) + ":AA" + CStr(conf.lastRowOfData + (endCell - 7) - 1))
            cell.FormulaR1C1 = CDec(cell.Value)
        Next cell
     
        ' Set the cursor on the first new row
        Range(lib.toLetter(firstCellOfData.column) + CStr(conf.lastRowOfData)).Select
     
        ' Delete temp sheet
        Application.DisplayAlerts = False
        Worksheets(conf.tmpSheet).Delete
        Application.DisplayAlerts = True
     
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
        End With
     
    End Sub
    Ce n'est que la copie d'une feuille ordinaire (pas de formule, pas de format si ce n'est des essais manuels) vers une autre feuille (qui elle dispose d'autres champs avec formules et d'autres résultats).

  5. #5
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Bon en cherchant dans mon coin j'ai trouvé une façon de faire qui est instantanée (du moins pour moins de 3000 lignes).

    J'ai dupliquée toutes mes cellules concernées, puis dans les cellules originales j'ai appliquée la formule suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CNUM(ADRESSECELLULEDUPLIQUEE)
    Bien sûr j'ai découpé mon copy/pasteSpecial en deux zones.
    Plus qu'à masquer les cellules dupliquées et hop le tour est joué.

    Je suis toujours preneur d'informations cependant sur comment éviter les opérations telles que Activate, Select, Selection, Activecell.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pour éviter les Activates
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Worksheets(X).Range(A).Copy
    Worksheets(Y).Activate
    Range(B).PasteSpecial xlValues
    Application.ScreenUpdating = False
    Sans activer la feuille Y, je ferai directement comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Worksheets(X).Range(A).Copy
    Worksheets(Y).Range(B).PasteSpecial xlValues
    Application.ScreenUpdating = False
    Et si les ranges A et B sont de même taille (même nombre de lignes et même nombre de colonnes), sans passer par le presse papier, je ferai comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(Y).Range(B).Value = Worksheets(X).Range(A).Value

  7. #7
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Merci pour l'astuce.

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

Discussions similaires

  1. recherche arborescence plus rapide
    Par e-steel dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 30/01/2006, 16h22
  2. Réponses: 16
    Dernier message: 19/05/2005, 16h20
  3. [FB1.5]Quelle est la requete la plus rapide ?
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 10/12/2004, 13h46
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

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