Microsoft 365 ListBox / ListView et combobox avec choix de colonnes

RaVenSs

XLDnaute Nouveau
Bonjour,

Je me permet de venir soliciter votre aide pour résoudre un problème sur lequel je bloque depuis quelques jours.
Je suis en train de préparer quelques feuilles automatiser avec du vba pour ma société mais étant débutant je galère pas mal.

Mon problème actuel:
J'ai une liste de devis dont certains ont comme caractéristique un numéro de chantier dans la colonne 24.

Je souhaiterai faire un userform pour un bouton recherche devis liés à un chantier: en gros, j'aurai une combobox2 qui irait chercher les numéros de chantier (sachant qu'il y aura plusieurs devis par chantier) et à partir du choix de la combobox2, la liste des devis ayant cette caractéristique devrait sortir dans la listbox1 sachant que celle-ci doit afficher seulement quelques colonnes de mon tableau ListeDevis1.

voici le code actuel :

Option Compare Text
Dim f, Rng, ColVisu(), TBlBD()
Private Sub UserForm_Initialize()

Set f = Sheets("ListeDesDevis") ' Adapter
nomTableau = "ListeDevis1"
TBlBD = Range(nomTableau).Value
Set Rng = f.Range("A2:G" & f.[A65000].End(xlUp).Row) ' Adapter
ColVisu = Array(1, 2, 4, 6) ' Adapter
LargeurCol = Array(60, 50, 50, 100) ' Adapter
Me.ListBox1.ColumnCount = UBound(ColVisu) + 1
Me.ListBox1.ColumnWidths = Join(LargeurCol, ";")
Me.ListBox1.List = Application.Index(Rng, Evaluate("Row(1:" & Rng.Rows.Count & ")"), ColVisu)


'--- ComboBox
Set d = CreateObject("scripting.dictionary")
d("*") = ""
For i = 1 To UBound(TBlBD): d(TBlBD(i, 26)) = "": Next i
Me.ComboBox2.List = d.keys



End Sub


Private Sub ComboBox2_click()
ColRecherche = 26
clé = Me.ComboBox2: n = 0
Dim Tbl()
For i = 1 To UBound(TBlBD)
If TBlBD(i, ColRecherche) Like clé Then
n = n + 1: ReDim Preserve Tbl(1 To UBound(TBlBD, 2), 1 To n)
For k = 1 To UBound(TBlBD, 2): Tbl(k, n) = TBlBD(i, k): Next k
End If
Next i
If n > 0 Then Me.ListBox1.Column = Tbl Else Me.ListBox1.Clear
End Sub

Celui-ci ne fonctionne pas quand j'utilise la combobox :/
Pourriez vous m'aiguiller ?
Merci d'avance,
 

RaVenSs

XLDnaute Nouveau
Le voici, je m'excuse d'ores et déjà de l'amateurisme du fichier/code.
Je pars de 0 et j'ai essayé en grattant des exemples par ci par là de réaliser ce fichier.
Je viens d'acheter un livre pour reprendre les bases du vba.

j'ai vu que pour la gestion des listes devis/clients/chantiers, je pourrai envisager une utilisation d'une base de donnée Access. Une prochaine étape ?
 

Pièces jointes

  • DEVIS Liste 22 + - Forum.xlsm
    377.5 KB · Affichages: 4

vgendron

XLDnaute Barbatruc
essaie avec ce code
apparemment, tu te trompais de colonne: 26 au lieu de 24
et tu remplissais ton tableau avec TOUTES les colonnes, mais ta listbox ne possède que 4 colonnes

VB:
Option Compare Text
Dim f, Rng, ColVisu(), TBlBD()
Private Sub UserForm_Initialize()
Me.ComboBox2.Clear
Me.ListBox1.Clear
Set f = Sheets("ListeDesDevis")                          ' Adapter
nomTableau = "ListeDevis1"
TBlBD = Range(nomTableau).Value
Set Rng = f.Range("A2:G" & f.Range("A" & Rows.Count).End(xlUp).Row) ' Adapter
ColVisu = Array(1, 2, 4, 6)                 ' Adapter
LargeurCol = Array(150, 150, 150, 100) ' Adapter

