Créer liste sans doublons et rechercheV

Everlast03

XLDnaute Occasionnel
Bonjour à tous,

Après des heures de recherche concernant mon problème que je vais vous expliciter ci-dessous, je jette l'éponge et m'en remets à vous, chers amis exceleurs !

Je souhaite récupérer en fonction d'une liste de nom, plusieurs informations dans des listes (une sorte de tableau croisé dynamique). Mais plusieurs problèmes se posent, tout d'abord ma liste contient des doublons et je n'arrive pas à m'en acquitter ...

Je vous laisse regarder au fichier excel fournit pour plus de compréhension.

Vous remerciant grandement par avance !

Le fichier : http://cjoint.com/?3Gxp5AwcqIC
 

Dranreb

XLDnaute Barbatruc
Re : Créer liste sans doublons et rechercheV

Bonjour.
C'est manifestement du travail pour OutIdx, ça.
Si vous êtes d'accord pour utiliser ce classeur en outil auxiliaire je vous mettrai la programmation qui convient.
Ce code donne déjà des résultats encourageants:
VB:
Option Explicit
Dim WithEvents Casc As OutIdx.ComboBoxCasc
Dim DicPost As Dictionary
Dim PlgGEH As Range

Private Sub Worksheet_Activate()
Set PlgGEH = OutIdx.PlgUti(FeuiGEH.[A13])
Set Casc = OutIdx.CbxCasc
Casc.Add Me.CbxNom, PlgGEH.Columns("E")
Casc.Add Me.CbxPrn, PlgGEH.Columns("F")
Casc.Actualiser
Set DicPost = OutIdx.DictionnArbo(OutIdx.ColUti(FeuiInv.[C13]))
End Sub

