Moteur de recherche + Fonction modifier VBA-USERFORM

Smaily

XLDnaute Junior
Bonjour,

Je souhaite créer une sorte de moteur de recherche en VBA, cela dit je bloque un peu.
Le but de cette macro est de rechercher une ligne de la feuille "Répertoire" comportant la donnée recherchée. (une sorte de filtre)

Merci d'avance pour le coup de main.
Cordialement.
 

Pièces jointes

  • METZ.xlsm
    48.4 KB · Affichages: 35

Smaily

XLDnaute Junior
Oui maintenant le programme fonctionne super merci !!
Mais il me semble que cela à engendrer un petit problème...
1565609780170.png


les références disparaissent lorsqu'on en ajoute des nouvelles est-ce lié ?
 

Dranreb

XLDnaute Barbatruc
Non. Il ne s’agrandit pas automatiquement. C’est pourquoi je n’ai pas agrandi non plus le tableau: pour ne pas mettre le bazar dans les séries, auxquelles je n'ai d'ailleurs pas compris grand chose.
Si vous voulez simplement montrer le nombre de conteneur aux emplacement il fallait simplement le compter et ne sortir que ça.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bon, bon d'accord …
Comme ça, ça peut s'agrandir …mais pas se rapetisser, et ça n'ajoute pas de nouvelles séries…
VB:
Option Explicit
Private Sub Worksheet_Activate()
   Dim Dico As Dictionary, Données As Collection, LOt As ListObject, LMax As Long, CMax As Long, L As Long, C As Long, _
      TTit(), TRés(), Réf As SsGr, Emp As SsGr, Rng As Range, NbEmpl As Long, AdrTit As String, S As Series
   Set Dico = DicInvent(Feuil1, 8, 2)
   Set Données = Gigogne(Null, 2, 8)
   Set LOt = Me.ListObjects(1)
   LMax = LOt.ListRows.Count: L = Données.Count: If LMax < L Then LMax = L
   CMax = LOt.ListColumns.Count: C = Dico.Count + 1: If CMax < C Then CMax = C
   ReDim TTit(1 To 1, 1 To CMax), TRés(1 To LMax, 1 To CMax)
   TTit(1, 1) = "Référence"
   VerserEntêtes TTit, Dico
   L = 0
   For Each Réf In Données
      L = L + 1
      TRés(L, 1) = Réf.ID
      For Each Emp In Réf.Co
         C = Dico(Emp.ID)
         If C <= UBound(TRés, 2) Then TRés(L, C) = Emp.Count
         Next Emp, Réf
   LOt.HeaderRowRange.Resize(1, CMax).Value = TTit
   LOt.DataBodyRange.Resize(LMax, CMax).Value = TRés
   Set Rng = LOt.HeaderRowRange: NbEmpl = CMax - 1
   AdrTit = Rng(1, 2).Resize(, NbEmpl).Address(True, True, xlA1, True)
   L = 0
   For Each S In ChartObjects(1).Chart.SeriesCollection
      L = L + 1
      Set Rng = LOt.ListRows(L).Range
      S.Formula = "=SERIES(" & Rng(1, 1).Address(True, True, xlA1, True) & "," & AdrTit & "," _
         & Rng(1, 2).Resize(, NbEmpl).Address(True, True, xlA1, True) & "," & L & ")"
      Next S
   End Sub
 

Smaily

XLDnaute Junior
D'accord bien reçu merci.
Oui ça me va en fait l'opérateur va saisir les différents paramètres des conteneurs transitant sur le quai grâce à ce formulaire.
Le "BILAN GRAPH" est une synthèse schématique du nombre de conteneur par emplacement.
Il y a en moyenne une cinquantaine de container pour environ 70 emplacements sur le quai ce qui fait que le tableau doit être capable de s'adapter par rapport au saisie. Tout en sachant que cette exploitation est susceptible de s'agrandir et de connaitre un flux de transit plus important.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je n'avais pas réalisé… Les emplacements devraient-ils rester fixes dans les titres du BILAN GRAPH mêmes s'ils ne sont pas trrouvés dans les données ? Là je renseigne les titres avec ceux trouvés, mais ce n'est peut être pas ce que vous vouliez ?
 

Smaily

XLDnaute Junior
Votre méthode est correct car le nom des emplacements est pour l'instant temporaire. Cette nomination peut éventuelle évoluer. Ainsi si dans l'avenir la direction décide de changer le nom des emplacements le programme doit pouvoir s'adapter. L'idée de relever dans les deux colonnes : "Référence" et "emplacement" me semble une bonne idée.
 

Dranreb

XLDnaute Barbatruc
Je me demande s'il ne vaudrait pas mieux que le tableau soit dans l'autre sens, surtout s'il y a plus d'emplacements que de conteneurs.
En ayant fait l'essai de changer la référence de données globale pour le graphique il m'a semblé qu'il créait automatiquement une série pour chaque colonne et non pour chaque ligne…
 

