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 :

Code VBA trop long


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur Génie Industriel
    Inscrit en
    Mai 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur Génie Industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 52
    Par défaut Code VBA trop long
    Bonjour à tous,

    Je me débrouille un petit peu en VBA, du moins je cherche par moi-même et c'est pourquoi parfois j'ai un code qui est fonctionnel mais pas optimal...
    Je vais tenter de vous expliquer rapidement mon souci.

    Je dois gérer des arrêts techniques dans mon travail, et nous avons donc des BT (bons de travail) qui se génèrent périodiquement dans une GMAO (Gestion de maintenance assistée par ordinateur), une base de données en gros.
    Nous pouvons extraire les données sous format Excel afin de travailler avec comme on le souhaite, ce que je fais pour planifier les différents BT, ajouter infos, etc.
    Lors d'un changement d'état, c'est-à-dire passage de "A réaliser" à "En cours" par exemple, il fallait fouiller dans la GMAO pour trouver où en était le BT.
    A savoir qu'il y a environ 2000 BT/an, donc c'est relativement em...........

    J'ai donc pensé générer tous les jours une extraction de la GMAO, et créer un VBA qui va me mettre à jour les états.
    Cela se passe comme ça : Import de la nouvelle extraction ajoutée à la suite de la dernière, et ensuite, 2 boucles imbriquées qui viennent prendre la première ligne de l'ancien tableau, pour la comparer à la première ligne du nouveau tableau, puis à la deuxième, etc... Jusqu'à trouver une correspondance : Si le code trouve deux lignes identiques (par rapport au numéro de BT), il supprime l'ancienne, donc il me garde celle avec le nouvel état, donc à jour. S'il ne trouve pas de deuxième ligne, il laisse, s'il ne trouve qu'une nouvelle ligne, il l'ajoute, c'est un nouveau BT qui a été ajouté en GMAO.

    Le souci que j'ai, c'est qu'à l'import je me trouve avec donc 2x 2000 BT (En ce moment même 4x car je reviens sur 2018), donc le programme met une eternité à avancer.
    Je suis quasi sur que ma méthode n'est pas la meilleure, car il va rechercher TOUTES les lignes, pour avoir 99% de non trouvé -> Inutile, mais je ne suis pas un pro et sur quelques lignes ça fonctionne bien.

    Auriez-vous une idée de comment procéder pour accelérer ça ? Partir d'un RECHERCHEV par exemple ?

    Je pourrais juste utiliser la nouvelle extraction me direz-vous, mais le problème est que je planifie avec ce fichier, donc je marque par exemple une date dans les colonnes suivantes, et avec mon programme il va récupérer les infos, et les remettre aux bons endroits sur la nouvelle ligne à chaque fois...

    Merci d'avance de votre aide.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut Bjr
    Bonjour,

    À la lecture de ton descriptif, il semble que tes Bt ont le même id.

    Au lieu d effectuer des boucles imbriquées, pourquoi ne pas simplement supprimer les lignes en doublons en fonction de l id ?

    Exemple à test sur une copie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub RemoveDuplicateRows()
     
    Dim MyRange As Range
    Dim LastRow As Long
     
    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
    ' modifie range ("a1:d...) par ta plage de cellule
    Set MyRange = ActiveSheet.Range("A1:D" & LastRow)
    ' modifier colums =3 par le num de colonne avec id bt
     
    MyRange.RemoveDuplicates Columns:=3, Header:=xlYes
     
    End Sub

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur Génie Industriel
    Inscrit en
    Mai 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur Génie Industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 52
    Par défaut
    Bonjour mfoxy,

    Alors je n'ai pas fait ça pour deux raisons :
    Premièrement je ne sais pas s'il va bien supprimer la dernière. Ca se teste rapidement, je vais faire ça en utiliser tout simplement l'option "supprimer les doublons".
    Deuxièmement, car il va m'enlever aussi d'autres informations.

    On prend un exemple :
    Col A : ID ; Col B : Titre du BT ; Col D : Etat ; Col C : Planif

    Les colonnes A, B et C sont issues de la GMAO et sont donc récupérées automatiquement par le début de mon programme qui fait un simple copier/coller.
    La colonne D en revanche, est une donnée que j'entre manuellement et qui me permet de savoir à quelle date est planifié ce BT.
    Si je fais "supprimer les doublons" et qu'il supprime bien la plus ancienne, soit la première des deux, il va aussi supprimer les infos de la colonne D, et à la fin du programme j'aurais donc bien l'état à jour, mais plus la date de planification ...

    De plus, imaginons que je puisse dire de supprimer les doublons juste sur les colonnes A,B et C en laissant D, un moment le nombre de BT va bouger et la colonne D aura des infos pas forcément au bon endroit...

    Je ne sais pas si c'est assez clair.

  4. #4
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Essaie toujours sur une copie de ton fichier, en sélectionnant bien tout le tableau, et uniquement les critères en double.

    En guise de test, si nok, il sera alors opportun de faire un code avec boucle, tbl()...

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur Génie Industriel
    Inscrit en
    Mai 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur Génie Industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 52
    Par défaut
    J'essaye ça ce soir ou demain, et je te tiens au courant

    Merci pour tes réponses !

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur Génie Industriel
    Inscrit en
    Mai 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur Génie Industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 52
    Par défaut
    Bonjour,

    Je viens de faire le test, et effectivement ça ne fonctionne pas car il me supprime le dernier de la liste.
    Par exemple :
    • 100520 - Réparation pompe - En cours - AT20
    • 100520 - Réparation pompe - Soldé

    Le premier cas étant le tableau numéro 1 dans lequel le BT est en cours. J'ai planifié de faire cette intervention à l'arrêt technique 2020, d'où "AT20", donnée entrée manuellement.
    La deuxième ligne est l'extraction du jour, les données sont les mêmes hormis l'état. Je veux donc bien voir que celui-ci a évolué. Il n'y a pas AT20 car c'est une donnée manuelle.

    Après la suppression des doublons, il me laisse la ligne "En cours", ce n'est pas ce que je veux. Certes j'ai AT20, mais l'état n'est plus à jour.
    SI ça avait fonctionné comme je le souhaite, qu'il ne garde la dernière ligne uniquement, j'aurais l'état à jour mais plus AT20, ce n'est pas non plus ce que je veux.

    Donc je pense que les boucles sont la seule solution.

    Pour info, j'arrive à la ligne 9000 et même un peu plus, donc je vous laisse imaginer le nombre d'opération que le VBA doit faire, je pense qu'il mettra plus qu'un jour à tout faire ^^

    Dois-je tenter de poster mon code ? Quelqu'un y trouvera probablement des choses mal écrites, ou écrites de façon non optimale

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

Discussions similaires

  1. Code SQL trop long
    Par lbar012001 dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/07/2009, 15h17
  2. 1er Execution du code Ok, les réexecutions trop long
    Par novicenovice dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/08/2007, 17h16
  3. code trop long
    Par popi182 dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2006, 07h58
  4. [VBA-E]Combobox et code trop long!! (debutante)
    Par legend dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/03/2006, 14h23
  5. Code son trop long
    Par Belegkarnil dans le forum Multimédia
    Réponses: 3
    Dernier message: 28/02/2006, 09h06

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