Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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
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
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
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
1°
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é)
2°
tu met toute l’exécution du code dans 2 condition ?
ce qui oblige vba a lire la fonction complete pendant l'execution
le listcount>=0
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
1°
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é)
2°
tu met toute l’exécution du code dans 2 condition ?
ce qui oblige vba a lire la fonction complete pendant l'execution
le listcount>=0
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
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