Smaily

XLDnaute Junior
Oui je suis d'accord avec vous, il créait une serie par emplacement. Après le bilan graph est basé sur les emplacements et non sur les références, il permet de savoir quelle marchandise il y a à quelle emplacement, je sais pas si le fait d'inverser les lignes et les colonnes est alors une bonne idée...
 

Dranreb

XLDnaute Barbatruc
Je n'arrive plus à reproduire le phénomène ou il créait un trop grand nombre de séries. Je ne suis pas familier de ce type de graphique. Tout ce que je sais c'est que d'habitude les valeurs de séries sont disposées verticalement, non horizontalement, donc je pensais qu'il créait une série par emplacement. Mais c'est ce que vous dites d'ailleurs, alors qu'au bout du compte il y a en réalité une série par référence.
Bon. Admettons qu'on garde cette disposition. Voulez vous que les colonnes d'emplacements en trop soient supprimées ?
Il me semblait que ça fusillait des références de séries, et je ne sais pas si on peut corriger derrière…
 

Smaily

XLDnaute Junior
D'accord pas de soucis ce n'est pas bien grave. Le BILAN GRAPHE doit simplement être une synthèse de la feuille répertoire. Une sorte de copier/coller des références par emplacements. Ainsi si l'emplacement est vide alors pourquoi pas supprimer cette colonne. Cette action rendra le graphique plus lisible et inclura uniquement les emplacements occupés.
Exemple l'emplacement A46 doit être supprimé :

TEST2.png
 

Dranreb

XLDnaute Barbatruc
À tester :
VB:
Option Explicit
Private Sub Worksheet_Activate()
   Dim Dico As Dictionary, Données As Collection, NbEmpl As Long, CMax As Long, LMax As Long, _
      TTit(), TRés(), Réf As SsGr, Emp As SsGr, L As Long, SCn As SeriesCollection, _
      LOt As ListObject, Rng As Range, C As Long, AdrEmpl As String, S As Series

Rem. ——— Élaboration des tableaux dynamiques à verser comme résultats.
   Set Dico = DicInvent(Feuil1, 8, 2): NbEmpl = Dico.Count: CMax = NbEmpl + 1
   Set Données = Gigogne(Null, 2, 8): LMax = Données.Count
   ReDim TTit(1 To 1, 1 To CMax), TRés(1 To LMax, 1 To CMax)
   TTit(1, 1) = "Référence": VerserEntêtes TTit, Dico
   For Each Réf In Gigogne(Feuil1, 2, 8)
      L = L + 1
      TRés(L, 1) = Réf.ID
      For Each Emp In Réf.Co
         If Dico.Exists(Emp.ID) Then TRés(L, Dico(Emp.ID)) = Emp.Count
         Next Emp, Réf

Rem. ——— Suppression des séries, lignes et colonnes en trop.
   Set SCn = ChartObjects(1).Chart.SeriesCollection
   While LMax < SCn.Count: SCn(LMax + 1).Delete: Wend
   Set LOt = Me.ListObjects(1)
   While LOt.ListRows.Count > LMax: LOt.ListRows(LMax + 1).Delete: Wend
   While LOt.ListColumns.Count > CMax: LOt.ListColumns(CMax + 1).Delete: Wend

Rem. ——— Versement des résultats.
   LOt.HeaderRowRange.Resize(, CMax).Value = TTit
   LOt.DataBodyRange.Resize(LMax, CMax).Value = TRés

Rem. ——— Correction des séries.
   Set Rng = LOt.HeaderRowRange
   For C = 2 To CMax: Dico(TRés(1, C)) = C: Next C
   NbEmpl = Rng.Columns.Count - 1
   AdrEmpl = Rng(1, 2).Resize(, NbEmpl).Address(True, True, xlA1, True)
   For L = 1 To UBound(TRés, 1)
      Set Rng = LOt.ListRows(L).Range
      If L <= SCn.Count Then Set S = SCn(L) Else Set S = SCn.Add(Rng(1, 1))
      S.Formula = "=SERIES(""" & TRés(L, 1) & """," & AdrEmpl & "," _
         & Rng(1, 2).Resize(, NbEmpl).Address(True, True, xlA1, True) & "," & L & ")"
      Next L
   End Sub
 

Dranreb

XLDnaute Barbatruc
Ça ne devrait plus, puisque je supprime les séries en trop avant de supprimer les lignes en trop.
Mais peut être les séries existantes n'étaient-elles pas encore dans l'ordre des lignes ?
D'ailleurs pourquoi apparaissent-elles en ordre décroissant ? Je les mets en ordre alphanumérique croissant dans le tableau TRés !
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 327
Membres
103 516
dernier inscrit
René Rivoli Monin