Me.ListBox1.ColumnCount = UBound(ColVisu) + 1
Me.ListBox1.ColumnWidths = Join(LargeurCol, ";")
Me.ListBox1.List = Application.Index(Rng, Evaluate("Row(2:" & Rng.Rows.Count & ")"), ColVisu)
 
    '--- ComboBox
Set d = CreateObject("scripting.dictionary")

'd("*") = ""
For i = 2 To UBound(TBlBD, 1)
    If Not d.exists(TBlBD(i, 24)) Then
        d.Add TBlBD(i, 24), ""
    End If
Next i
Me.ComboBox2.List = d.keys


End Sub


Private Sub ComboBox2_click()
Me.ListBox1.Clear
ColRecherche = 24
clé = Me.ComboBox2: n = 0
Dim Tbl()
For i = 1 To UBound(TBlBD)
    If TBlBD(i, ColRecherche) Like clé Then
        Me.ListBox1.AddItem TBlBD(i, 1)
        Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TBlBD(i, 2)
        Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TBlBD(i, 4)
        Me.ListBox1.List(ListBox1.ListCount - 1, 3) = TBlBD(i, 6)
    End If
Next i
End Sub
 

RaVenSs

XLDnaute Nouveau
oh parfait, cela à l'air de fonctionner! je ne savais pas la tournure pour la combobox, je vous en remercie.

pouvez vous m'expliquer pourquoi mettre ces deux lignes en début ? est ce une sorte de reset au cas ou ?
Me.ComboBox2.Clear
Me.ListBox1.Clear

Je vais essayer de mettre le format monétaire et les tailles de colonne.s
 

vgendron

XLDnaute Barbatruc
oui ,c'est pour vider les controls,
je ne comprenais pas pourquoi à l'intialisation, le listbox avait déjà des infos alors qu'on a pas encore sélectionné de numéro de chantier dans le combo
du coup, j'ai mis ces .clear.. qui ne changeaient rien
la ligne en cause est celle ci
VB:
Me.ListBox1.List = Application.Index(Rng, Evaluate("Row(2:" & Rng.Rows.Count & ")"), ColVisu)
il vaut mieux la supprimer
 

RaVenSs

XLDnaute Nouveau
C'est noté pour la suppression de la ligne et les explications. je vous en remercie.

Quand je regarde un peu, apparemment avec listview, il est possible de mettre une mise en forme de couleurs selon une donnée (accepté/refusé/en attente par exemple). Avec ListBox est-ce possible ?

Si non, puis-je adapter ce code pour une listview, où n'est ce pas possible ? je ne comprend pas trop la différence entre ceux deux éléments.
 

RaVenSs

XLDnaute Nouveau
Merci, il y a t'il des limites avec listview contrairement à listbox ? si non, il est plus intéressant d'utiliser listview ?
je vais essayer de "traduire"en listview comme entrainement ce soir. Puis je vous embêter ici si jamais je coince ?
 

vgendron

XLDnaute Barbatruc
quelque chose qui m'a beaucoup embete lorsque j'ai utilisé les controls ListView, TreeView et Flex dans mon ancien boulot. c'est que ces controls sont apparus avec Common Controls Visual Basic 6.0 qui n'était pas présent sur tous les PC..
sinon.. je vois pas trop. mais comme tout, il y a une limitation lorsqu'on tombe dessus :-D
n'hésite pas à poster ici tes questions==> ca peut toujours servir à un maximum de gens, et il y a toujours des gens plus compétants pour y répondre.
 

RaVenSs

XLDnaute Nouveau
Rebonjour,

je commence à déclarer ma listview1. Je suis parti à partir d'exemples.
Mais il m'indique qu'il manque un objet, à priori au niveau de la dernière ligne

'**************************************************************************
'PROCEDURE PERMETTANT D'INITIALISER LA LISTVIEW AU DEMARRAGE DU FORMULAIRE
'**************************************************************************
Private Sub Userform_Initialize()

