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 :

Parcours de plage de cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut Parcours de plage de cellule
    Bonjour,
    Je récupère un code qui met du temps à s'exécuter et je cherche à le rendre plus rapide. Mon problème est que je connais pas le VBA.
    En lisant, la FAQ, il est montré comment parcourrir une plage de manière plus rapide en évitant l'énumération .
    Mon souci est que dans le code, dans le parcours des cellules, il est utilisé et la valeur et la cellule. Y'a-t-il un moyen de travailler sur la valeur et la cellule en utilisant la méthode pré décrite.
    Voici un petit bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                    For Each point_cell In cdp.Cells
                        If point_cell.Value <> " " Then
                            If IsInRange(Range(Plage.item(1)), point_cell) Then
    Comme écrit dans le code précédent, il est utilisé point_cell et point_cell.Value
    Cordialement
    Pinocchio

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    bonjour,
    tu peux éviter le for each déjà, mais peux-tu juste nous donner la fin du code (en virant l'inutile ou le confidentiel) pour qu'on sache ce que tu testes par la suite dans ton code
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    Bonjour,
    Pour commencer, excusez-moi du retard mais n'ayant plus de cnx internet chez moi et ne travaillant pas vendredi, je n'ai pas pu vous répondre plus tôt.
    Citation Envoyé par jpcheck Voir le message
    tu peux éviter le for each déjà
    Comment svp, vu que c'est une boucle de l'ensemble des cellules?

    Citation Envoyé par Gorfael
    tu peux expliquer ce que tu essaies de faire ?
    Je ne comprends pas ton code et n'ai pas d'aide sur InIsRange
    CDP est le nom "informatique" d'une feuille ? d'une variable Range ?
    Ta logique n'échappe : tu dis que tu ne connais pas le VBA, mais tu demandes d'adapter un bout de code pour qu'il aille plus vite.
    Ne serait-il pas plus logique d'exposer le problème précisant éventuellement comment, toi, tu penses le résoudre ?
    Pour répondre aux différentes questions.
    1) Pardon, je remets plus de code car en effet pas forcément explicite :
    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
            For Each comtextplage In Comment_Plage 'Comment_Plage est une collection de plage de cellule contenant des valeurs
     
                Set cdp = Range(Commentaire_Data_Plage.item(complage_index))
     
                    c_index = 0
                    Dim comment As LROComment   'LROComment est un type de commentaire en Essbase
                    Dim ciblecol As Collection
     
                    For Each point_cell In cdp.Cells 'Je parcours la liste des cellules de la plage en cours du For each
                        c_index = c_index + 1
                        If point_cell.Value <> " " Then 'Je vérifie si la valeur n'est pas un espace (valeur fixé comme telle)
     
                            Set ciblecol = New Collection
                            Set comment = New LROComment
                            Set ctp = Range(comtextplage) 'Je récupère la plage
                            If IsInRange(Range(Plage.item(1)), point_cell) Then 'IsInRange permet de vérifier si point_cell fait partie de la plage Plage.item(1)
                                Call GetDataPoint(Plage.item(1), point_cell, ciblecol) 'Récupère la valeur nécessaire pour essbase
                                comment_text = ctp.Cells.Value
                                Call comment.SetupComment()
                                If comment.comment_text <> "" Then
                                    Commentaire.Add item:=comment
                                End If
                           End If
                        End If
                    Next point_cell
                    complage_index = complage_index + 1
              Next comtextplage
    Les explications sont donc dans les commentaires ajoutés. Je parcours une plage de cellule pour ajouter des commentaires.
    2)CDP est une plage de données.
    3) Oui, désolé je ne connais pas le langage VBA, je suis développeur c# et Administrateur ORACLE. Je suis sur une application ou actuellement, je n'ai pas vraiment de travail, je cherche donc à améliorer les endroite où il y'a des lenteurs. En regardant la FAQ VBA, j'ai vu ce point et j'essai donc de m'en sortir avec mes moyens et avec vos aides.

    Merci
    Pinocchio

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut à tous.
    pinocchio, je crois qu'on ne s'est pas compris : je ne voulais pas une partie plus importante du code. Je voulais tout le code. Et pas ton code commenté, mais le vrai but de la macro.
    On est pas à essayer de trouver où t'as fait une erreur. On essaie d'améliorer sensiblement le traitement, c'est pas pareil

    Un exemple à la con :
    tu testes chaque cellule de la plage cdp en admettant qu'il y en a 30000 et qu'il y en ai une unique qui soit dans Plage.item(1) (si j'ai bien compris IsInRange : tu as donc 30000 Tests dont 29999 faux et 1 Vrai

    Dans ce cas, moi, j'utiliserais plutôt :
    For Each comtextplage In intersect(Comment_Plage,Range(Plage.item(1)))
    qui ne contiendrais qu'une seule cellule (avec un test de validité de l'intersection en cas d'inexistence).

    Tu te dis programmeur : Moi, de mon temps, la première chose qu'on apprenai, c'est qu'une déclaration de variable est en tête de programme. Et dans tous les cas, elle n'est jamais dans une boucle !

    Tu utilises une routine appellée par Call, avec un test derrière. Vraisemblablement, comment.SetupComment crée une string que tu mets en commentaire si elle n'est pas vide.
    Pourquoi avoir créer un sub au lieu d'une function ? Je pense que ce serait moins gourmand en temps, mais sans garantie.

    Quand une macro est lente, il y a toujours deux hypothèses :
    - soit le traitement peux être amélioré
    - soit le nombre de traitements peut être dimi,ué

    Tu as une boucle imbriquée dans une autre boucle. Regardes si tu ne peux pas faire quelque chose de ce coté là
    un appel de sous-programme est toujours bouffeur de temps. J'ai vu des programmes avec 10 fois la même séquence ; C'était plus rapide que 10 appels à sous-programme.

    A+

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut
    tu peux expliquer ce que tu essaies de faire ?
    Je ne comprends pas ton code et n'ai pas d'aide sur InIsRange
    CDP est le nom "informatique" d'une feuille ? d'une variable Range ?

    Ta logique n'échappe : tu dis que tu ne connais pas le VBA, mais tu demandes d'adapter un bout de code pour qu'il aille plus vite.

    Ne serait-il pas plus logique d'exposer le problème précisant éventuellement comment, toi, tu penses le résoudre ?

    A+

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,

    en plus de ta fonction inconnue "isinrange"
    qqchose m intrigue
    For Each point_cell In cdp.Cells
    ici on boucle sur toutes les cellules de la feuille cdp
    je pense qu il faut boucler sur les cellules non vide uniquement, le gain de temps sera nettement amelioré.

    si effectivement tte la feuille est remplie , ce qui me semble tres improbable
    alors la il faudra passer par un tableau ou un variant.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut
    Pas sur les non-vides, puiqu'il est obligé de tester la cellule et ça ne change rien, mais sur UsedRange.cells, les cellules de la plage d'utilisation.
    Mais j'attends de connaître le but pour proposer
    A+

Discussions similaires

  1. [excel] parcours et récupération des cellules
    Par libititi dans le forum API, COM et SDKs
    Réponses: 21
    Dernier message: 06/02/2006, 14h07
  2. [VBA] Copier une plage de cellules dans un fichier fermé
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/01/2006, 16h52
  3. [VBA] Parcourir une plage de cellule
    Par Dinytro dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/09/2005, 08h18
  4. [VBA-E] Image d'une plage de cellule
    Par flogreg dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/07/2004, 12h30
  5. [VBA-E] [Excel] Protection d'une plage de cellules
    Par fikou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2002, 11h28

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