XL 2016 Hepl Excel VBA

Acher12

XLDnaute Nouveau
Bonjour,
j'ai une base de données sous forme de chapitre A, B,.. et des sous chapitres A.1,A.2,B.3,... et des résultats.
je souhaite créer un formulaire de recherche mais un peu compliqué à mon niveau! pour mieux explique c'est comme le principe des filtres, qui affiche le résultats à chaque fois je sélectionne un élément.
je vous joins mon petit tableau avec toute information.
 

Pièces jointes

  • Test.xls
    2.9 MB · Affichages: 38

Dranreb

XLDnaute Barbatruc
J'ai un outils qui fait ça très bien avec des ComboBox liées, si ça vous intéresse.
Vous n'auriez pas à vous occuper du tout des ComboBox, sauf dans l'UserForm_Initialize pour en confier la charge à cet objet spécialisé.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Mais y a-t-il des TextBox qui se sont ajoutées pour avoir quelque chose à modifier ?
En tout cas, il serait bon de déclarer au début :
VB:
Private LCou As Long, VLgn()
Ça permettrait des procédures de ce style :
VB:
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 0 Then ListBox1.Clear
LCou = 0: ReDim VLgn(1 To 1, 1 To 6)
End Sub
VB:
Private Sub ListBox1_Click()
LCou = ListBox1.Column(0, ListBox1.ListIndex)
VLgn = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis VLgn
End Sub

Private Sub CBnValider_Click()
If LCou = 0 Then
   CL.ValeursVers VLgn
   CL.Lignes.Add.Range.Value = VLgn
   CL.Actualiser
Else
   CL.Lignes(LCou).Range.Value = VLgn
   End If
End Sub

Private Sub CBnSupprimer_Click()
CL.Lignes(LCou).Delete
CL.Actualiser
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je ne prévois en général qu'un seul bouton pour valider, dont je mets le Caption à "Modifier" ou "Ajouter" selon que LCou<>0 ou pas.
Je recommande très vivement de ne jamais utiliser d'autre expression Range pour taper dans le tableau que CL.PlgTablo !!!
Éventuellement CL.Lignes(…).Range pour bénéficier des fonctionnalités du tableau Excel
Et transiter via VLgn au lieu de renseigner les cellules une par une.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça donne :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées
Private LCou  As Long, VLgn()

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage [Tableau1]
CL.Add ComboBox1, "Chapitre"
CL.Add ComboBox2, "Classe A"
CL.Add ComboBox3, "Classe B"
CL.Add ComboBox4, "Classe c"
CL.Actualiser
End Sub

Private Sub CBnEffacer_Click()
CL.Nettoyer
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 0 Then ListBox1.Clear
LCou = 0: ReDim VLgn(1 To 1, 1 To 6)
CBnValider.Caption = "Ajouter"
GarnirTBx
End Sub

Private Sub CL_Résultat(Lignes() As Long)
Dim TBD(), LBD As Long, TLB(), LLB As Long, C As Long
TBD = CL.PlgTablo.Value
ReDim TLB(0 To UBound(Lignes) - 1, 0 To 9)
For LLB = 0 To UBound(TLB)
   LBD = Lignes(LLB + 1)
   TLB(LLB, 1) = LBD
   For C = 0 To 9: TLB(LLB, C) = TBD(LBD, C + 5): Next C, LLB
ListBox1.List = TLB
End Sub

Private Sub ListBox1_Click()
LCou = ListBox1.Column(0, ListBox1.ListIndex)
VLgn = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis VLgn
CBnValider.Caption = "Modifier"
GarnirTBx
End Sub

Private Sub GarnirTBx()
Dim C As Long
For C = 5 To CL.PlgTablo.Columns.Count
   Me("TextBox" & C - 2).Text = VLgn(1, C): Next C
End Sub

Private Sub CBnValider_Click()
For C = 5 To CL.PlgTablo.Columns.Count
   VLgn(1, C) = Me("TextBox" & C - 2).Text: Next C
If LCou = 0 Then
   CL.ValeursVers VLgn
   CL.Lignes.Add.Range.Value = VLgn
   CL.Actualiser
Else
   CL.Lignes(LCou).Range.Value = VLgn
   End If
End Sub

Private Sub CBnQuitter_Click()
Unload Me
End Sub
À tester après avoir mis des noms corrects aux CommandButton
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui, la CL_Résultat n'était pas bonne non plus. À moins d'utiliser un tableau auxiliaire TLgn() As Long, il faut impérativement noter le numéro de ligne dans la ListBox. Et le mieux c'est dans sa colonne 0. Comme ça les autres numéros de colonnes peuvent être les mêmes que dans le tableau Excel (enfin pas dans ce cas, mauvais exemple, puisqu'on saute les 4 qui vont dans les ComboBox). Il est toujours possible de ne pas l'afficher en mettant un ColumnWidths commençant par "0 pt;"
VB:
Private Sub CL_Résultat(Lignes() As Long)
Dim TBD(), LBD As Long, TLB(), LLB As Long, C As Long
TBD = CL.PlgTablo.Value
ReDim TLB(0 To UBound(Lignes) - 1, 0 To 9)
For LLB = 0 To UBound(TLB)
   LBD = Lignes(LLB + 1)
   TLB(LLB, 0) = LBD
   For C = 1 To 9: TLB(LLB, C) = TBD(LBD, C + 4): Next C, LLB
ListBox1.List = TLB
End Sub
 
Dernière édition:

Discussions similaires