Private Sub Casc_Bingo(Lignes() As Long)
Dim N As Long, L As Long, Hall As String, Post As String, LibPost As String, TLSubs() As Long, TSubst() As Variant, S As Long, TZ() As String
Application.Calculation = xlCalculationManual
Me.Rows(6).Resize(Rows.Count - 5).ClearContents
TSubst = OutIdx.ColUti(FeuiInv.[E13]).Value
For N = 1 To UBound(Lignes)
   L = Lignes(N)
   Me.[F3].Value = PlgGEH(L, "G").Value
   Post = Trim$(PlgGEH(L, "C").MergeArea.Rows(1).Value)
   Hall = Trim$(PlgGEH(L, "D").MergeArea.Rows(1).Value)
   Me.Cells(N + 5, 1).Value = Post
   Me.Cells(N + 5, 2).Value = Hall
   LibPost = Post & " (" & LCase(Hall) & ")"
   If DicPost.Exists(LibPost) Then
      TLSubs = DicPost.Item(LibPost)
      ReDim TZ(1 To UBound(TLSubs)) As String
      For S = 1 To UBound(TLSubs)
         TZ(S) = TSubst(TLSubs(S), 1)
         Next S
      Me.Cells(N + 5, "K").Value = Join(TZ, ", ")
   Else
      Me.Cells(N + 5, "K").Value = "*** Libellé """ & LibPost & """ introuvable."
      End If
   Next N
Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub Casc_Défait()
Me.Rows(6).Resize(Rows.Count - 5).ClearContents
End Sub

Private Sub Worksheet_Deactivate()
Set Casc = Nothing
End Sub
À noter que j'ai renommé les CodeName des feuilles FeuiPFE (PFE), FeuiGEH (GEH), FeuiInv (Inventaire).
Ce code est donc à mettre dans FeuiPFE (PFE)
Et puis surtout j'ai remplacés vos listes déroulantes par des vrais ComboBox de la boite à outils contrôles que j'ai nommés CbxNom et CbxPrn.
Cordialement.
 
Dernière édition:

Everlast03

XLDnaute Occasionnel
Re : Créer liste sans doublons et rechercheV

Bonjour,

Merci pour ta réponse.
J'ai fait comme tu m'a dit cependant j'ai un problème avec
Code:
Dim DicPost As Dictionary
.
J'ai "type défini par l'utilisateur non défini"

Peux-tu me dire d’où ça peut provenir ?

Modif : Après avoir chargé le fichier outidx, dans référence j'ai toujours un problème, peux tu me dire ce que je dois avoir exactement dans mes références ? Désolé j'suis vraiment débutant ...

Merci d'avance !
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Créer liste sans doublons et rechercheV

Bonjour.
Pas de panique.
Il manque juste la référence à "Microsoft Scripting Runtime".
J'ai mis ce matin une nouvelle version du DémoOutIdx qui vérifie aussi, dans son service, si cette référence y est.
C'est normal, vu que OutIdx peut renvoyer un Dictionary, de veiller à ce qu'il puisse être utilisé de façon optimale avec liaisons précoces à ses méthodes.
Cordialement.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Créer liste sans doublons et rechercheV

Je ne pense pas qu'il s'agisse de PlgGEH qui est déclaré tout en haut.
C'est sûrement FeuiGEH.
Il y a beaucoup de feuilles masquées.
Je vous recommande vivement de modifier les propriétés Name de toutes les feuilles dans la fenêtre de propriétés.
Parce que Feuil1 à Feuil26, désolé mais on ne s'y retrouvera jamais dans le code !
FeuiGEH (GEH)
Mais vous pouvez les coder autrement si vous voulez. J'aime bien que ça commence au moins par un F qui dit que c'est une feuille.
Sinon Feuil5 deviendra FeuiClsDg, Feuil16: FeuiBiSAN, Feuil23: FeuiCDgCLP etc. mais le dernier est déjà beaucoup trop long à mon avis.
À +
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Créer liste sans doublons et rechercheV

Non c'est dans VBA. Afficher la fenêtre de propriétés (touche F4, aussi)
La propriété name est la 1ère. Elle y est indiquée entre parenthèses, peut être à cause d'une propriété String CodeName qui contient le même nom. Mais on peut la changer. Et puis surtout parce que la propriété Name existe aussi: c'est le nom Excel !
Ça c'est le nom d'un objet WorkSheet directement connu du projet VBA sans avoir à demander à Excel de chercher à chaque fois dans toute la collection la feuille qui porte un certain nom Excel.
Et puis c'est un nom plus stable, en principe, une fois qu'on l'a décidé: l'utilisateur peut changer les noms d'onglets, ça n'empêche pas les macros de continuer à fonctionner si elles ne les utilisent pas.
À +
 
Dernière édition:

Everlast03

XLDnaute Occasionnel
Re : Créer liste sans doublons et rechercheV

Nickel !
Merci pour tes nombreuses explications qui m'éclairent plus les unes que les autres.
Cependant j'ai d'autres questions :p (après je t'embête plus!)
Serait il possible de créer récupérer les différentes substances avec une seule par ligne ? A l'heure actuelle tout est repris dans une cellule. Cependant pour indiquer l'exposition à chacune des substances il faut que je puisse rentrer la valeur pour chacune d'entre elle, or la c'est une exposition générale à la totalité des substances au poste.
Penses-tu également qu'il est possible de récupérer le matricule ainsi que la date de début et fin d'expo ?

Merci beaucoup, c'est un gain énorme dans mon travail...
 

Dranreb

XLDnaute Barbatruc
Re : Créer liste sans doublons et rechercheV

après je t'embête plus !
Si, si. Je veux dire Non, non. Ça m'a l'air d'un chantier assez vaste pour que je sois préparé à d'autres échanges par la suite.
Content que ça marche comme je l'avais prévu, ainsi que le prouve ton souhait.
Écoute, c'est juste une façon différente d'écrire la boucle dans Bingo:
Le N ne peut plus être utilisé que pour explorer Lignes, mais plus pour inscrire dans Me.Cells(…, "K"). Il faut pour cela une variable supplémentaire qui sera incrémentée à chaque passage de la boucle sur S. Ça ne devrait pas être beaucoup plus compliqué. Plus besoin de TZ ni d'utiliser Join. Mais essaie de l'écrire toi même pour acquérir le contrôle de cette programmation. Normalement le matricule est récupéré, c'est l'instruction Me.[F3].Value = PlgGEH(L, "G").Value, mais il y en a peu de renseignés, et j'ai aussi eu un peu de mal à trouver un gars dont il apparaît. Quand aux dates il n'y en a carrément aucune. Je ne les récupère pas, mais c'est facile comme le reste: tu les trouveras en PlgGEH(L, "H").Value et PlgGEH(L, "I").Value. Maintenant si c'était moi qui avait fait tout ça, j'aurai mis partout des noms aux plages consultées ou modifiées par les macros… Ce boulot dingue serait un placement en faveur de la maintenance future.

P.S. Dernière minute: j'ai trouvé un bug:
VB:
Set DicPost = OutIdx.DictionnArbo(OutIdx.ColUti(FeuiInv.[C13]))
Doit être exécuté avant:
VB:
Casc.Actualiser
sinon l'évènement Bingo peut se déclencher alors que le dictionnaire des postes de l'inventaire n'est pas construit.

Cordialement.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 452
Messages
2 088 542
Membres
103 880
dernier inscrit
rafaelredsc