ListView/Treeview

Accueil

Listview avec photo
Menu cascade ComboBox ListView
Choix photo dans Listview
ListView simulation
Simulation ListBox couleur
Treeview Nomenclature
TreeView Hiérarchique

ListView avec tri

Cliquer sur la colonne pour trier.

ListViewTri

Private Sub UserForm_Initialize()
  With Me.ListView1
    With .ColumnHeaders
      .Clear
      .Add , , "Nom", 50
      .Add , , "Ville", 70
      .Add , , "Salaire", 40, lvwColumnRight
      .Add , , "Date", 70
    End With
   .Gridlines = True
   .View = lvwReport
   tblBD = Range("A2:D" & [A65000].End(xlUp).Row).Value
   ligne = 0
   For i = 1 To UBound(tblBD)
     ligne = ligne + 1
    .ListItems.Add , , tblBD(i, 1)
    .ListItems(ligne).ListSubItems.Add , , tblBD(i, 2)
    .ListItems(ligne).ListSubItems.Add , , Format(tblBD(i, 3), "0 €")
    .ListItems(ligne).ListSubItems.Add , , tblBD(i, 4)
  Next i
 End With
End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
Select Case ColumnHeader.Index
  Case 1 To 3
    ListView1.SortKey = ColumnHeader.Index - 1
    ListView1.SortOrder = lvwAscending
    ListView1.Sorted = True
  Case 4       'Dates
    c = ColumnHeader.Index - 1
    For i = 1 To ListView1.ListItems.Count
      ListView1.ListItems(i).ListSubItems(c).Text = CLng(CDate(ListView1.ListItems(i).ListSubItems(c)))
    Next i
    ListView1.SortKey = c
    ListView1.SortOrder = lvwAsccending
    ListView1.Sorted = True
    For i = 1 To ListView1.ListItems.Count
      ListView1.ListItems(i).ListSubItems(c).Text = _
        Format(CDate(ListView1.ListItems(i).ListSubItems(c)), "dd/mm/yyyy")
    Next i
  End Select
End Sub

Private Sub ListView1_DblClick()      ' Gras et coloriage
  ListView1.SelectedItem.Bold = Not ListView1.SelectedItem.Bold
  ListView1.SelectedItem.ForeColor = _
     IIf(ListView1.SelectedItem.ForeColor = vbRed, vbBlack, vbRed)
  For Each c In ListView1.SelectedItem.ListSubItems
    c.Bold = Not c.Bold
  Next
  ListView1.Refresh
End Sub

Private Sub B_fin_Click()
  Unload Me
End Sub

Private Sub ListView1_Click()
 temp = ListView1.SelectedItem
End Sub

Tri pour numérique avec nombres négatifs

c = ColumnHeader.Index - 1
For i = 1 To ListView1.ListItems.Count
   ListView1.ListItems(i).ListSubItems(c).Text = _
      Format(Val(ListView1.ListItems(i).ListSubItems(c).Text) + 1000000, "0000000")
Next i
ListView1.SortKey = c
ListView1.SortOrder = lvwAsccending
ListView1.Sorted = True
For i = 1 To ListView1.ListItems.Count
    ListView1.ListItems(i).ListSubItems(c).Text = CDbl(ListView1.ListItems(i).ListSubItems(c)) - 1000000
Next i

Récupération des titres et des items

Private Sub B_recup_Click()
  NbCol = Me.ListView1.ColumnHeaders.Count
  Dim Tbl(): ReDim Tbl(1 To NbCol)
  For c = 1 To NbCol
     Tbl(c) = Me.ListView1.ColumnHeaders(c)
  Next c
  [O1].Resize(, NbCol) = Tbl
  '--- items
  NbCol = Me.ListView1.ColumnHeaders.Count
  NbLig = Me.ListView1.ListItems.Count
  Dim TblItems(): ReDim TblItems(1 To NbLig, 1 To NbCol)
  For ligne = 1 To NbLig
     TblItems(ligne, 1) = ListView1.ListItems(ligne)
     For colonne = 1 To Me.ListView1.ColumnHeaders.Count - 1
        TblItems(ligne, colonne + 1) = ListView1.ListItems(ligne).ListSubItems(colonne)
     Next colonne
  Next ligne
  [O2].Resize(NbLig, NbCol) = TblItems
End Sub

Menus en cascade ComboBox/ListView

CascadeComboListView
Recherche intuitive ListView
Filtre Combo ListView Modif Ajout Sup
CascadeComboListView2
CascadeComboListView3
Cascade Combo ListView Choix Colonnes

Dim Tbl(), f
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Set d = CreateObject("Scripting.Dictionary")
  Tbl = f.Range("A3:P" & f.[A65000].End(xlUp).Row).Value
  For i = LBound(Tbl) To UBound(Tbl)
    If Tbl(i, 4) <> "" Then d(Tbl(i, 4)) = ""
  Next i
  temp = d.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.ComboBox1.List = temp
End Sub

Private Sub ComboBox1_Click()
  With Me.ListView1
    With .ColumnHeaders
     .Clear
     For k = 1 To 16
      .Add , , f.Cells(2, k), 55
     Next k
   End With
   ligne = 1
   .Gridlines = True
   .View = lvwReport
   .ListItems.Clear
   For lig = 1 To UBound(Tbl)
     If Tbl(lig, 4) = Me.ComboBox1 Then
       .ListItems.Add , , Tbl(lig, 1)
       For k = 2 To 16
         .ListItems(ligne).ListSubItems.Add , , Tbl(lig, k)
       Next k
       ligne = ligne + 1
     End If
   Next lig
  Me.TextBox1 = .ListItems.Count
 End With
End Sub

Recherche intuitive multi-colonnes multi-mots

Recherche intuitive multi-colonnes multi-mots
Recherche intuitive multi-colonnes multi-mots 2

Listview avec photo

ListViewPhoto

Private Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Me.ImageList1.ImageHeight = 60
  Me.ImageList1.ImageWidth = 60 / 1.2
  répertoirePhoto = ThisWorkbook.Path & "\" ' Adapter
  With Me.ListView1
  With .ColumnHeaders
   .Clear
   .Add , , "Nom", 80
   .Add , , "Ville", 70
   .Add , , "Salaire", 40, lvwColumnRight
   .Add , , "Date", 70
  End With
  ligne = 1
  .Gridlines = True
  .View = lvwReport
  For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
    .ListItems.Add , , c
    If Dir(répertoirePhoto & c & ".jpg") <> "" Then
       Me.ImageList1.ListImages.Add , "Img" & ligne, LoadPicture(répertoirePhoto & c & ".jpg")
       Set Me.ListView1.SmallIcons = Me.ImageList1
       Me.ListView1.ListItems(ligne).SmallIcon = "Img" & ligne
    End If
    .ListItems(ligne).ListSubItems.Add , , c.Offset(, 1)
    temp = c.Offset(, 2)
    .ListItems(ligne).ListSubItems.Add , , String(5 - Len(temp), " ") & temp & " €"
    .ListItems(ligne).ListSubItems.Add , , c.Offset(, 3)
     ligne = ligne + 1
   Next c
  End With
End Sub

Choix de photos externes dans un listview

Choix Photo ListstView

Private Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Me.ImageList1.ImageHeight = 60
  Me.ImageList1.ImageWidth = 60 / 1.2
  répertoirePhoto = ThisWorkbook.Path & "\" ' adapter
  With Me.ListView1
    With .ColumnHeaders
      .Clear
      .Add , , "Nom", 80
    End With
    ligne = 1
    .Gridlines = True
    .View = lvwReport
    For Each c In f.Range("A2:A" & f.[a65000].End(xlUp).Row)
      .ListItems.Add , , c
      If Dir(répertoirePhoto & c & ".jpg") <> "" Then
        Me.ImageList1.ListImages.Add , "Img" & ligne, LoadPicture(répertoirePhoto & c & ".jpg")
        Set Me.ListView1.SmallIcons = Me.ImageList1
        Me.ListView1.ListItems(ligne).SmallIcon = "Img" & ligne
      End If
      ligne = ligne + 1
    Next c
  End With
End Sub

Private Sub ListView1_Click()
   nom = Me.ListView1.SelectedItem
   ActiveCell = nom
   For Each s In ActiveSheet.Shapes
     If s.Type = 13 Then
       If s.TopLeftCell.Address = ActiveCell.Offset(0, 1).Address Then s.Delete
     End If
   Next s
   répertoirePhoto = ThisWorkbook.Path & "\"
   Set img = ActiveSheet.Pictures.Insert(répertoirePhoto & nom & ".jpg")
   img.Left = ActiveCell.Offset(, 1).Left + 1
   img.Top = ActiveCell.Offset(, 1).Top + 1
   ech = 0.75
   img.Height = img.Height * ech
   img.Width = img.Width * ech
End Sub

Différentes formes d'un listview

ListstView

