Titre du sujet : Re: Userform ou pas? par myDearFriend! le 31/07/2010 01:39:50
Bonsoir Stéphane,
Citation : Stephane a écrit :
...
Le but était de pouvoir, à partir d'un fournisseur, retrouver tous les clients avec les contrats qui les accompagnent.
La feuille FP n'est qu'une illustration que j'avais faite, pour partiellement résoudre mon "problème" puisque j'étais obligé par le temps de soumettre mes travaux à mes supérieurs.
Il s'est agit alors de créer une "sorte de fiche prospect" (feuille FP) avec liste déroulante qui permettait à chaque fois que je clique sur un fournisseur de retrouver le contrat et le client.
...
Bien, tu trouveras en pièce jointe mon interprétation de cette « liste de choix » (il te faut activer le contenu VBA à l'ouverture du classeur).
Attention toutefois, le code VBA est adapté à la structure du tableau de l'exemple fourni. Tu peux ajouter des lignes, elles seront automatiquement prises en compte. Mais il ne faut pas en modifier sa structure (entêtes de tableau en ligne 3, 13 colonnes, Fournisseur en colonne A, Clients en colonne M et contrats en colonne B notamment).
Par ailleurs, je me suis contenté de gérer la liste de choix, la mise à jour de la page "FP" est assurée par tes formules que je n'ai pas retouchée (formules basées sur la valeur de la cellule B3, seule cellule que je mets à jour à l'aide du code).
D'autre part, j'ai adapté le code à la structure de ton tableau actuel, mais je reste du même avis que Guy : ce tableau est à simplifier et devrait plus ressembler à une base de données simple.
Pour info, j'ai utilisé le code VBA suivant dans un module de code standard :
Option Explicit
'------------------------------------------------------------------------
' Auteur : Didier FOURGEOT (myDearFriend!) - www.mdf-xlpages.com
' Date : 31/07/2010
' Sujet : Menu en cascade
'------------------------------------------------------------------------
Sub AffichListe()
Dim CB As CommandBar
Dim M As CommandBarPopup, M1 As CommandBarPopup, M2 As CommandBarButton
Dim TabTemp As Variant
Dim L As Long
'On mémorise la liste des données
With Sheets("Fiche fournisseur & client")
'L = .Cells(.Rows.Count, 1).End(xlUp).Row
L = .Range("A3").CurrentRegion.Rows.Count + 2
TabTemp = .Range(.Cells(4, 1), .Cells(L, 13)).Value
End With
'On crée une barre de menu temporaire
On Error Resume Next
Application.CommandBars("MenuD").Delete
On Error GoTo 0
Set CB = Application.CommandBars.Add("MenuD", msoBarPopup, , True)
For L = 1 To UBound(TabTemp, 1)
If TabTemp(L, 1) <> "" And TabTemp(L, 1) <> "Total" Then
'1er niveau du menu : Fournisseurs
Set M = ElmtMenu(TabTemp(L, 1), CB, True)
'2ème niveau du menu : Clients
Set M1 = ElmtMenu(TabTemp(L, 13), M, True)
'3ème niveau du menu : Contrats
Set M2 = ElmtMenu(TabTemp(L, 2), M1, False, L)
M2.OnAction = "'Maj """ & M2.Tag & """'"
End If
Next L
'Affiche le menu
With Application.CommandBars("MenuD")
If .Controls.Count > 0 Then .ShowPopup
.Delete
End With
End Sub
Private Function ElmtMenu(ByVal T$, MenuParent As Object, Pop As Boolean, Optional L As Long = 0) As Object
Dim M As CommandBarControl
On Error Resume Next
Set M = MenuParent.Controls(T)
On Error GoTo 0
If M Is Nothing Then
Set M = MenuParent.Controls.Add(IIf(Pop, msoControlPopup, msoControlButton), , , , True)
M.Caption = T
If L > 0 Then M.Tag = CStr(L)
End If
Set ElmtMenu = M
End Function
Sub Maj(ByVal T As String)
'on inscrit l'index du choix en B1 sur feuille "FP"
Sheets("FP").Range("B1").Value = Val(T)
End Sub
En espérant que cette proposition puisse t'inspirer...
Cordialement,
|