XL 2021 problemde code vba

NicolasKH

XLDnaute Junior
bonjour j'ai un soucis que je n'arrive pas a resoudre:
je vais essayer de vous expliquer ca le plus claire possible

j'ai dans mon classeur un userform (ADDBOOKING) dans ce userform que je clique sur IN je voudrais que le cbocutomer se renseigne dans la feuil BOOKING colone E et que quand je clique sur OUT je voudrais que le cbocutomer se renseigne dans la feuil BOOKING colone F et mon probleme c'est peut que je clique sur IN ou OUT cela s'inscrit que dans la collone F.

ca fais deux jours que je tourne en rond
merci de votre aide
 

Pièces jointes

  • Gestion de Stock1.xlsm
    692.5 KB · Affichages: 7

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Tu testes si LblInfo1 vaut "Customer:", alors que c'est LblType qui vaut "Customer:".

Le plus logique, pour moi, serait de tester l'état de OptionIN ou de OptionOUT. ;)


La macro CommandButton2_Click pourrait ainsi devenir ceci :
VB:
Private Sub CommandButton2_Click()
'
Dim DL As Integer
Dim List_Nombre As Integer
Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1

    If Me.LibOrder.ListCount < 1 Then Exit Sub      ' Contrôle que la liste n'est pas vide

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To List_Nombre

        ' Ajouter une nouvelle ligne dans notre tableau
        Sheets(5).ListObjects(1).ListRows.Add
        ' Chercher le numéro de la prochaine ligne libre dans notre tableau
        DL = Sheets(5).Range("B" & Rows.Count).End(xlUp).Row

        ' Ajouter les information dans la base de donnee
        Sheets(5).Range("B" & DL) = Me.LblInfo1
        Sheets(5).Range("C" & DL) = Me.TxtBill
        Sheets(5).Range("D" & DL) = Me.CboNrOrder

        ' Contrôle si c'est un fournisseur ou un client
'        If Me.LblInfo1 = "Customer:" Then
'            Sheets(5).Range("E" & DL) = Me.CboType
'        Else
'            Sheets(5).Range("F" & DL) = Me.CboType
'        End If
        Sheets(5).Cells(DL, 5 - Me.OptionOUT.Value).Value = Me.CboType

        ' Ajouter les donnees de la zone de liste
        Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
        Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Et si tu veux travailler avec les référence de ton Tableau Structuré (que j'ai renommé de Tableau5 en t_Booking pour l'occasion), ça pourrait donner ceci :
(j'ai laissé tes lignes d'instruction VBA en commentaire, pour que tu puisses comparer plus facilement)
VB:
Private Sub CommandButton2_Click()
'
Dim DL As Integer
Dim List_Nombre As Integer
Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1
    If List_Nombre < 0 Then Exit Sub    ' Contrôle quei la liste n'est pas vide

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To List_Nombre

        ' Ajouter une nouvelle ligne dans notre tableau
'        Sheets(5).ListObjects(1).ListRows.Add
        [t_Booking].ListObject.ListRows.Add

        ' Chercher le numéro de la prochaine ligne libre dans notre tableau
'        DL = Sheets(5).Range("B" & Rows.Count).End(xlUp).Row
        DL = [t_Booking].Rows.Count

        ' Ajouter les informations dans la base de données
'        Sheets(5).Range("B" & DL) = Me.LblInfo1
        Range("t_Booking[Type]")(DL).Value = Me.LblInfo1
'        Sheets(5).Range("C" & DL) = Me.TxtBill
        Range("t_Booking[Nr bill]")(DL).Value = Me.TxtBill
'        Sheets(5).Range("D" & DL) = Me.CboNrOrder
        Range("t_Booking[Order number]")(DL).Value = Me.CboNrOrder

        ' Contrôle si c'est un fournisseur ou un client
'        If Me.LblInfo1 = "Customer:" Then
'            Sheets(5).Range("E" & DL) = Me.CboType
'        Else
'            Sheets(5).Range("F" & DL) = Me.CboType
'        End If
        Range("t_Booking[Customer]")(DL).Offset(0, -Me.OptionOUT.Value).Value = Me.CboType

        ' Ajouter les données de la zone de liste