Private Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Me.ImageList1.ImageHeight = 60
  Me.ImageList1.ImageWidth = 60 / 1.2
  répertoirePhoto = ThisWorkbook.Path & "\" ' adapter
  With Me.ListView1
  With .ColumnHeaders
    .Clear
    .Add , , "Nom", 80
    .Add , , "Ville", 70
    .Add , , "Salaire", 40, lvwColumnRight
    .Add , , "Date", 70
   End With
   ligne = 1
   .Gridlines = True
   .View = lvwReport
   For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
     .ListItems.Add , , c
     If Dir(répertoirePhoto & c & ".jpg") <> "" Then
        Me.ImageList1.ListImages.Add , "Img" & ligne, LoadPicture(répertoirePhoto & c & ".jpg")
        Set Me.ListView1.SmallIcons = Me.ImageList1
        Me.ListView1.ListItems(ligne).SmallIcon = "Img" & ligne
        Set Me.ListView1.Icons = Me.ImageList1
        Me.ListView1.ListItems(ligne).Icon = "Img" & ligne
      End If
      .ListItems(ligne).ListSubItems.Add , , c.Offset(, 1)
       temp = c.Offset(, 2)
       .ListItems(ligne).ListSubItems.Add , , String(5 - Len(temp), " ") & temp & " €"
       .ListItems(ligne).ListSubItems.Add , , c.Offset(, 3)
       ligne = ligne + 1
    Next c
  End With
  With Me.ListBox1
   .AddItem "lvwIcon"
   .AddItem "lvwSmallIcon"
   .AddItem "lvwList"
   .AddItem "lvwReport"
  End With
End Sub

Private Sub ListBox1_Click()
    Me.ListView1.View = Me.ListBox1.ListIndex
End Sub

Simulation ListView avec photos

Les photos en commentaire sont exportées en jpg à l'ouverture du classeur.

ListViewSimul

'Pour récupérer le formulaire: clic-droit sur Userform1/exporter
Dim début, n, f
Private Sub UserForm_Initialize()
  'RépertoirePhotos est déclaré public dans un module
  Set f = Sheets("BD")
  début = 1
  n = 3
  nBD = Application.CountA(f.[A:A]) - 1
  If nBD < n Then n = nBD
  Me.ScrollBar1.Min = 1
  Me.ScrollBar1.Max = nBD - n + 1
  affiche
End Sub

Sub affiche()
  For i = 1 To n
    Me("Image" & i).Picture = LoadPicture(répertoirePhotos & f.Cells(i + début, 1) & ".jpg")
    Me("Image" & i).ControlTipText = f.Cells(i + début, 1)
    Me("Image" & i).BorderStyle = 1
    Me("txt1" & i).Value = f.Cells(i + début, 1)
    Me("txt2" & i).Value = f.Cells(i + début, 2)
    Me("txt3" & i).Value = f.Cells(i + début, 3)
  Next i
  Me.Repaint
End Sub

Private Sub ScrollBar1_Change()
  début = ScrollBar1
  affiche
End Sub

Private Sub B_ok_Click()
  Set f = Sheets("BD")
  f.[K2] = "*" & Me.TextBox1 & "*"
  f.[A1:C10000].AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=f.[K1:K2],      CopyToRange:=Sheets("interro").[A1:C1]
  Set f = Sheets("interro")
  début = 1
  n = 3
  For i = 1 To n
    Me("Image" & i).Picture = LoadPicture()
    Me("Image" & i).ControlTipText = ""
    Me("txt1" & i).Value = ""
    Me("txt2" & i).Value = ""
    Me("txt3" & i).Value = ""
  Next i
  nInterro = Application.CountA(f.[A:A]) - 1
  If nInterro < n Then n = nInterro
  Me.ScrollBar1.Min = 1
  Me.ScrollBar1.Max = nInterro - n + 1
  affiche
End Sub

Public répertoirePhotos
Sub auto_open()
  Application.ScreenUpdating = False
  répertoirePhotos = "c:\photos\" ' Adapter
  If Dir(répertoirePhotos, vbDirectory) = "" Then MkDir répertoirePhotos
  Set f = Sheets("BD")
  For Each c In f.Range("a2:a" & f.[a65000].End(xlUp).Row)
    c.Comment.Visible = True
    H = c.Comment.Shape.Height
    L = c.Comment.Shape.Width
    c.Comment.Shape.CopyPicture
    c.Comment.Visible = False
    f.ChartObjects.Add(0, 0, L, H).Chart.Paste
    f.ChartObjects(1).Border.LineStyle = 0
    f.ChartObjects(1).Chart.Export Filename:= _
    répertoirePhotos & c & ".jpg", FilterName:="jpg"
    f.ChartObjects(1).Delete
  Next c
  UserForm1.Show
End Sub

Simulation listBox couleur

-Permet d'obtenir une ligne sur 2 en couleur
-Permet d'afficher du texte sur plusieurs lignes

ListBoxSimul


Treeview simple

Treeview Simple