With ListView1
.Gridlines = True 'Affiche ou pas les lignes
.View = lvwReport 'Style de rapport
.FullRowSelect = True 'Permet de sélectionner une ligne dans la liste
'Creation des en-têtes personnalisées avec leur largeur
.ColumnHeaders.Add Text:="N°", Width:=25
.ColumnHeaders.Add Text:="Ind°", Width:=30
.ColumnHeaders.Add Text:="Dénomination", Width:=400
.ColumnHeaders.Add Text:="Montant H.T.", Width:=100, Alignment:=fmAlignmmentRIght
.ColumnHeaders.Add Text:="Date", Width:=60
.ColumnHeaders.Add Text:="Statut", Width:=60

End With

Call Actualisation 'on appel la procédure qui actualise la ListView

End Sub


'**************************************************************************
'PROCEDURE PERMETTANT d'actualiser les données de la listview
'de mettre de la mise en forme conditionnelle sur des enregistrements
'**************************************************************************

Private Sub Actualisation()

'Décalaration des variables
Dim Item As ListItem
Dim DerniereLigne As Integer
Dim i As Integer
Dim Couleur As Variant
Dim MonCritere As Variant

ListView1.ListItems.Clear 'on vide le contenu de la liste à chaque chargement
DerniereLigne = ListeDesDevis.Cells(Rows.Count, 1).End(xlUp).Row 'on cherche la dernière ligne du tableau

'On boucle toutes les lignes et on charge les information dans la listeview
For i = 2 To DerniereLigne

'On définit le critère sur lequel la couleur sera appliqué
MonCritere = ListeDesDevis.Cells(i, 28)

'on test les cas et on applique les couleurs de polices de caractère
Select Case MonCritere

Case Is = "A facturer"
Couleur = &HFF00&
Case Is <> "A facturer"
Couleur = &H80FF&

End Select


'on affiche dans la listView le contenu de la base de données.
Set Item = ListView1.ListItems.Add(Text:=ListeDesDevis.Cells(i, 1))

Item.SubItems(1) = ListeDesDevis.Cells(i, 2)
Item.ListSubItems(1).ForeColor = Couleur
Item.SubItems(2) = ListeDesDevis.Cells(i, 3)
Item.ListSubItems(2).ForeColor = Couleur
Item.SubItems(3) = ListeDesDevis.Cells(i, 5)
Item.ListSubItems(3).ForeColor = Couleur
Item.SubItems(4) = ListeDesDevis.Cells(i, 6)
Item.ListSubItems(4).ForeColor = Couleur
Item.SubItems(5) = ListeDesDevis.Cells(i, 7)
Item.ListSubItems(5).ForeColor = Couleur
Item.SubItems(6) = ListeDesDevis.Cells(i, 28)
Item.ListSubItems(6).ForeColor = Couleur



Next i




End Sub
 

Pièces jointes

  • DEVIS Liste 27 forum.xlsm
    377.4 KB · Affichages: 3

RaVenSs

XLDnaute Nouveau
j'ai indiqué les commentaires afin de me souvenir pour une prochaine listview :)

Dans l'exemple, la ligne se met en rouge si le montant est supérieur à 1000 euros. Moi j'aimerai que la ligne se mette en rouge si le statut du devis est "à facturer", je ne sais pas si j'ai bien mis le critère.
 

vgendron

XLDnaute Barbatruc
en retour ton fichier corrigé

1) ListeDesDevis n'était pas déclaré==> j'ai ajouté une variable publique qui est définie (Set ...) dans l'initialize
2) tu as déclaré 6 entetes==>6 colonnes mais tu essaies d'en remplir 7..
3) pour voir quelque chose dans la listview, il faut au moins avoir quelques datas dans la feuille
 

Pièces jointes

  • DEVIS Liste 27 forum.xlsm
    376.8 KB · Affichages: 4

Membres actuellement en ligne

Statistiques des forums

Discussions
298 901
Messages
1 972 612
Membres
203 781
dernier inscrit
makam