Rapport de message :*
 

Re: Evolution d'un UseForm suivant le contenu d'un tableau

Titre du sujet : Re: Evolution d'un UseForm suivant le contenu d'un tableau
par myDearFriend! le 11/08/2009 03:24:02

Re,

Tu trouveras ci-joint ton fichier modifié pour tenter de répondre à ton souhait...

J'ai utilisé le code suivant (dans le module de code du Userform) :
Option Explicit
'myDearFriend!  -  www.mdf-xlpages.com

Private Sub UserForm_Initialize()
Dim DerLign As Long
    'Remplir la combo Clients
    With Enseigne
        .ColumnCount = 2        'la combo aura 2 colonnes
        .BoundColumn = 2        'la propriété Value tirera sa valeur de la 2ème colonne
        .ColumnWidths = ";0 pt" 'la 2ème colonne sera masquée à l'affichage utilisateur
    End With
    With Sheets("Données")
        'La plage B5:C7 (ou plus...) sera affectée à la combo
        DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
        Enseigne.List = .Range(.Cells(5, 2), .Cells(DerLign, 3)).Value
    End With
End Sub

Private Sub Enseigne_Change()
Dim DerLign As Long
    If Enseigne.ListIndex > -1 Then
        lstPrestations.Clear
        With Sheets(Enseigne.Value)
            DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
            lstPrestations.List = .Range(.Cells(1, 1), .Cells(DerLign, 3)).Value
        End With
    End If
End Sub

Private Sub lstPrestations_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Q As String
    'Saisir la quantité
    With lstPrestations
        Q = Application.InputBox("Quelle quantité de " & .List(.ListIndex, 1) & " ?", "Quantité", .List(.ListIndex, 2), Type:=1)
        If Q <> "Faux" Then     'Choix <> Annuler
            .List(.ListIndex, 2) = IIf(Val(Q) > 0, Q, "")
        End If
    End With
End Sub

Private Sub btnQuantites_Click()
'J'ai ajouté ce bouton uniquement pour que tu puisses comprendre comment récupérer à la fin les quantités saisies
Dim T As String
Dim L As Byte
    With lstPrestations
        'Si la liste contient des lignes
        If .ListCount > 0 Then
            'Pour chaque ligne de la liste
            For L = 0 To .ListCount - 1
                'Si présence d'une quantité
                If .List(L, 2) <> "" Then
                    T = T & .List(L, 2) & " - " & .List(L, 1) & vbLf
                End If
            Next L
        End If
    End With
    'On affiche le résumé
    If T <> "" Then
        MsgBox T
    Else
        MsgBox "Aucune quantité n'a été saisie !"
    End If
End Sub
Pour que sa puisse être jouable, j'ai dû revoir un peu la structure des onglets "Client...".

Comme tu le verras, j'ai choisi la solution la plus simple : une listbox pour pouvoir afficher simplement un nombre variable d'éléments. La saisie des quantités est ensuite possible par un simple double-clic dans cette liste.

Une autre solution aurait consisté à une création dynamique de contrôles TextBox et Labels. Mais, compte tenu de tes débuts VBA, je te déconseille fortement ce type de solution assez délicate à mettre en oeuvre et nécessitant la modification d'un paramètre de sécurité sur chaque poste devant utiliser le classeur...

Quelques points si tu le permets et puisque tu débutes avec VBA :

Citation :
dedechseb a écrit :
-D'une part je ne sais pas pourquoi, mais le menu déroulant des clients qui marchait bien jusqu'à présent a décidé de ne plus afficher les noms... Il y'a le nombre de ligne nécessaire, mais plus les noms sur chaque ligne.

Cette mauvaise surprise est causée par la propriété RowSource que tu as utilisée pour charger la ComboBox. Si la feuille active est bien la feuille "Données" au moment où tu affiches ton Userform, alors la RowSource "B5:B...." fonctionnera bien, mais si la feuille active n'est pas la bonne, ta RowSource ne pointera plus au bon endroit !
Tu peux normalement contourner ce problème en nommant au préalable ta plage de cellules, puis en affectant le nom de cette plage à la propriété RowSource (en lieu et place de l'adresse de plage).

Cela dit, la meilleur méthode consiste tout simplement à proscrire l'utilisation de cette propriété RowSource. Je te conseille de regarder la méthode AddItem en particulier ou même de faire directement comme je l'ai fait dans le code ci-dessus : on affecte directement les valeurs de toute la plage dans la propriété List de la ComboBox.
Cela se passe dans le passage suivant :
   With Sheets("Données")
        'La plage B5:C7 (ou plus...) sera affectée à la combo
        DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
        Enseigne.List = .Range(.Cells(5, 2), .Cells(DerLign, 3)).Value
    End With

Par ailleurs, je te recommande fortement l'utilisation de Option Explicit placé en tête de module (comme ci-dessus). Voir le cas échéant, l'explication qui en est faite dans l'article VBA et les variables.

Si tu as besoin d'explications complémentaires sur le code que j'ai utilisé plus haut, n'hésite pas.
Je te laisse reprendre en main ton projet maintenant et te souhaite un bon développement

Cordialement,