Private Sub UserForm_Initialize()
  Tbl = Range("A2:B" & [A65000].End(xlUp).Row).Value
  Me.Monarbre.Nodes.Add(, , "NoeudInit", "Début").Expanded = True ' Début arbre
  Set d = CreateObject("scripting.dictionary")
  For i = 1 To UBound(Tbl): d(Tbl(i, 2)) = "": Next i
  For Each c In d.keys ' Noeuds départements
     Me.Monarbre.Nodes.Add("NoeudInit", tvwChild, "NoeudDep" & c, c).Expanded = True
  Next c
  For i = 1 To UBound(Tbl) ' Noeuds noms
    Me.Monarbre.Nodes.Add("NoeudDep" & Tbl(i, 2), tvwChild, "NoeudNom" & Tbl(i, 1), Tbl(i, 1)).Expanded = True
  Next i
End Sub

Treeview nomenclature

Treeview nomenclatureSimple
Treeview nomenclature
Treeview nomenclature2
Treeview nomenclature 3
Treeview généalogie
Treeview hiérarchie

 

Dim tw As MSComctlLib.TreeView
Dim Tbl, n
Private Sub UserForm_Initialize()
  Tbl = Range("A2:N" & [F65000].End(xlUp).Row).Value
  pere = "0"
  nomPere = Application.VLookup(pere, Tbl, 4, False)
  Set tw = Me.MonArbre
  n = UBound(Tbl)
  tw.Nodes.Add(, , "NoeudMat" & pere, nomPere).Expanded = True ' Racine arbre
  Fils pere
End Sub

Sub Fils(parent) ' procédure récursive
  For i = 2 To n
    cd = Tbl(i, 1)
    niv = Len(cd) - Len(Replace(cd, ".", ""))
    If niv = 0 Then temp = "0" Else temp = Left(cd, Len(cd) - 2)
    If temp = parent Then
      tw.Nodes.Add("NoeudMat" & parent, tvwChild, "NoeudMat" & _
      Tbl(i, 1), Tbl(i, 1) & ": " & Tbl(i, 2) & "-" & Tbl(i, 4)).Expanded = True
      Fils Tbl(i, 1)
    End If
  Next i
End Sub

Private Sub MonArbre_NodeClick(ByVal Node As MSComctlLib.Node)
  If Left(Node.Key, 8) = "NoeudMat" Then
    Me.Niveau = Application.VLookup(Mid(Node.Key, 9), Tbl, 1, False)
    Me.Article = Application.VLookup(Mid(Node.Key, 9), Tbl, 2, False)
    Me.Indice = Application.VLookup(Mid(Node.Key, 9), Tbl, 3, False)
    Me.Désignation = Application.VLookup(Mid(Node.Key, 9), Tbl, 4, False)
    Me.composant = Application.VLookup(Mid(Node.Key, 9), Tbl, 6, False)
  End If
End Sub

TreeView hierarchique

L'objet TreeView permet de visualiser une arborescence dans un formulaire.

TreeView Hierarchie

La syntaxe pour créer un noeud est:
xxx.Nodes.Add(noeud_père,twchild,création_noeud_courant,libellé_noeud)


Dim tw As MSComctlLib.TreeView
Dim Tbl, n

Private Sub UserForm_Initialize()
  Tbl = Range("A2:E" & [A65000].End(xlUp).Row).Value
  pere = Tbl(1, 1)
  Set tw = Me.MonArbre
  n = UBound(Tbl)
  tw.Nodes.Add(, , "NoeudMat" & pere, Tbl(1, 3)).Expanded = True ' Racine arbre
  Fils pere, 1
End Sub

Sub Fils(parent, niv) ' procédure récursive
  For i = 2 To n
    cd = Tbl(i, 2)
    If cd = parent Then
      tw.Nodes.Add("NoeudMat" & parent, tvwChild, "NoeudMat" & Tbl(i, 1), Tbl(i, 1)).Expanded = True
      Fils Tbl(i, 1), niv + 1
    End If
  Next i
End Sub

Private Sub MonArbre_NodeClick(ByVal Node As MSComctlLib.Node)
  If Left(Node.Key, 8) = "NoeudMat" Then
    Me.Nom = Application.VLookup(Mid(Node.Key, 9), Tbl, 1, False)
    Me.Sup = Application.VLookup(Mid(Node.Key, 9), Tbl, 2, False)
    Me.Service = Application.VLookup(Mid(Node.Key, 9), Tbl, 3, False)
    Me.Cmt = Application.VLookup(Mid(Node.Key, 9), Tbl, 4, False)
    tmp = Application.VLookup(Mid(Node.Key, 9), Tbl, 5, False)
    If tmp <> "" Then
      Me.Image1.Picture = LoadPicture("c:\photos\" & tmp & ".jpg")
    Else
      Me.Image1.Picture = LoadPicture
    End If
  End If
End Sub

 

 


Exemples

ListViewTri
Treeview
Treeview nomenclature