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 :

Calcul "fonction réciproque"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut Calcul "fonction réciproque"
    Voilà mon problème :

    J'ai deux séries de données, rangées dans deux colonnes.

    La première est de ce type :
    X1
    X2
    X3
    ...

    La seconde est de ce type
    Y1;Y4;Y43
    Y3
    Y2;Y8;Y4;Y5
    ...

    En gros à chaque X corresponds un ensemble de Y's.

    Il faut que j'arrive à construire la réciproque : une table des Y avec les X's correspondants.

    Avec l'exemple ci-dessus, ma table d'entrée aurait cette aspect :
    X1 Y1;Y4;Y43
    X2 Y3
    X3 Y2;Y8;Y4;Y5

    Et en sortie je voudrais récupérer :
    Y1 X1
    Y2 X3
    Y3 X2
    Y4 X1;X3
    Y5 X3
    Y8 X3
    Y43 X1

    (enfin, pas forcément triée, l'ordre n'importe pas)

    Comme je suis tout débutant en VBA, si qqn veut bien m'orienter, ce serait cool, je n'ai pas trouvé grand chose dans le forum (j'ai peut-être raté la chose par contre).

    Merci.


    PS: les "valeurs" X et Y sont des mots.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour. Bienvenue sur nos forums.

    Voici une idée, par forcément optimisée. Il y a peut-être plus simple et/ou plus rapide (avec beaucoup de données)

    L'idée consiste:
    - à parcourir la plage des X de départ et à remplir un dictionnaire avec les Y trouvés à droite des X. Le dico refuse les doublons
    - à transformer le contenu du dico en tableau
    - à se positionner sur la première cellule de la plage de restitution, puis à itérer sur les y du tableau
    - Pour chaque Y, à parcourir la plage des X et regarder si le Y se trouve dans la cellule de droite et si oui, à ajouter le X à droite de la cellule de la plage de restitution

    Cela donne ceci
    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
     
    Sub Reciproque()
        Dim Cellule As Range
        Dim Tableau
        Dim Dico As Object
        Dim i As Integer
        Dim Plage As Range
        Dim CelluleArrivee As Range
     
        Set Dico = CreateObject("scripting.dictionary")
        Set Plage = Range("a1:a" & Range("a" & Rows.Count).End(xlUp).Row)
        Set CelluleArrivee = Range("d1")
     
        ' Remplissage du dictionnaire
        For Each Cellule In Plage
            Tableau = Split(Cellule(1, 2).Value, ";")
            For i = 0 To UBound(Tableau)
                If Not Dico.exists(Tableau(i)) Then Dico.Add Tableau(i), Tableau(i)
            Next i
        Next Cellule
     
        ' Conversion du dictionnaire en tableau
        Tableau = Dico.items
        ' Restitution des éléments du tableau
        For i = 0 To UBound(Tableau)
            CelluleArrivee.Value = Tableau(i) ' Remplissage avec Y
            CelluleArrivee(1, 2).ClearContents ' vidange de la cellule de droite
            For Each Cellule In Plage ' Itération sur la plage source
                ' Si Y présent dans la cellule de droite de la plage source, on ajoute le X
                If InStr(1, Cellule(1, 2).Value, Tableau(i)) <> 0 Then _
                    CelluleArrivee(1, 2).Value = CelluleArrivee(1, 2).Value & ";" & Cellule.Value
            Next Cellule
            ' Nettoyage du premier ;
            CelluleArrivee(1, 2).Value = Right(CelluleArrivee(1, 2).Value, Len(CelluleArrivee(1, 2).Value) - 1)
            ' On descend d'une ligne pour le nouvel Y
            Set CelluleArrivee = CelluleArrivee(2)
        Next i
    End Sub
    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut
    Merci beaucoup pour cette réponse très complète.

    Je vais mettre ça en pratique dès aujourd'hui!

    Bonne fin de journée.

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

Discussions similaires

  1. Fonctions de quoting : str, nrquote, nbrquote
    Par L0007 dans le forum Macro
    Réponses: 8
    Dernier message: 12/11/2010, 14h20

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