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 :

Temps anormal d'exécution de procédures. [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut Temps anormal d'exécution de procédures.
    Bonjour [

    Nouveau sur le forum, il m'a été fortement conseillé pour la qualité des conseils qui y sont donnés.

    Je programme un outil sous VBA. Je l'ai conçu par morceaux et me voici maintenant dans la phase ou je les assemble bout à bout.
    Plus le programme avance, plus son exécution est anormalement chronophage .
    Concrètement j'ai plusieurs morceaux de programme. J'illustrerai le phénomène en en ciblant deux d'entre-eux En les testant de la manière suivante : j'ouvre Excel, lance le premier qui analyse et traite en 25s. Je ferme excel, je réouvre Excel et le second fonctionne en 1 minute 10s. Si je les exécute à la suite (sans fermer Excel) je suis à 30 minutes soit près de 20 fois plus longtemps.

    C'est un programme pour le boulot et je n'ai pas réussi à le simplifier sans enlever la mension confidentielle tout en conservant le problème , désolé pour ça!

    J'ai longuement cherché sur ce forum pour trouver des solutions qui se sont révélées sans efficacité. J'incriminerai la déclaration des variables (il y a pourtant Option Explicit d'employé) ou l'utilisation de la mémoire.

    Comment puis-je faire un suivi de la mémoire à plusieurs étapes du programme pour en être certain?

    Avez-vous d'autres suggestions de pistes à explorer?

    Merci d'avance pour vos conseils qui me sortiraient d'une bien délicate situation

    Edit : Mon système d'exploitation est Win7 Professionnel 64 bits, un processeur de 2 GHz pour 4Go de RAM.

  2. #2
    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
    re
    bonjour
    en grande partie et même très souvent des app fait de bout a bouts comme tu dis sont bardées de activate et select a tout va alors qu'a 99% ils ne sont pas nécessaire
    après très souvent aussi les débutants utilisent des boucles alors qu'une variable de type tableau(variant) peut faire le lardon

    ensuite comme on n'a pas de code ni de fichier en exemple et comme j'ai casser ma boule de cristal je ne peut t'en dire plus
    A mediter
    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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Bonsoir Patrick,

    En effet j'ai pas mal de Select et d'activate pour naviguer entre les différentes feuilles du classeur et pour tester la valeur des cellules.
    Je n'ai pas vu d'exemples dans mon auto-apprentissage du VBA de tableau(Variant), saurai-tu me diriger vers un fichier exemple de ce type de programmation.

    Quant aux boucles elles sont principalement en While avec des Find. Le principe est d'identifier une valeur dans un feuille et de trouver la même valeur dans une autre feuille. Du coup pour tester la valeur je suis en activate et Select. Si elle est trouvée alors j'extrais les données. Je traite des feuilles à 37000, 18000 & 10000 lignes.

    Je vais y méditer et j'y médite

  4. #4
    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
    Quant aux boucles elles sont principalement en While avec des Find. Le principe est d'identifier une valeur dans un feuille et de trouver la même valeur dans une autre feuille. Du coup pour tester la valeur je suis en activate et Select. Si elle est trouvée alors j'extrais les données. Je traite des feuilles à 37000, 18000 & 10000 lignes.
    c'est bien ce que je pensait
    pour faire tout cela ca n'est pas nécessaire
    on peut très bien se passer des select et activâtes pour cherché une valeur d'une feuille dans une autre

    mais vu ta réponse je crois que tu es tellement parti dans le mauvais sens que pour t'aider il me faudrait un fichier model

    exemple j'ai "toto" en C1 dans la feuille "Feuil1"

    je la cherche dans la feuille "feuil2" dans la plage A1:F10
    on procède comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim valeur as string 
    valeur =sheets("feuil1").range("C1").value
    with sheets("Feuil2")
    set cellule=.range("A1:F10").find(valeur,lookin:=xlvalues)
    end with 
    if not cellule is nothing then msgbox cellule.address
    et il y en a bien d'autre mais je crois que tu a sauter des étapes avant de te le lancer dans la conception d'une application
    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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Je n'aurai le fichier à modifier pour t'indiquer les méthodes que j'ai employé que demain matin. En revanche, d'après le bout de code que tu as mis dans ton dernier message, une grande partie est dans la même logique que ce que j'utilise.
    Je vais ferai un fichier demain pour te montrer les lignes de code exemple mis en place pour répondre à mon besoin.

    Si je m'exprime mal j'en suis désolé et je comprends tout à fait que sans support c'est quasi impossible. Je reste quand même perplexe qu'indépendamment ça tourne de manière acceptable alors que mis bout à bout c'est très long

  6. #6
    Expert confirmé
    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
    Par défaut
    Salut, malheureusement si c'est mal conçu au départ, on gagne souvent à tout virer et recommencer à partir de zéro. Car là cela restera du bricolage du genre emplâtre sur une jambe de bois. Mais pour cela il faut avoir acquis de bonnes pratiques et les appliquer. Difficile avec un langage aussi permissif que le VBA.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Bonjour le forum

    J'ai donc bien pris note de ce que vous avez avancé concernant les boucles et je suis tombé sur la discussion suivante :
    http://www.developpez.net/forums/d15...-copie-onglet/

    Il concerne les boucles et c'est le code en poste #10 qui serait intéressant. J'ai un peu de difficultés à le comprendre. Pensez-vous que c'est une bonne idée de creuser dans cette direction pour recommencer et repartir de zéro?

    J'ai fait un bout de fichier exemple du type de boucles et de procédures auxquelles je fait appel. Il est très simplifié, c'est juste pour illustrer la description que je vais faire ci-dessous.

    exempleforum.xlsm

    Je navigue entre 6 feuilles dans mon classeur. Je teste une colonne pour identifier si une valeur est présente. Si l'identification est satisfaisante, je vais chercher une valeur dans la colonne N-1. Seulement la seconde valeur cherchée n'est pas obligatoirement sur la même ligne.. Je remonte donc avec un ActiveCell.Offset(-1,0).Select, etc et j'extrais les valeurs qui m'intéresse.
    Deuxième macro : avec les valeurs extraites, je teste leur occurence dans une autre feuille (utilisation de Find..). Si elles sont trouvées je réitère le même schéma de raisonnement que précédent pour trouver des informations.

    C'est un peu décousu mais vos remarques seront toujours les bienvenues

  8. #8
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonjour BlackMountain,
    Avec le fichier fourni voici le résultat de la Macro qui sélectionne les données

    Nom : BlackMountain.png
Affichages : 179
Taille : 4,3 Ko

    On voit que les lignes se répètent, est-ce vraiment ce que tu souhaites?

    Quels est le résultat attendu?

    Sinon jettes un œil sur cette page tu y trouvera des infos utiles

    http://silkyroad.developpez.com/vba/boucles/

    Eric

    Jettes un œil là-dessus également, pour optimiser le temps d’exécution c'est top
    http://didier-gonard.developpez.com/...s-tableau-vba/
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  9. #9
    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
    oh h!!! oui
    unexemple des plus parlant

    dans ton fichier exemple j'ai trouver ce genre d'abomination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ActiveCell.Offset(0, -1).Select
                    While ActiveCell.Value = Empty
                    ActiveCell.Offset(-1, 0).Select
                    Wend
                    Code = ActiveCell.Value
    alors que ca c'est la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code=range( ActiveCell.Offset(0, -1).column.end(xlup).offset(1,0).value
    ou bien encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code= sheets("yyy").ActiveCell.Offset(0, -1).column.SpecialCells(xlCellTypeLastCell).value
    et il y en a bien d'autre
    tu vois ce que je veux dire ?
    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

  10. #10
    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
    re
    bon j'ai regardé un peu la macro il manque certainement des éléments car c'est pas cohérent

    MAIS!!!!

    j'ai quand même séparé certaines partie du code pars des lignes d'Etoiles
    et a l'intérieur donc en noir puisque j'ai mis tes lignes de code en commentaire j'ai mis ma version

    si tout ton fichier est comme ca faut pas s'étonner

    boucler avec while sur une colonne en sélectionnant l'offset a chaque fois!!!!!!!!..non de dieu !!!! on faisait cela a l'époque de Vercingétorix

    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
    Sub BlackMountain()
        Dim i As Integer
        Dim k As Integer
        i = 3
        k = 3
    
        code = Empty
        Action = Empty
    
        Do Until Cells(i, 1).Value = Empty
            If Cells(i, 3) = "" Then
                i = i + 1
            Else:
                '*********************************************************************
                'Cells(i, 2).Activate
                ' While ActiveCell.Value = Empty
                ' ActiveCell.Offset(-1, 0).Select
                ' Wend
                ' Action = ActiveCell.Value
                'remplacé par
                Action = Cells(Rows.Count, 2).End(xlUp).Value
                '*********************************************************************
                '************************************************************************
                If Action >= 2016 Then
                    'ActiveCell.Offset(0, -1).Select
                    'While ActiveCell.Value = Empty
                    ' ActiveCell.Offset(-1, 0).Select
                    'Wend
                    ' Code = ActiveCell.Value
                    'remplacer par
                    col = ActiveCell.Offset(0, -1).Column
                    code = Cells(Rows.Count, col).End(xlUp).Value
                
                  ' ou bien encore puisque l'on select plus 
                     code = Cells(Rows.Count, 2).End(xlUp).offset(0,-1).Value
    
     '**************************************************************************
                    
                    '************************************************************
                   ' Worksheets("feuille_cible").Activate
                    'Cells(k, 1).Value = code
                    'Cells(k, 2).Value = Action
                    'remplacer par
                    With Sheets("feuille_cible")
                    .Cells(k, 1).Value = code
                    .Cells(k, 2).Value = Action
                    End With
                    '***************************************************************
                    Worksheets("feuille_source").Activate
                    code = Empty
                    Action = Empty
                    k = k + 1
                    i = i + 1
                    LgnFinCode = Empty
    
                Else: i = i + 1
                End If
            End If
        Loop
    End Sub
    voila comme tu peut le voir je remplace toutes tes boucles par une seule ligne et je sélectionne même pas la cellule j'y prend ou inscrit directement
    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

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Bonjour le forum ,

    Tout d'abord, merci pour vos réponses qui m'aident énormément à avoir de nouvelles pistes .
    @ eric4459
    On voit que les lignes se répètent, est-ce vraiment ce que tu souhaites?

    Quels est le résultat attendu?
    En effet ici les lignes se répètent et ce n'est pas voulu. J'ai juste rapidement fait un fichier exemple pour montrer le type de structure de code que j'utilisais. C'est donc une erreur. En revanche donc, dans le code que j'ai mis en place, je n'ai pas de répétitions.
    J'ai parcouru les deux liens qui ont été joints. J'étais déjà arrivé sur le premier et les boucles mais le deuxième est totalement nouveau et très complet. Je ne vois pas encore comment exploiter le programme en tableau mais j'y réfléchi .

    @patricktoulon
    dans ton fichier exemple j'ai trouver ce genre d'abomination



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ActiveCell.Offset(0, -1).Select
    While ActiveCell.Value = Empty
    ActiveCell.Offset(-1, 0).Select
    Wend
    Code = ActiveCell.Value
    alors que ca c'est la même chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code=range( ActiveCell.Offset(0, -1).column.end(xlup).offset(1,0).value
    Wouahhou en observant tes exemples, je comprends pourquoi tu avances que mon code est bourin, rudimentaire et ainsi de suite. Pas de souci, j'ai commencé à remanier le tout!
    En tout cas merci pour tes exemples. Je les ai donc testés et un paramètre ne rempli pas une fonction souhaitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'remplacer par
     col = ActiveCell.Offset(0, -1).Column
     Code = Cells(Rows.Count, col).End(xlUp).Value
     
     ' ou bien encore puisque l'on select plus
      Code = Cells(Rows.Count, 2).End(xlUp).Offset(0, -1).Value
    Je serai plus apte à placer la seconde solution afin de faire sauter le Select, mais cette commande va me chercher la dernière valeur de la colonne 1 vers le bas à chaque ligne. Alors que je souhaite qu'il me donne la première valeur qu'il me trouve en partant vers le haut.

    Par Exemple :
    Nom : Capture.PNG
Affichages : 197
Taille : 3,3 Ko
    Ligne 22, il a détécté une valeur à la 3ieme colonne, il va trouver 2016 sur la même ligne, et le code correspondant. C'est le cas le plus simple.
    Ligne 24, cas plus complexe : colonne 3 : détection d'une valeur donc décalage sur la colonne gauche pour identifier la première valeur trouvée vers le haut (ici 2016 L23). Test concluant alors on se décale encore sur la colonne de gauche et on teste en remontant par le hautjusqu'à trouver la première valeur trouvée qui se situe en L21 : "crs".

    Ce serait le End(xlUp) qui ne serait pas adapté, n'est-ce pas?

    EDIT : le End(xlUp) fonctionne bien, c'est le Rows.Count qui me place tout le temps à la dernière ligne du classeur. En remplaçant par la ligne "i" de mon exemple ça fonctionne dans ce cas.

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

Discussions similaires

  1. [WD19] Exécuter plusieurs procédures en même temps
    Par lololebricoleur dans le forum WinDev
    Réponses: 2
    Dernier message: 30/01/2014, 11h39
  2. Une seule instance de l'appli et exécuter une procédure
    Par Manic dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 08/03/2006, 11h52
  3. [SQL-Server] Exécution de procédures stockées
    Par sylvkin dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2005, 12h00
  4. [Oracle] Exécuter une procédure PL/SQL en PHP?
    Par Cerberes dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 25/02/2005, 14h11
  5. DBLink et exécution de procédure stockée
    Par DBS dans le forum Oracle
    Réponses: 8
    Dernier message: 01/02/2005, 13h50

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