Rapport de message :*
 

Re: Userform ou pas?

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,