XL 2016 Hepl Excel VBA

  • Initiateur de la discussion Initiateur de la discussion Acher12
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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é.
 
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:
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:
Ç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:
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:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
400
Réponses
4
Affichages
319
Retour