'        Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
        Range("t_Booking[Nr article]")(DL).Value = Me.LibOrder.List(ligne, 0)
'        Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))
        Range("t_Booking[Quantity]")(DL).Value = Me.LibOrder.List(ligne, 0)

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub
 

NicolasKH

XLDnaute Junior
Et si tu veux travailler avec les référence de ton Tableau Structuré (que j'ai renommé de Tableau5 en t_Booking pour l'occasion), ça pourrait donner ceci :
(j'ai laissé tes lignes d'instruction VBA en commentaire, pour que tu puisses comparer plus facilement)
VB:
Private Sub CommandButton2_Click()
'
Dim DL As Integer
Dim List_Nombre As Integer
Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1
    If List_Nombre < 0 Then Exit Sub    ' Contrôle quei la liste n'est pas vide

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To List_Nombre

        ' Ajouter une nouvelle ligne dans notre tableau
'        Sheets(5).ListObjects(1).ListRows.Add
        [t_Booking].ListObject.ListRows.Add

        ' Chercher le numéro de la prochaine ligne libre dans notre tableau
'        DL = Sheets(5).Range("B" & Rows.Count).End(xlUp).Row
        DL = [t_Booking].Rows.Count

        ' Ajouter les informations dans la base de données
'        Sheets(5).Range("B" & DL) = Me.LblInfo1
        Range("t_Booking[Type]")(DL).Value = Me.LblInfo1
'        Sheets(5).Range("C" & DL) = Me.TxtBill
        Range("t_Booking[Nr bill]")(DL).Value = Me.TxtBill
'        Sheets(5).Range("D" & DL) = Me.CboNrOrder
        Range("t_Booking[Order number]")(DL).Value = Me.CboNrOrder

        ' Contrôle si c'est un fournisseur ou un client
'        If Me.LblInfo1 = "Customer:" Then
'            Sheets(5).Range("E" & DL) = Me.CboType
'        Else
'            Sheets(5).Range("F" & DL) = Me.CboType
'        End If
        Range("t_Booking[Customer]")(DL).Offset(0, -Me.OptionOUT.Value).Value = Me.CboType

        ' Ajouter les données de la zone de liste
'        Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
        Range("t_Booking[Nr article]")(DL).Value = Me.LibOrder.List(ligne, 0)
'        Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))
        Range("t_Booking[Quantity]")(DL).Value = Me.LibOrder.List(ligne, 0)

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub
merci beaucoup de votre reponse tres rapide et ca a bien fonction
pour ma part le probleme est bien resolu
 

patricktoulon

XLDnaute Barbatruc
Bonjour @NicolasKH


je vois dans la feuille booking un tableau structuré

a quoi te sert donc de fonctionner comme avec un range normale dans le code du commandbutton2?
je me dis qu'il y a quelque chose que tu n'a pas compris avec les TS(tableau structuré)


tu met toute l’exécution du code dans 2 condition ?
ce qui oblige vba a lire la fonction complete pendant l'execution
  1. le listcount>=0
  2. le msgbox
perso si une condition n'est pas bonne je sorts


donc par exemple
je remplace ce qui suit ci dessous
VB:
Private Sub CommandButton2_Click()
    Dim DL As Integer
    Dim List_Nombre As Integer
    Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1

    If Me.LibOrder.ListCount > 0 Then    'controle si la liste n'est pas vide

        If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbYes Then

            For ligne = 0 To List_Nombre

                'Ajouter une nouvelle ligne dans notre tableau
                Sheets(5).ListObjects(1).ListRows.Add
                'Chercher le numero de la prochaine ligne libre dans notre tableau
                DL = Sheets(5).Range("b99999").End(xlUp).Row

                'Ajouter les information dans la base de donnee
                Sheets(5).Range("B" & DL) = Me.LblInfo1
                Sheets(5).Range("C" & DL) = Me.TxtBill
                Sheets(5).Range("D" & DL) = Me.CboNrOrder

                'Control si c'est un fournisseur ou un client
                If Me.LblInfo1 = "Customer:" Then
                    Sheets(5).Range("E" & DL) = Me.CboType
                Else
                    Sheets(5).Range("F" & DL) = Me.CboType
                End If

                'Ajouter les donnees de la zone de liste
                Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
                Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))
            Next ligne

            MsgBox "BOOKING IS DONE"
            Unload Me
            ThisWorkbook.Save


        End If
    End If
