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 :

Condition itérative sur une colonne? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut Condition itérative sur une colonne?
    Bonjour à tous,

    D'avance je m'excuse si je poste ce message dans le mauvais forum, c'est mon premier message sur ce forum qui me semble bien utile!

    Je ne sais pas si j'ai besoin d'une macro pour effectuer ce dont j'ai envie, et sachez que je maitrise les fonctions "basiques" d'excel mais je ne suis pas un fin spécialiste, donc si vous pouvez détailler vos réponses, cela m'aiderait grandement (considérez moi comme néophyte donc!)

    Alors, voici mon problème, j'ai une liste de différents objets (une Bill-of-Material), nécessaires à la conception d'un objet, chacun ayant un niveau de hiérarchie propre (allant de 0 pour l'objet final à 4 pour un objet de la plus petite hiérarchie).

    J'aimerais créer une matrice binaire pour visualiser quel objet est nécessaire dans la création de quel autre objet de la hiérarchie supérieure.
    Je suis donc à la recherche d'une fonction excel qui pourrait itérer une recherche sur la colonne en partant du niveau de hiérarchie de chaque objet et de remonter cette colonne jusqu'à trouver une hiérarchie inférieure (le futur objet qui nécessite ce matériel dont on est parti)...

    Je galère sévère, j'ai du mal à m'expliquer et je posterai demain un exemple de fichier excel pour que vous compreniez mieux, mais si quelqu'un a déjà compris ma situation et qu'il sait m'aider, voici mes questions:

    1) Ai-je besoin de l'utilisation d'une macro pour mon problème?
    2) Si non: quelle fonction pourrait être suffisante?
    3) Si oui: pouvez-vous m'expliquer quelle genre de macro utiliser (en sachant que je n'ai presque jamais utilisé les macros excel)?

    Un grand merci d'avance,

    pklein.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Oui, exemple nécessaire et/ou paracétamol en prime .....
    Sur la base de ma compréhension, fragile, des fonctions LOOKUP pourraient le faire .... Mais à voir

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut
    Voici un exemple basique de mon problème en fichier joint.

    Vous devriez comprendre le système de "hiérarchie de produit" assez vite en regardant la hiérarchie du composant ainsi que la description de l'utilité finale de ce dernier. (Peut-être comprendrez vous mieux ma phrase dans mon ancien post : "itérer une recherche sur la colonne en partant du niveau de hiérarchie de chaque objet et de remonter cette colonne jusqu'à trouver une hiérarchie inférieure (le futur objet qui nécessite ce matériel dont on est parti)"

    J'aimerais créer la matrice de droite, seulement c'est pour un article final qui comprends des centaines de composantes, du coup c'est impossible de faire ça à la main

    Si vous avez des pistes d'idées, je suis preneur!

    Merci d'avance,

    Voici le fichier excel d'exemple: aide-excel.xlsx

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Compliqué une matrice.
    Ne serait-ce pas plus simple d'ajouter une colonne a coté de la description, qui precise l'item parent ?

    Autrement, si l'on assume que le texte de la colonne description a une forme bien precise et immuable, on peut se lancer dans une rapide analyse de texte afin d'en deduire l'item parent. Ensuite une fonction recursive peut se charger du boulot.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Houps,

    Dans votre exemple, pouvez vous m'expliquer à quoi correspond l'élément 'ligne', et par exemple, où est le 'h' en hiérachie niveau 2?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    2	f	Matériel nécessaire pour la ligne 4
    2	g	Matériel nécessaire pour la ligne 4
    3	i	Matériel nécessaire pour la ligne 6
    3	j	Matériel nécessaire pour la ligne 6
    2	h	Matériel nécessaire pour la ligne 4

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut
    @Deedolith: la colonne description n'existe pas en vrai, une recherche sur la colonne "composant" serait envisageable?



    @vinc_bilb: le "ligne" correspond à la ligne de l'excel. Par exemple, l'élément 'h' nécessite le composant k (qui lui-même requière les composants 'l' et 'm' (mais je ne veux pas que 'l' et 'm' soient repris comme composants nécessaires pour 'h', puisqu'ils seront induits grâce à 'k'.)

    Et ce composant 'h' est nécessaire pour le composant 'c' (d'où la ligne 4). Cet élément 'c' est le premier élément de la hiérarchie supérieure (on passe de hiérarchie 2 à 1) en remontant la colonne.

    Si vous avez des questions, n'hésitez pas! Merci de votre temps et votre compréhension

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Houps ....

    1. Estes vous sur que votre résultat espéré (composants versus parents) est correct, en particulier cellule L10? Lien c <->k?)
    2. Si j'ai compris (questionable), j'arrive à quelque-chose du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Hierach Level				
    0	1	2	3	4
    a	b	(Rien)		
    	c	f	(Rien)	
    		g	i	(Rien)
    			j	(Rien)
    	d	(Rien)		
    	e	(Rien)

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut
    Mmmhh, non mon résultat espéré est bon, puisque k est un "enfant" uniquement de 'h' ( 'h' qui sera bel et bien enfant de 'c' par la suite, je te l'accorde, mais je ne veux pas que l'élément 'k' soit commandé deux fois en étant enfant de 'h' et de 'c', il doit juste apparaitre comme enfant de l'élement de la hiérarchie supérieure. (Ici 'k' est de hiérarchie 3, doit il doit être enfant d'un élément de hiérarchie 2 (h) et pas de hiérarchie 1 (c))

    Pour ton code, je ne vois pas où tu veux en venir? C'est juste un listing en fonction du niveau de hiérarchie par composant? (où il manque h, k,l et m) ??

    C'est pas évident de comprendre j'imagine bien

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Citation Envoyé par pklein Voir le message
    @Deedolith: la colonne description n'existe pas en vrai, une recherche sur la colonne "composant" serait envisageable?
    Houla, je vais chercher un rail de coke et je revient

    Je recapitule:
    Tu ne dispose que des colonnes Hierarchie et Composant.
    La colonne Hierarchie indique l'eventuelle relation parent / enfant des objets.
    La colonne Composant indique le nom d'un objet (ou article si tu preferes).

    Le parent d'un enfant est le premier objet dont la N° de hierarchie est inferieur de 1, en remontant la liste.

    Donc, si j'ai bien compris, avec ton exemple on obtient une hierarchie comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    a ==> b
    a ==> c ==> f
    a ==> c ==> g
    a ==> c ==> g ==> i
    a ==> c ==> g ==> j
    a ==> c ==> h
    a ==> c ==> h ==> k
    a ==> c ==> h ==> k ==> l
    a ==> c ==> h ==> k ==> m
    a ==> d
    a ==> e

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut
    @Deedolith

    C'est exactement ça! J'aimerais juste après en faire une matrice binaire mais juste avec les dernières relations de chacune de tes lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    a ==> b
    a ==> c
    c ==> f
    c ==> g
    g ==> i
    g ==> j
    c ==> h
    h ==> k
    k ==> l
    k ==> m
    a ==> d
    a ==> e
    Qui correspond exactement à ma matrice dans mon exemple...

    Mais alors comment le faire automatiquement via une formule, là je suis complètement perdu!

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Une simple formule n'y arrivera pas.

    Le code ci-dessous devrait faire le travail demandé, place le dans un nouveau module:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Option Explicit
    Option Base 0
     
    Public Sub buildMatrix(ByVal strStart As String)
    On Error GoTo Error
        Dim oSheet As Worksheet
        Dim oCell As Range
        Dim lMaxRows As Long
        Dim strMatrix() As String
        Dim strRow() As String
        Dim i As Long
        Dim strParent As String
        Dim strEnfant As String
     
        Set oSheet = ThisWorkbook.Sheets("Aide")
        Set oCell = oSheet.Range("A2")
            '// construction de la matrice
            '// calcul de la taille
        lMaxRows = oCell.End(xlDown).Row - 1
        ReDim strMatrix(lMaxRows, lMaxRows)
            '// remplissage de la 1er ligne et 1er colonne
        Set oCell = oSheet.Range("B2")
        For i = 1 To lMaxRows
            strMatrix(i, 0) = oCell.Value
            strMatrix(0, i) = oCell.Value
            Set oCell = oCell.Offset(1)
        Next
     
            '// remplissage de la matrice
        Set oCell = oSheet.Range("A2:B2")
        For i = 1 To lMaxRows
            Call getHierarchie(oCell, strParent, strEnfant)
            Call setMatrix(strMatrix, strParent, strEnfant)
            Set oCell = oCell.Offset(1)
        Next
            '// transfert vers la feuille de calcul
        Set oCell = oSheet.Range(strStart)
        Call pasteStringArray(strMatrix, oCell)
     
    Exit Sub
    Error:
        Debug.Print "Erreur N°" & Err.Number & ": " & Err.Description
    End Sub
     
        '// transfert un tableau a 2 dimensions vers une cellule donnée
    Private Sub pasteStringArray(ByRef arr() As String, ByRef oRngDestination As Range)
    On Error GoTo Error
        Dim NumRows As Long
        Dim NumCols As Long
     
        NumRows = UBound(arr, 1) - LBound(arr, 1) + 1
        NumCols = UBound(arr, 2) - LBound(arr, 2) + 1
        oRngDestination.Resize(NumRows, NumCols).Value = arr
    Exit Sub
    Error:
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End Sub
     
        '// obtient la hierarchie parent => enfant
    Private Sub getHierarchie(ByRef oCells As Range, ByRef strParent As String, ByRef strEnfant As String)
    On Error GoTo Error
        Dim lRank As Long
        Dim oCurrentCells As Range
     
     
        lRank = CLng(oCells.Cells(1).Value)
        strEnfant = oCells.Cells(2).Value
        strParent = vbNullString
        Set oCurrentCells = oCells
            '// remonte les lignes a la recherche du parent
        While ((oCurrentCells.Row > 1) And (strParent = vbNullString))
            If (lRank > CLng(oCurrentCells.Cells(1).Value)) Then
                strParent = oCurrentCells.Cells(2).Value
            End If
            Set oCurrentCells = oCurrentCells.Offset(-1)
        Wend
        If (strParent = vbNullString) Then
                '// parent non trouvé
            strParent = strEnfant
        End If
    Exit Sub
    Error:
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End Sub
     
    Private Sub setMatrix(ByRef strMatrix() As String, ByVal strParent As String, ByVal strEnfant As String)
    On Error GoTo Error
        Dim x As Long
        Dim y As Long
     
            '// recherche de l'abscisse du parent
        While (strParent <> strMatrix(0, x))
            x = x + 1
        Wend
            '// recherche de l'ordonnée de l'enfant
        While (strEnfant <> strMatrix(y, 0))
            y = y + 1
        Wend
            '// attention a inverser lignes et colonnes
            '// lorsque l'on transfert vers la feuille de calcul
        strMatrix(y, x) = "1"
    Exit Sub
    Error:
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End Sub
    La procédure buildMatrix prend en argument l'adresse de la cellule où dessiner la matrice.
    Exemple d'appel: buildMatrix("I20").

    Je te laisse régler les détails esthétiques

    PS: n'oublie de sauver ton fichier en .xlsm

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Par défaut
    Un tout grand merci pour ton aide!

    Je n'ai pas encore essayé d'appliquer ton code mais je comprends l'idée! Jamais j'aurais pu développer ça avec mes connaissances

    Je ré-arrangerai si je ne suis pas content de l'esthétique!

    (et je viendrai te confirmer le résultat du module quand j'aurais le temps de l'appliquer à mon cas réel!)

    Encore un grand merci! (marqué en Résolu)

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

Discussions similaires

  1. [2005] Colonne dérivée (Condition sur une colonne)
    Par Bb.siham dans le forum SSIS
    Réponses: 0
    Dernier message: 26/04/2011, 16h39
  2. [XL-2003] Macro avec boucle sur une colonne et condition sur une autre
    Par Isabelle86 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2010, 10h31
  3. Condition sur une colonne
    Par ahmedmido dans le forum SharePoint
    Réponses: 2
    Dernier message: 19/08/2008, 11h08
  4. Mettre une condition sur une colonne en splitant une partie ?
    Par wormseric dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2008, 11h57
  5. Réponses: 3
    Dernier message: 03/05/2007, 11h06

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