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 :

Algorithme de parcours de liste et enrichissement de valeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Par défaut Algorithme de parcours de liste et enrichissement de valeur
    Bonjour,

    Je viens solliciter un peu d'aide sur un problème qui semblera peut-être trivial pour certains. Je précise que je n'ai jamais programmé en VBA auparavant, mais il me semble que pour arriver à mes fins les fonctions classiques d'Excel ne suffisent pas.

    Voici l'exposé du problème, que je simplifie au maximum pour ne se concentrer que sur l'aspect algorithmique.
    Je dispose d'une table contenant 4 colonnes :

    - timestamp, horodatage associé à chacun des événements de ma liste (la liste est ordonnée par timestamp)
    - ID, qui identifie de manière unique différents objets (que je nomme A, B, C...)
    - Action : au cours du temps, chaque objet ne peut faire que 3 actions : MOVE, TURN, STOP
    - Value : aux actions MOVE et TURN est associée une mesure d'une grandeur, qui va par exemple de 1 à 10

    Pour l'action STOP, aucune mesure n'est effectuée par l'objet et la colonne Value est donc vide.

    Mon but est très simple : comment enrichir la colonne 'value' des actions de type 'STOP' sur la base de la dernière mesure effectuée sur chaque objet ?
    Autrement dit, comment puis-je récupérer, pour chaque objet, la valeur "Value" mesurée au cours de la dernière action (MOVE / TURN) à chaque action de type 'STOP' ?

    En clair dans mon exemple, je cherche à compléter les cellules D7 et D10 :
    -> D7 : dernière valeur mesurée pour A = 2
    -> D10 : dernière valeur mesurée pour B = 8

    Le but étant ensuite de ne filtrer que les actions de type STOP puis de faire des statistiques sur les dernières valeurs mesurées à chaque fois.

    Merci par avance de votre aide !

    Nom : capture.png
Affichages : 265
Taille : 9,8 Ko
    Images attachées Images attachées  

  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 !

    Citation Envoyé par ced_p Voir le message
    il me semble que pour arriver à mes fins les fonctions classiques d'Excel ne suffisent pas.
    Quelle erreur ‼     Le Général VBA n'ayant rien d'efficace pour Excel …

    Et s'agissant d'une problématique Excel, créer une discussion dans le forum dédié au VBA Excel
    aurait été bien plus judicieux, vu aussi sa fréquention bien plus élévée !


    Citation Envoyé par ced_p Voir le message
    Pour l'action STOP, aucune mesure n'est effectuée par l'objet et la colonne Value est donc vide.

    Autrement dit, comment puis-je récupérer, pour chaque objet, la valeur "Value" mesurée au cours de la dernière action (MOVE / TURN) à chaque action de type 'STOP' ?
    Avec un peu de jugeote, diverses possibilités avec le B-A-BA d'Excel !

    Par exemple si seules les cellules vides de la colonne D correspondent bien à STOP,
    il suffit donc d'utiliser la recherche d'Excel (méthode Range.Find en VBA, voir son exemple dans l'aide VBA interne)
    ou encore effectuer une recherche sur STOP dans la colonne C
    et s'il y a une correspondance, lire alors son ID dans la colonne B pour effectuer une recherche arrière (en remontant) …

    En activant l'Enregistreur de macro puis en opérant manuellement, une base de code est livrée sur un plateau !


    En Général VBA, il suffit juste de boucler sur les cellules de la colonne C ou D pour tester leurs valeurs
    pour ensuite lire l'ID en colonne B et remonter jusqu'à l'ID correspondant.
    S'il n'y a pas beaucoup de lignes à traiter, le Général VBA est acceptable …

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Par défaut
    Merci pour votre réponse.

    Et bien tout d'abord désolé d'avoir posté ma demande au mauvais endroit.
    Je ne suis pas un habitué des forums, mais je comprends que ça peut être agaçant...

    J'avais précisé que ma question pourrait paraître triviale... néanmoins je ne suis pas tout à fait sûr d'avoir bien compris comment m'en sortir avec une macro que j'enregistrerais manuellement. Je précise qu'hormis des macros très simples de mise en forme de textes, je n'ai pas non plus d'expérience en la matière. Mais je manque sans doute aussi de jugeote...

    Le but est bien de partir d'une liste de ce style et d'enrichir chaque ligne correspondant à un "STOP" avec une valeur "Value" égale à celle vue pour la dernière action associé à l'ID correspondant.

    En termes de taille, il s'agit de tables avec 100 000 lignes en moyenne, dont 10% de stop (donc de lignes à enrichir). Là encore j'ai du mal à me rendre compte...

    Cordialement

  4. #4
    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

    Maintenant que l'on est dans le bon forum, du côté Excel sélectionner la colonne C puis
    appeler la fonction de recherche et indiquer STOP (attention aux options).
    La première cellule contenant STOP est sélectionnée, voilà ce n'est pas plus compliqué que cela !

    En activant le Générateur de macro puis en réitérant la même opération,
    une base de code est livrée sur un plateau ! Et ce n'est toujours pas compliqué …

    Ensuite en consultant l'aide VBA interne - tout y est, suffit de l'ouvrir ! - concernant la méthode Range.Find,
    il faut juste appliquer son exemple dans le code, c'est à dire affecter le résultat à une variable de type Range
    et vérifier qu'elle fait bien référence à une cellule …

    Poursuivre l'algorithme, question initiale dussé-je le rappeler …

  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 à tous,

    sinon par formule ça donne, en E2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(D2="";INDEX(D:D;MAX(($B1:B$2=B2)*LIGNE($B1:B$2)));D2)
    Que ça ne t'empêche pas de te lancer dans le vba ;-)
    eric

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Par défaut
    Merci à vous deux.

    Bonne soirée.

Discussions similaires

  1. Bouclage d'un parcours de liste
    Par kubowsky dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 22/04/2008, 10h24
  2. Parcours de liste
    Par Invité dans le forum Ada
    Réponses: 2
    Dernier message: 12/04/2008, 12h35
  3. [débutant] Parcours de liste, déboggage
    Par titpuce dans le forum Langage
    Réponses: 13
    Dernier message: 26/02/2007, 09h42
  4. Réponses: 4
    Dernier message: 19/02/2006, 18h43
  5. Algorithme de parcour de graphe :(
    Par scaleo dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 03/10/2005, 10h36

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