End Sub

par ceci

VB:
Private Sub CommandButton2_Click()
    Dim x, ligne&
    If LibOrder.ListCount = 0 Then Exit Sub

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To LibOrder.ListCount - 1

        x = Array(LblInfo1, TxtBill, CboNrOrder, "", "", LibOrder.List(ligne, 0), LibOrder.List(ligne, 1))

        If Me.LblInfo1 = "Customer:" Then x(3) = Me.CboType Else x(4) = Me.CboType

        Range("Tableau5").ListObject.ListRows.Add.Range.Resize(, 7) = x

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub

on constate quoi?:
que si la liste est vide on sort
que si le msgbox est "Non"(vbno) on sort
que l'on a pas besoins de déterminer quelle ligne ou quoi que ce soit d'autre
que les données sont entrées d'un seul coup

tu constatera ,et je le dis en dernier pour que ça rentre ;)
qu'a aucun moment je précise la feuille ou le nom de la feuille
pourquoi?:
et bien parce que en utilisant son nom avec range je ne peux que tomber dessus
pour la simple et bonne raison que un "Tableau5" il ne peut y en avoir qu'un
donc range("Tableau5").listobject me désigne bien le listobject(1) de la feuille 5

les listobjects(tableaux structurés) ont été intégrés dans excel depuis 2007
il est temps d'apprendre a travailler avec ;)

peut être ce lien pourra t'éclaircir sur la manipulation des TS en vba
et le paragraphe 1.A résume parfaitement mon point de vue

 

NicolasKH

XLDnaute Junior
Bonjour @NicolasKH


je vois dans la feuille booking un tableau structuré

a quoi te sert donc de fonctionner comme avec un range normale dans le code du commandbutton2?
je me dis qu'il y a quelque chose que tu n'a pas compris avec les TS(tableau structuré)


tu met toute l’exécution du code dans 2 condition ?
ce qui oblige vba a lire la fonction complete pendant l'execution
  1. le listcount>=0
  2. le msgbox
perso si une condition n'est pas bonne je sorts


donc par exemple
je remplace ce qui suit ci dessous
VB:
Private Sub CommandButton2_Click()
    Dim DL As Integer
    Dim List_Nombre As Integer
    Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1

    If Me.LibOrder.ListCount > 0 Then    'controle si la liste n'est pas vide

        If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbYes Then

            For ligne = 0 To List_Nombre

                'Ajouter une nouvelle ligne dans notre tableau
                Sheets(5).ListObjects(1).ListRows.Add
                'Chercher le numero de la prochaine ligne libre dans notre tableau
                DL = Sheets(5).Range("b99999").End(xlUp).Row

                'Ajouter les information dans la base de donnee
                Sheets(5).Range("B" & DL) = Me.LblInfo1
                Sheets(5).Range("C" & DL) = Me.TxtBill
                Sheets(5).Range("D" & DL) = Me.CboNrOrder

                'Control si c'est un fournisseur ou un client
                If Me.LblInfo1 = "Customer:" Then
                    Sheets(5).Range("E" & DL) = Me.CboType
                Else
                    Sheets(5).Range("F" & DL) = Me.CboType
                End If

                'Ajouter les donnees de la zone de liste
                Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
                Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))
            Next ligne

            MsgBox "BOOKING IS DONE"
            Unload Me
            ThisWorkbook.Save


        End If
    End If
End Sub

par ceci

VB:
Private Sub CommandButton2_Click()
    Dim x, ligne&
    If LibOrder.ListCount = 0 Then Exit Sub

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To LibOrder.ListCount - 1

        x = Array(LblInfo1, TxtBill, CboNrOrder, "", "", LibOrder.List(ligne, 0), LibOrder.List(ligne, 1))

        If Me.LblInfo1 = "Customer:" Then x(3) = Me.CboType Else x(4) = Me.CboType

        Range("Tableau5").ListObject.ListRows.Add.Range.Resize(, 7) = x

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub

