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 de traitement en masse des propriétés d'une plage [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Par défaut Optimisation de traitement en masse des propriétés d'une plage
    Bonjour à tous,

    Pour mettre en valeur une plage donnée, je renforce ses couleurs de fond comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cellule In MaPlage
         Cellule.Interior.Color = Cellule.Interior.Color + 328965
    Next Cellule
    Ca fonctionne très bien, à condition que la plage ne soit pas trop étendue, le For Each étant assez gourmand en ressources.

    J’ai donc eu l’idée de tester s’il était possible de transiter par un tableau, à la manière dont on le fait avec les données d’une plage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim MonTableau As Variant
     
    MonTableau = MaPlage.Interior.Color
     
    For i = LBound(MonTableau) To UBound(MonTableau)
         For j = LBound(MonTableau) To UBound(MonTableau)
              MonTableau(i, j) = MonTableau(i, j) + 328965
         Next j
    Next i
     
    MaPlage.Interior.Color = MonTableau

    Sauf que, comme on pouvait s’y attendre, ça ne fonctionne pas…

    Quelqu’un aurait une idée géniale pour optimiser les mises à jour de propriétés sans utiliser le For Each ?

    Merci,

  2. #2
    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,

    désactiver au moins l'affichage avant la boucle, voir dans l'aide VBA interne la propriété   ScreenUpdating   …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Salut Marc,

    Ou encore, comme ton code ne comporte aucun test If :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub demo()
    Dim MaPlage As Range
    Set MaPlage = Range("A1:Z200000")
    MaPlage.Interior.Color = MaPlage.Interior.Color + 328965
    End Sub
    ==> Moins de 1 seconde pour cette grande plage...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Par défaut
    Bonjour à tous les deux et merci de vos propositions,

    Pijaku :
    Oui c’est exact, moins d’une seconde ça n’est pas beaucoup lorsque l’action est unique
    En revanche, sur actions multiples par exemple déclenchées sur Worksheet_SelectionChange, ça peut ralentir les déplacements dans la feuille jusqu’à les saccader.
    Ca fonctionne, mais pour l’utilisateur, ça peut être désagréable
    C’est pourquoi je cherche tous les moyens d’optimisations possibles

    Marc :
    Même chose pour le ScreenUpdating, dans le principe c’est ce qu’il faut faire.
    Il faut néanmoins le tester, parce que lors de sa réactivation, il peut se révéler plus gourmand que s’il n’avait pas été sollicité.
    En fait, ça dépend, faut vérifier…

    Et puis, c’est aussi que ça me titille intellectuellement :
    Je suis sûr qu’il doit y avoir un moyen de récupérer toutes les valeurs des propriétés d’un objet d’un seul coup.
    Elles sont forcément stockées quelque part en mémoire sous la forme de tableau ou d’Array…

    Mais merci à vous quand même,

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Je suis sûr qu’il doit y avoir un moyen de récupérer toutes les valeurs des propriétés d’un objet d’un seul coup.
    C'est ce que fait la proposition de pijaku il me semble. Tu n'auras pas plus rapide, et dans tous les cas plus rapide qu'une boucle.
    A toi de revoir le fonctionnement prévu de ton appli en baissant les fonctionnalités.

    Même chose pour le ScreenUpdating, dans le principe c’est ce qu’il faut faire.
    Il faut néanmoins le tester, parce que lors de sa réactivation, il peut se révéler plus gourmand que s’il n’avait pas été sollicité.
    Un exemple concret pour étayer serait le bienvenu.

    T'es bizarre toi, tu demandes des améliorations et tu les rejettes toutes :-)
    eric

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    si ta plage est a la base et avant changement de la meme couleur alors pijaku t'a repondu

    si tes cellules ne sont pas de la meme couleur alors c'est rapé a part le screenupdating=false il n'y a rien d'autre
    surtout si on parle de milliers de cellules
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Par défaut
    Bonjour Patrick,

    Hé non, les différentes cellules de mes plages peuvent être de couleurs différentes
    Sinon, je n’aurais effectivement eu aucun souci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaPlage.Interior.Color = MêmeCouleurPartout
    De plus, je souhaite pouvoir revenir en arrière et rétablir les couleurs d’origine
    D’où la technique suivante par ajout ou retrait sur les couleurs

    Mise en valeur de la plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cellule In MaPlage
         Cellule.Interior.Color = Cellule.Interior.Color + 328965
    Next Cellule
    Retour à la normale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cellule In MaPlage
         Cellule.Interior.Color = Cellule.Interior.Color - 328965
    Next Cellule
    Mais si tu me confirmes que la boucle en For Each … Next est la meilleure solution, alors je vais la conserver.
    Elle fonctionne très bien, c’était juste pour chercher des optimisations possibles…

    Merci à tous,

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

Discussions similaires

  1. [10gR2] Traitement en masse des données
    Par alcos dans le forum PL/SQL
    Réponses: 5
    Dernier message: 23/07/2014, 04h47
  2. [SP-2007] Traitement en masses des librairies [via webservice et VBA]
    Par studying dans le forum SharePoint
    Réponses: 4
    Dernier message: 21/12/2012, 16h30
  3. Réponses: 1
    Dernier message: 21/05/2008, 20h23
  4. Réponses: 4
    Dernier message: 22/06/2007, 18h02
  5. [VB.NET] Ouvrir la boite des propriétés d'une imprimante
    Par Pierrick dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/09/2006, 22h00

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