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

147exceldalod.xlsm (61.24 Ko)

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 ListView

2. 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 Sub

3. 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 Sub

4. 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 Sub

5. 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 Sub

Edit : 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 Sub

Dites 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 integer

2. 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 Sub

3. 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 Sub

Il 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 = False

Comment 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 Byte
Private 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 Sub

2) 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 Worksheet
Private 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
Rechercher des sujets similaires à "afficher donnees listview fonction valeur portee combo"