on constate quoi?:
que si la liste est vide on sort
que si le msgbox est "Non"(vbno) on sort
que l'on a pas besoins de déterminer quelle ligne ou quoi que ce soit d'autre
que les données sont entrées d'un seul coup

tu constatera ,et je le dis en dernier pour que ça rentre ;)
qu'a aucun moment je précise la feuille ou le nom de la feuille
pourquoi?:
et bien parce que en utilisant son nom avec range je ne peux que tomber dessus
pour la simple et bonne raison que un "Tableau5" il ne peut y en avoir qu'un
donc range("Tableau5").listobject me désigne bien le listobject(1) de la feuille 5

les listobjects(tableaux structurés) ont été intégrés dans excel depuis 2007
il est temps d'apprendre a travailler avec ;)

peut être ce lien pourra t'éclaircir sur la manipulation des TS en vba
et le paragraphe 1.A résume parfaitement mon point de vue

je te remerci beaucoup pour tes explication mais pour te dire la veriter j,ai suivi un tuto et en meme tenps je'ai modifier a ma magniere
 

NicolasKH

XLDnaute Junior
Et si tu veux travailler avec les référence de ton Tableau Structuré (que j'ai renommé de Tableau5 en t_Booking pour l'occasion), ça pourrait donner ceci :
(j'ai laissé tes lignes d'instruction VBA en commentaire, pour que tu puisses comparer plus facilement)
VB:
Private Sub CommandButton2_Click()
'
Dim DL As Integer
Dim List_Nombre As Integer
Dim ligne As Integer

    List_Nombre = Me.LibOrder.ListCount - 1
    If List_Nombre < 0 Then Exit Sub    ' Contrôle quei la liste n'est pas vide

    If MsgBox("Do you want to register this transaction ?", vbYesNo) = vbNo Then Exit Sub

    For ligne = 0 To List_Nombre

        ' Ajouter une nouvelle ligne dans notre tableau
'        Sheets(5).ListObjects(1).ListRows.Add
        [t_Booking].ListObject.ListRows.Add

        ' Chercher le numéro de la prochaine ligne libre dans notre tableau
'        DL = Sheets(5).Range("B" & Rows.Count).End(xlUp).Row
        DL = [t_Booking].Rows.Count

        ' Ajouter les informations dans la base de données
'        Sheets(5).Range("B" & DL) = Me.LblInfo1
        Range("t_Booking[Type]")(DL).Value = Me.LblInfo1
'        Sheets(5).Range("C" & DL) = Me.TxtBill
        Range("t_Booking[Nr bill]")(DL).Value = Me.TxtBill
'        Sheets(5).Range("D" & DL) = Me.CboNrOrder
        Range("t_Booking[Order number]")(DL).Value = Me.CboNrOrder

        ' Contrôle si c'est un fournisseur ou un client
'        If Me.LblInfo1 = "Customer:" Then
'            Sheets(5).Range("E" & DL) = Me.CboType
'        Else
'            Sheets(5).Range("F" & DL) = Me.CboType
'        End If
        Range("t_Booking[Customer]")(DL).Offset(0, -Me.OptionOUT.Value).Value = Me.CboType

        ' Ajouter les données de la zone de liste
'        Sheets(5).Range("G" & DL) = Me.LibOrder.List(ligne, 0)
        Range("t_Booking[Nr article]")(DL).Value = Me.LibOrder.List(ligne, 0)
'        Sheets(5).Range("H" & DL) = CInt(Me.LibOrder.List(ligne, 1))
        Range("t_Booking[Quantity]")(DL).Value = Me.LibOrder.List(ligne, 0)

    Next ligne

    MsgBox "BOOKING IS DONE"
    Unload Me
    ThisWorkbook.Save

End Sub

@TooFatBoy

Votre fichier joind est vide
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 340
Membres
103 192
dernier inscrit
Corpdacier