Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/10/2011, 09h39   #1
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Industrie

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 2
Points : 2
Par défaut Générer liste de références "parents" d'une BDD de nomenclature

Bonjour,

Je suis plutôt novice en VBA et je travaille sur un projet de base de données de nomenclature dans ma société. Je n'arrive pas à générer de façon bouclé une liste de toutes les références d'assemblages "parents" d'un composant.

Je m'explique : un composant peut être présent dans plusieurs assemblages parents directs et chacun de ces assemblages peut aussi être composer d'assemblages parents et ainsi de suite.
La référence de l'assemblage "maître" est 9000001, c'est le système en entier, donc le dernier niveau. Je souhaiterai générer une sorte de matrice qui par niveau (ligne) me met les références parents à la suite. J'ai fait un exemple sur la deuxième feuille du tableur joint.

Ma base de données est composée d'uniquement 2 colonnes, la première concerne les références enfants (niveau n) et la seconde les références parents (niveau n+1). La macro fera des va et vient entre ces deux colonnes pour trouver les valeurs.

J'ai essayé avec des boucles "while" et des commandes "find" sans arriver au résultat escompté...

Je sollicite donc l'aide du forum! Je ne sais pas si j'ai été très clair...

Merci beaucoup d'avance pour toute aide de votre part.

Rico

Matrice des assemblages parents.xls
RicoExo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h07   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Malgré ton fichier, la logique n'est pas limpide
Pourquoi met ton 9000006 et 9000005 au même niveau ?
9000003 ne devrait il pas être aussi sur ce niveau?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h21   #3
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Industrie

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 2
Points : 2
Bonjour,

Tout d'abord merci de l'attention que vous portez à mon problème.

Effectivement je ne suis pas assez clair sur le raisonnement. La liste que je souhaite générer ici (équivalent à ce qu'il y a dans la feuille "MatriceNiveaux") est la liste de tous les assemblages parents de 9000022, or les assemblages parents directs sont 9000005, 9000006 et 9000004. Ces 3 assemblages sont donc sur le même niveau et ont aussi chacun des assemblages parents qui seront sur le niveau plus haut (9000012,9000007,9000001).

Je veux faire une boucle qui s'arrête uniquement lorsque 9000001 est atteint.

Merci pour l'aide!

Rico
RicoExo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h58   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Ca me semble bon, a toi de confirmer

Code :
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
Sub TriParentsEnfants()
 
 
Dim i As Long
Dim Rg As Range
 
Dim COlCible As Byte
Dim ligneCible As Long
 
Dim ShCible As Worksheet
 
Set ShCible = Sheets("MatriceNiveaux")
 
For i = 2 To Range("A65536").End(xlUp).Row
 
    'Recherche le parent
    Set Rg = ShCible.Cells.Find(what:=Range("A" & i).Value, Lookat:=xlWhole)
 
    If Rg Is Nothing Then
        'Si pas trouvé on cherche l'enfant on écrit parent ligne 3
        Set Rg = ShCible.Cells.Find(what:=Range("B" & i).Value, Lookat:=xlWhole)
        If Rg Is Nothing Then
            COlCible = ShCible.Cells(3, Me.Columns.Count).End(xlToLeft).Column + 1
            ShCible.Cells(3, COlCible).Value = Range("A" & i).Value
            COlCible = ShCible.Cells(4, Me.Columns.Count).End(xlToLeft).Column + 1
            ShCible.Cells(4, COlCible).Value = Range("B" & i).Value
        Else
            'Si enfant trouvé, on place le maitre ligne de dessus
            COlCible = ShCible.Cells(Rg.Row - 1, Me.Columns.Count).End(xlToLeft).Column + 1
            ShCible.Cells(Rg.Row - 1, COlCible).Value = Range("A" & i).Value
        End If
 
    Else
    'On cherche enfant
        ligneCible = Rg.Row
        Set Rg = ShCible.Cells.Find(what:=Range("B" & i).Value, Lookat:=xlWhole)
 
        If Rg Is Nothing Then
            COlCible = ShCible.Cells(ligneCible + 1, Me.Columns.Count).End(xlToLeft).Column + 1
            ShCible.Cells(ligneCible + 1, COlCible).Value = Range("B" & i).Value
        End If
 
    End If
 
Next i
 
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 14h56   #5
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Industrie

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 2
Points : 2
C'est exactement ce que je cherchais mais à un détail près: je souhaiterais générer cette matrice uniquement pour les références ayant une filiation avec le composant pour lequel on fait la requête (ici 9000022).

C'est à dire que dans la matrice que me génère votre code ne devraient pas apparaître les références: 5200001.6.G, 9000003, 9000025 et 900002.

Voyez vous un moyen simple pour faire ce filtre?

Merci beaucoup pour votre réactivité et votre performance.
RicoExo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 17h31   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Et comment on fait pour savoir que la référence 9000025 ne fait pas partie de 9000022 lorsqu'on est dans la boucle ?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 17h52   #7
Invité de passage
 
Homme
Ingénieur qualité méthodes
Inscription : octobre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Industrie

Informations forums :
Inscription : octobre 2011
Messages : 10
Points : 2
Points : 2
Et c'est là une grande partie de mon problème, j'ai essayé de traiter cela en faisant des commandes "find" qui cherchent les premiers parents d'une référence (9000022) dans la première colonne et qui cherchent ensuite les leurs dans cette même colonne et etc. Ainsi les références n'ayant pas de lien de parenté avec 9000022 ne sont pas pris en compte.

Cependant le code que vous m'avez fourni m'offre une autre fonction que je n'avais pensé à développer, et tout aussi intéressante, qui est de faire le mapping intégral de mon système par niveau.

Merci encore.
RicoExo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h36.


 
 
 
 
Partenaires

Hébergement Web