IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Obligation de sélectionner un item dans une "Listbox" [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut Obligation de sélectionner un item dans une "Listbox"
    Bonjour,

    Dans "mon" programme vba de commande de produits, dés lors que le nom du client est saisi, c'est qu'il y a manifestement des produits à commander.

    Les produits sont à sélectionner dans une "listbox multiselect" installée sur un userform.

    Une fois les produits sélectionnés, je "valide" cette sélection et je déclenche, un "inputbox" pour collecter les quantités de chacun des produits. Quand tout est complété, je passe au client suivant.

    Mais, si aucun produit n'est sélectionné dans la listbox, je passe directement au client suivant. Pour moi, ceci n'est pas acceptable et je souhaiterais "obliger" à la sélection d'au moins un produit. J'ai donc écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Private Sub cmdValider_Click()
    Dim Quantite As Variant
    Dim Client As String
    Dim LastLig As Long, Lig As Long
    Dim LastCol As Integer, Col As Integer
    Dim Produit As String
    Dim Compteur As Single
    Dim ComValable As String
    Sheets("Commande").Select
            Client = Label2.Caption
            Produit = ListBox1.List(Compteur)
                If ListBox1.Selected(Compteur) = False Then
                    MsgBox "Vous devez d'abord sélectionner les produits dans la colonne de gauche", vbCritical + vbOKOnly, " Produit non sélectionné"
                    Exit Sub
                    Call cmdValider_Click
                End If
            For Compteur = 0 To (ListBox1.ListCount - 1)
                If ListBox1.Selected(Compteur) = True Then
                        With Sheets("Commande")
                            LastCol = .Cells(3, .Columns.Count).End(xlToLeft).Column
                            Set c = .Range(.Cells(3, 3), .Cells(3, LastCol)).Find(Client, lookat:=xlWhole)
                                If Not c Is Nothing Then
                                    Col = c.Column                                      'La Colonne
                                    Set c = Nothing
                                    LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
                                    Set r = .Range("A4:A" & LastLig).Find(Produit, lookat:=xlWhole)
                                        If Not r Is Nothing Then
                                            Lig = r.Row                                     'La Ligne
                                            Set r = Nothing
                                            Quantite = InputBox("Combien de " & UCase(Produit) & Chr(10) & " commandée par " & Client, "Indication des quantités", Quantité)
                                                If Quantite = "" Then
                                                    MsgBox "Vous devez indiquer une quantité", vbCritical + vbOKOnly, "Quantité non idiquée"
                                                    Quantite = InputBox("Combien de " & UCase(Produit) & Chr(10) & " commandée par " & Client, "Indication des quantités", Quantité)
                                                End If
                                            .Cells(Lig, Col).Value = Quantite
                                        End If
                                End If
                        End With
                End If
            Next Compteur
        autreclient = MsgBox("Autre inscription ou modification de client ?", vbQuestion + vbYesNoCancel + vbDefaultButton1, "Inscription d'un autre client")
            If autreclient = vbYes Then
                For Compteur = 0 To (ListBox1.ListCount - 1)
                ListBox1.Selected(Compteur) = False
                Next Compteur
                cmdValider.Visible = False
                Label2.Visible = False
                Label2.Caption = ""
                Label3.Visible = False
                Action = MsgBox("Selon le cas, (re)cliquez sur 'nouveau client' ou sur 'modification client'", vbOKOnly, "Poursuite des commandes")
            ElseIf autreclient = vbNo Or vbCancel Then
                MsgBox "Vous allez pouvoir consulter le bon de commande." & Chr(10) & Chr(10) & "Regardez-le attentivement puis cliquez sur la petite croix rouge en haut à droite et, enfin, sur l'écran suivant, répondez à la question posée.", vbOKOnly, "Vérification des commandes Première étape"
                Application.ScreenUpdating = False
                Unload Me
                Unload UserFormEC
                Worksheets("Commande").PrintPreview
                Application.ScreenUpdating = True
                UserForm1.Show
                Exit Sub
            End If
    Si la procédure réagit bien dans un premier temps (message d'obligation et réappel de la procédure), j'ai ensuite des erreurs sur la prise en compte des produits. Exemple : je suis obligé de commander au moins sur le premier item de la listbox; pour le client suivant, je tombe indéfiniment sur la même obligation. Bref : c'est le bazard !

    Pourriez-vous m'aider sur ce point : comment obliger à cliquer sur un item de ma listbox ?

    Je vous en remercie par avance.
    Cordialement,
    Maurice

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,


    Pourquoi dans le premier test tu sort pour appeler de nouveau la procedure (boucle sans fin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                If ListBox1.Selected(Compteur) = False Then
                    MsgBox "Vous devez d'abord sélectionner les produits dans la colonne de gauche", vbCritical + vbOKOnly, " Produit non sélectionné"
                    Exit Sub
                    Call cmdValider_Click
                End If

  3. #3
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut bonjour mauricegillier, jfontaine,
    effectivement j'ai du mal à tout comprendre.

    Déjà la non affectation d'une valeur à la variable "compteur" me choque.

    Je n'ai pas approfondi le code mais la question finale une solution standart :
    • dans la procédure évènement lors du choix du client définir "ListBox1.ListIndex = -1"
    • Faire un test lors du clic sur le bouton valider du genre :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If ListBox1.ListIndex=-1 then msgbox "Choisissez au moins un produit":exit sub


    ESVBA

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    Bonjour Jérôme, Bonjour "ESVBA",

    Tout d'abord, pour Jérôme : je pensais avoir écrit dans ma procédure : "si pas de sélection alors message, sortie de la procédure puis réappel de la procédure . Là, je pensais que je pouvais alors sélectionner au moins un item et repartir normalement puisque, au moins un item étant choisi, je dépassais la condition "si pas de sélection".

    Tu me dis que cela fait une boucle sans fin... Dont acte ! Mais mon manque de connaissance ne me permet pas de comprendre le pas à pas. En tout cas, j'ai supprimé le call "même procédure"

    Ensuite, pour ESVBA : tu as raison pour l'affectation de valeur à ma variable "compteur". En fait, elle était en tête de procédure puis je l'ai déplacée en dessous de la fameuse condition. Du coup, effectivement, je me retrouve avec une variable sans valeur. Je l'ai donc remis à sa place.

    J'ai donc aussi suivi tes conseils en initialisant ma listbox à -1 pour les index et je la réinitialise lors de l'appel de la procédure pour un nouveau client. En tout les cas, maintenant, ça marche !

    Pour examen éventuel, je vous mets les codes revus grâce à vous deux :

    Initialisation de la listbox1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub UserForm_Initialize()
        Dim DerCell As String
    'détermination de la longueur de la listbox1
        DerCell = Range("A4").End(xlDown).Address
        ListBox1.RowSource = "A4:" & DerCell
        ListBox1.Height = ListBox1.Font.Size * (ListBox1.ListCount) * 1.25
        ListBox1.ListIndex = -1
     
    End Sub
    La procédure revue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Private Sub cmdValider_Click()
    'déclarations de variables
        Dim Quantite As Variant
        Dim Client As String
        Dim LastLig As Long, Lig As Long
        Dim LastCol As Integer, Col As Integer
        Dim Produit As String
        Dim Compteur As Single
        Sheets("Commande").Select 'Assurance que la feuille "Commande" est bien active
                Client = Label2.Caption 'Récupération de la variable "Client"
    'Sélection des produits avec vérification qu'au moins un item de la listbox1 est bien sélectionné
                For Compteur = 0 To (ListBox1.ListCount - 1)
                    If ListBox1.ListIndex = -1 Then 'la valeur -1 a été attribuée lors de l'initialisation de la listbox1
                        MsgBox "Choisissez au moins un produit"
                        Exit Sub
                    End If
    ' Affection des produits au client
                Produit = ListBox1.List(Compteur)
                    If ListBox1.Selected(Compteur) = True Then
                            With Sheets("Commande")
                                LastCol = .Cells(3, .Columns.Count).End(xlToLeft).Column
                                Set c = .Range(.Cells(3, 3), .Cells(3, LastCol)).Find(Client, lookat:=xlWhole)
                                    If Not c Is Nothing Then
                                        Col = c.Column                                      'La Colonne
                                        Set c = Nothing
                                        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
                                        Set r = .Range("A4:A" & LastLig).Find(Produit, lookat:=xlWhole)
                                            If Not r Is Nothing Then
                                                Lig = r.Row                                     'La Ligne
                                                Set r = Nothing
    ' Affection des quantités à chaque produit
                                                Quantite = InputBox("Combien de " & UCase(Produit) & Chr(10) & " commandée par " & Client, "Indication des quantités", Quantité)
                                                    If Quantite = "" Then
                                                        MsgBox "Vous devez indiquer une quantité", vbCritical + vbOKOnly, "Quantité non idiquée"
                                                        Quantite = InputBox("Combien de " & UCase(Produit) & Chr(10) & " commandée par " & Client, "Indication des quantités", Quantité)
                                                    End If
                                                .Cells(Lig, Col).Value = Quantite
                                            End If
                                    End If
                            End With
                    End If
                Next Compteur
    ' Dialogue pour savoir si un autre client doit être inscrit
            autreclient = MsgBox("Autre inscription ou modification de client ?", vbQuestion + vbYesNoCancel + vbDefaultButton1, "Inscription d'un autre client")
                If autreclient = vbYes Then 'effacement de toutes les données précédentes et réinitialisation du compteur Listbox
                    For Compteur = 0 To (ListBox1.ListCount - 1)
                    ListBox1.Selected(Compteur) = False
                    Next Compteur
                    ListBox1.ListIndex = -1
                    cmdValider.Visible = False
                    Label2.Visible = False
                    Label2.Caption = ""
                    Label3.Visible = False
                    Action = MsgBox("Selon le cas, (re)cliquez sur 'nouveau client' ou sur 'modification client'", vbOKOnly, "Poursuite des commandes")
                ElseIf autreclient = vbNo Or vbCancel Then
                    MsgBox "Vous allez pouvoir consulter le bon de commande." & Chr(10) & Chr(10) & "Regardez-le attentivement puis cliquez sur la petite croix rouge en haut à droite et, enfin, sur l'écran suivant, répondez à la question posée.", vbOKOnly, "Vérification des commandes Première étape"
                    Application.ScreenUpdating = False
                    Unload Me
                    Unload UserFormEC
                    Worksheets("Commande").PrintPreview
                    Application.ScreenUpdating = True
                    UserForm1.Show
                    Exit Sub
                End If
        End Sub

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    OUPS !

    J'ai oublié de redire merci et de saluer cordialement et, enfin, de signer !

    Malotru

    Cordialement,
    Maurice

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex4] Sélectionner un Item dans une ComboBox
    Par tlafont2607 dans le forum Flex
    Réponses: 1
    Dernier message: 01/04/2013, 19h57
  2. Réponses: 4
    Dernier message: 17/12/2009, 14h41
  3. Sélectionner des Items dans une ListBox
    Par berpi dans le forum Débuter
    Réponses: 3
    Dernier message: 07/02/2008, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo