Afficher données dans la ListView en fonction de valeur portée sur la Combo
Bonjour à tous les membres du forum
Je sollicite un coup de main pour me sortir d’une difficulté de taille (pour mon niveau) que j’ai rencontré avec ma ListView et les données qui doivent apparaitre sur cette ListView en fonction du choix porté dans ma ComboBox.
Mon classeur contient deux feuilles, nommées ‘’BASE DE DONNEE’’ et ‘’BASE DE DONNEE1’’
Chaque BASE DE DONNEE comporte trois tableaux.
En fonction de la base de données choisie dans ma ComboBox, Je souhaite afficher les données de chaque tableau dans une ListView sur un UserForm contenant un multipages (3 pages).
Sur la page1, il y a mon combobox1 et la listView1
Sur la page2, il Y a mon combobox2 et la listView2
Sur la page3, il Y a mon ComboBox » et la listView3
A l’initialisation du UserForm, lorsque je choisis une base de données dans ma ComboBox, que les données du tableau1 s’affichent dans la ListView1, les données du tableau2 s’affiche dans la ListView2, les données du tableau3 s’affichent dans la listview3.
J’ai un code qui me permet d’afficher les données sur mes ListView, mais il ne charge pas les données en fonction de la base de données portée sur ma ComboBox. Et c’est ce problème que je n’arrive pas résoudre. Voir ficher joint avec le code.
(le code est long et s’il est possible de le réécrire autrement, je serai ravi de la proposition)
Merci bien
Bonjour,
Je n'ai pas compris pourquoi vous utilisez des Function à tous les codes et les appeler par un CALL. La fonction s'appelle seule?
voici les changements à effectuer, allez dans l'USF
1. En entête de l'USF (donc à la toute première ligne, important !), mettez ceci
Dim NomTS As String
Dim TS As ListObject
Dim ltview As ListView2. Remplacez le code Initialize par celui ci-dessous
Private Sub UserForm_Initialize()
Dim BD()
BD = Array("BASE DE DONNEE", "BASE DE DONNEE1")
ComboBox1.List = BD
ComboBox2.List = BD
ComboBox3.List = BD
End Sub3. Combobox --> Ajoutez les 3 codes ci-dessous
Private Sub ComboBox1_Change()
Select Case ComboBox1.Value
Case Is = "BASE DE DONNEE": NomTS = "Tableau3"
Case Is = "BASE DE DONNEE1": NomTS = "Tableau6"
End Select
Set TS = ThisWorkbook.Sheets(ComboBox1.Value).ListObjects(NomTS)
Set ltview = ListView3
Call AFFICHER_les_données_du_magasin
End Sub
Private Sub ComboBox2_Change()
Select Case ComboBox2.Value
Case Is = "BASE DE DONNEE": NomTS = "Tableau2"
Case Is = "BASE DE DONNEE1": NomTS = "Tableau5"
End Select
Set TS = ThisWorkbook.Sheets(ComboBox2.Value).ListObjects(NomTS)
Set ltview = ListView2
Call AFFICHER_les_données_du_magasin
End Sub
Private Sub ComboBox3_Change()
Select Case ComboBox3.Value
Case Is = "BASE DE DONNEE": NomTS = "Tableau1"
Case Is = "BASE DE DONNEE1": NomTS = "Tableau4"
End Select
Set TS = ThisWorkbook.Sheets(ComboBox3.Value).ListObjects(NomTS)
Set ltview = ListView1
Call AFFICHER_les_données_du_magasin
End Sub4. Ajoutez ce code pour remplir la listview selon la combo choisie
Private Sub AFFICHER_les_données_du_magasin() 'VOIR LES DONNEES SUR listview
Dim r As Integer, c As Integer
Application.ScreenUpdating = False
With ltview
.ColumnHeaders.Clear
.ListItems.Clear
.View = lvwReport
.CheckBoxes = False
.FullRowSelect = True
.Gridlines = True
For c = 1 To TS.ListColumns.Count
With .ColumnHeaders
.Add , , TS.HeaderRowRange.Columns(c).Value, TS.HeaderRowRange.Columns(c).Width
End With
Next c
For r = 1 To TS.ListRows.Count
ltview.ListItems.Add , , TS.DataBodyRange(r, 1)
For c = 2 To TS.ListColumns.Count
ltview.ListItems(r).SubItems(c - 1) = TS.DataBodyRange.Item(r, c)
Next c
Next r
End With
Application.ScreenUpdating = True
End Sub5. Supprimez tous les autres codes FUNCTION dans l'USF. Vous n'avez besoin que de ce que je vous ai donné ci-dessus
Si ok et terminé -->
Cordialement
Le code il est parfait. Il marche correctement.
J'aurai encore besoin de votre aide si je suis coincé.
merci, et excellente suite à vous. 🙏🙏🙏🙏🙏
Bonjour
Ok. Pour le code proposé il y a encore une petite modification que vous pouvez faire pour vous éviter de mentionner les mots Base de donnees dans les sub Combo Change.
Si intérêt faites ceci :
1. Déplacez l'instruction DIM BD() qui est placée en début de la Private sub initialize et placez-la juste en dessous de DIM ltview as litview
2. Dans chaque Private Sub ComboboxX_Change, remplacez les mots :
- "Base de donnee" par --> BD(0)
- "Base de donnee1" par --> BD(1)
J'aurai encore besoin de votre aide si je suis coincé.
Pas de soucis.
Cordialement
La proposition faite est vraiment pertinente et pratique car elle me permet d'éviter les erreurs de saisie des noms des bases de données qui comportent beaucoup de lettres.
Aussi, j'avais un autre souci: AFFICHER les valeurs de la base de données dans les listbox(1, 2, 3 et 4) en cliquant sur une ligne de la ListView1 et pourvoir les modifier en même temps.
Pour afficher les valeurs de la ListView sur dans les listbox, j'ai écris ce code qui marche.
Private sub ListView1_click() textbox1.value = ListView1.selectedItem.ListSubItems(1) textbox2.value = ListView1.selectedItem.ListSubItems(2)Le problème c'est que je n'arrive pas à écrire le code qui me permet de modifier les données à partir des listbox et les enregistrer directement sur la base de données
Aussi, j'avais un autre souci: AFFICHER les valeurs de la base de données dans les listbox(1, 2, 3 et 4) en cliquant sur une ligne de la ListView1 et pourvoir les modifier en même temps.
Quelles listbox ? Je n'en vois aucune. vous parlez des 4 textbox au dessus de la listview ?
la modification, vous voulez passer par un bouton "Modifier" je suppose ou pas ?
Bonsoir,
Oui oui, il s'agit des 4 texbox au dessus de la ListView.
Je voudrais passer par un bouton modifier
Je voudrais passer par un bouton modifier
Ok mais sachez que l'on peut aussi le faire dès que vous modifiez une valeur des textbox. Intéressé ou vous voulez conserver tout de même le bouton
Vous pouvez déjà remplacer le code pour charger les 4 textbox par celui-ci
Private Sub ListView1_click()
Dim i As Byte
With Me
For i = 1 To 4
.Controls("TextBox" & i).Value = ltview.SelectedItem.ListSubItems(i)
Next i
End With
End SubEdit : au fait je vois quelque chose. Est-ce que les texbox 3 et 4 ne devraient pas contenir les valeurs H1 et H2 ?
j'ignorais que l'on pouvait le faire directement sans passer par un bouton.
et je pense qu'il sera la meilleure option pour moi.
Les texbox 3 et 4 doivent avoir les valeurs H1 et H2. C'est exactement l'objectif visé
1. Les texbox 3 et 4 doivent avoir les valeurs H1 et H2. C'est exactement l'objectif visé
Alors le code que je vous ai donné dans mon post précédent doit être comme ceci :
Private Sub ListView1_click()
Dim i As Byte, j As Byte
With Me
For i = 1 To 4
Select Case i
Case 1, 2: j = i
Case 3, 4: j = i + 2
End Select
.Controls("TextBox" & i).Value = ltview.SelectedItem.ListSubItems(j)
Next i
End With
End SubDites moi si ok
2. j'ignorais que l'on pouvait le faire directement sans passer par un bouton.
Ok je vous prépare cela.
Après avoir adapté le code à mon fichier original, les valeurs de la ListView, FR1, FR2 et H1,H2 s'affichent correctement et respectivement sur les TextBox 1,2,3,4.
Cependant, la modification des données à partir des TextBox ne marche.
Alors que ce que je recherche, c'est de pouvoir modifier les valeurs de la ListView à partir des listbox et les enregistrer directement (au lieu que j'aille le faire dans la base de données).
Cependant, la modification des données à partir des TextBox ne marche.
Oui normal. Je vous ai écrit que je vous préparais ce point.
Alors que ce que je recherche, c'est de pouvoir modifier les valeurs de la ListView à partir des listbox et les enregistrer directement (au lieu que j'aille le faire dans la base de données).
Heu... 2ieme fois que vous me parlez de listbox. Je ne vois pas de listbox dans votre USF. Avant que je vous donne les infos sur le point précédent, expliquez-moi
hoooh!!. Je veux dire TextBox.
justement, il n'y a pas de listbox sur mon UF.
C'est une erreur de ma part.
Voici quelques ajouts et modifications à effectuer :
1. Ajoutez l'instruction ci-dessous juste en dessous de DIM ltview as litview
Dim lig as integer2. Listview Click : Remplacez le code que je vous ai donné avant par celui-ci
Private Sub ListView1_click()
Dim i As Byte, j As Byte
With Me
For i = 1 To 4
Select Case i
Case 1, 2: j = i
Case 3, 4: j = i + 2
End Select
.Controls("TextBox" & i).Value = ltview.SelectedItem.ListSubItems(j)
Next i
End With
lig = ltview.SelectedItem.Index
End Sub3. Recopiez le code Listview1_click pour chacune des listview 2 et 3
- changez le chiffre 1 en 2 et en 3
- modifiez la valeur i dans cette ligne
.Controls("TextBox" & i).Value = ltview.SelectedItem.ListSubItems(j)Pour la listview2, mettre i + 4
Pour la listview3, mettre i + 8
4. Textbox :
- Ajoutez ce code pour la textbox
Private Sub TextBox1_AfterUpdate()
Call maj
Call AFFICHER_les_données_du_magasin
End Sub- pour toutes les autres textbox (donc 2 jusque 12) dupliquez ce code en remplaçant le 1 par le chiffre de la textbox concernée. Au total vous aurez 12 codes textboxX_change
3. Mise à jour des tableaux structurés et des listview après modification de Textbox : Ajoutez le code ci-dessous dans l'USF
Private Sub maj()
Dim i As Byte, j As Byte
Select Case MultiPage1.Value
Case Is = 0: j = 0
Case Is = 1: j = 4
Case Is = 2: j = 8
End Select
For i = 1 To 2
With Sheets(BD)
TS.DataBodyRange.Item(lig, i + 1) = Me.Controls("TextBox" & j + i).Value
End With
Next i
For i = 3 To 4
With Sheets(BD)
TS.DataBodyRange.Item(lig, i + 3) = Me.Controls("TextBox" & j + i).Value
End With
Next i
End SubIl vous reste à tester...
NB : A votre place je supprimerais aussi l'accent que vous avez mis dans le mot "données" du code "AFFICHER....."
EDIT : dans le code AFFICHER_les_données.... à la fin du code rajoutez cette ligne juste avant l'instruction Applicaiton.screenupdating =True
ltview.ListItems(1).Selected = FalseComment bien vous remercier. 🙏🙏🙏 Le code, il est parfait et il fonctionne comme je le souhaite. Pour vous, c'est Cinq étoiles ⭐⭐⭐⭐⭐.
Hello, Bonjour
je reviens vers vous avec un( NOUVEAU) soucis toujours en rapport avec:
1) choisir base de données et récupérer les donnés données afin d'en faire un bulletin sur la feuille nommée "belletin"
Pour celà, j'ai essayé d'adapter un de vos codes ci dessus, mais on met dit" erreurs d'exécution 424, objet requis"
Dim NomTS As String
Dim TS As ListObject
Dim lig As Integer
Dim BD()
Dim i As Integer, j As BytePrivate Sub UserForm_Initialize()
BD = Array("BASE DE DONNEE", "BASE DE DONNEE1")
ComboBox1.List = BD
ComboBox2.List = BD
Call ComboBox1_Change
End Sub
Private Sub ComboBox1_Change()
Application.ScreenUpdating = False
Set TS = ThisWorkbook.Sheets(ComboBox.Value)
With Sheets("bulletin")
For i = 4 To Sheets(ComboBox.Value).Range("B" & Rows.Count).End(xlUp).Row
.Range("C2") = Sheets(ComboBox.Value).Range("B" & i)
.Range("B4") = Sheets(ComboBox.Value).Range("C" & i)
.Range("C4") = Sheets(ComboBox.Value).Range("D" & i)
.Range("D4") = Sheets(ComboBox.Value).Range("E" & i)
.Range("E4") = Sheets(ComboBox.Value).Range("F" & i)
.Range("B5") = Sheets(ComboBox.Value).Range("G" & i)
.Range("C5") = Sheets(ComboBox.Value).Range("H" & i)
.Range("D5") = Sheets(ComboBox.Value).Range("I" & i)
.Range("E5") = Sheets(ComboBox.Value).Range("J" & i)
.Range("B6") = Sheets(ComboBox.Value).Range("K" & i)
.Range("C6") = Sheets(ComboBox.Value).Range("L" & i)
.Range("D6") = Sheets(ComboBox.Value).Range("M" & i)
.Range("E6") = Sheets(ComboBox.Value).Range("N" & i)
.Range("C7") = Sheets(ComboBox.Value).Range("O" & i)
.Range("E7") = Sheets(ComboBox.Value).Range("P" & i)
.PrintOut
Next i
End With
End Sub2) choisir base de données et copie une partie de de données afin d'en faire une liste sur la feuille nommée "liste"
ici aussi on met dit: "erreurs d'exécution 424, objet requis"
voici le code adapté
Dim lig As Integer
Dim BD()
Dim i As Integer
Dim OD As Worksheet
Dim CO As WorksheetPrivate Sub UserForm_Initialize()
BD = Array("BASE DE DONNEE", "BASE DE DONNEE1")
ComboBox1.List = BD
ComboBox2.List = BD
Call ComboBox1_Change
End Sub
Private Sub ComboBox1_Change()
Application.ScreenUpdating = False
Set OD = ThisWorkbook.Sheets(ComboBox.Value)
Set CO = Worksheets("Liste")
CO.Range("A1").CurrentRegion.Clear
OD.Range("B4:B10").Copy CO.Range("A1")
OD.Activate
OD.Range("A1").Select
End Sub