Gerer Base de Données

KTM

XLDnaute Impliqué
Salut chers Tous
Mon probleme du jour est le suivant
Je travaille sur une base de données dans laquelle en face de chaque état de stock d'un produit ( RUPTURE,STOCK DORMANT,SURSTOCK) on doit lister toutes les structures pouvant apporter un appuis .
Par exemple dans mon fichier joint :
Le produit "a" est
-En dormance à AB et DH
-En Rupture à DX,RT,TF
-En surstock à CD,DGK
Donc on doit pouvoir en Face de chaque STOCK DORMANT et SURSTOCK lister (DX,RT,TF) c'est à dire les Structures ayant connu RUPTURE
et en face de Chaque RUPTURE lister (AB,CD,DH,DGK) c'est à dire les structures avec STOCK DORMANT ou SURSTOCK.
Avec une Base de donnée restreinte comme dans ce test c'est Facile , mais avec la réelle Base de Donnée c'est un véritable calvaire

Je réfléchis comment passer par VBA
Merci de m'accompagner dans ma réflexion et / ou me donner des ébauches de solution. Merci
 

Pièces jointes

  • Traitement_BD.xlsm
    10.9 KB · Affichages: 18

KTM

XLDnaute Impliqué
Puissante et extraordinaire formule
Bonjour KTM, JE, JB,

On peut se passer de VBA avec cette formule matricielle en F2 du fichier joint :

=SIERREUR(INDEX($A:$A;PETITE.VALEUR(SI($E2<>"RUPTURE";SI(($D$2:$D$1000=$D2)*($E$2:$E$1000="RUPTURE");LIGNE($E$2:$E$1000));SI(($D$2:$D$1000=$D2)*($E$2:$E$1000<>"RUPTURE");LIGNE($E$2:$E$1000)));COLONNES($F2:F2)));"")

à valider par Ctrl+Maj+Entrée tirer à droite et vers le bas.

Les résultats ne sont pas concaténés mais dans des cellules adjacentes.

A+
Merci encore job75 votre formule m'a ebloui meme si je n'arrive pas encore à la déchiffrer.
Je l'ai adaptée à plusieurs situations et elle est impeccable cependant une petite préoccupation:
Ici si j'ai compris notre plage doit faire maxi 1000 lignes.
je voudrais l'uliser dans un code VBA et remplacer 1000 par "dlig" (dernière ligne non vide) au cas ou on aurait plus de lignes
Pour déterminer dlig pas de soucis.
Merci encore
 

job75

XLDnaute Barbatruc
Bonjour KTM, le forum,

On peut rendre la formule de mon post #10 dynamique avec des plages nommées :
Code:
=SIERREUR(INDEX(STRUCTURE;PETITE.VALEUR(SI($E2<>"RUPTURE";SI((PRODUIT=$D2)*(ETAT="RUPTURE");LIGNE(ETAT));SI((PRODUIT=$D2)*(ETAT<>"RUPTURE");LIGNE(ETAT)));COLONNES($F2:F2)));"")
les plages étant renommées à chaque modification de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With [A1].CurrentRegion
    .Columns(1).Name = "STRUCTURE"
    .Columns(4).Name = "PRODUIT"
    .Columns(5).Name = "ETAT"
End With
End Sub
Fichier (2).

Bonne journée.
 

Pièces jointes

  • Traitement_BD(2).xlsm
    24.8 KB · Affichages: 8

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal