Listview Excel 2016

Bonjour,

actuellement sous windows 10 et office 2016 je n'arrive pas a avoir le contrôle LISTVIEW j'ai vue qu'il était possible de le créer par code vba mais ca ne fonctionne pas il y a une erreur et je ne sais pas pourquoi?

' Create a ListView control in VBA code
Dim objListView As ListView
Set objListView = ThisWorkbook.Sheets(1).OLEObjects.Add( _
   ClassType:="MSComctlLib.ListViewCtrl.2", _
   Link:=False, DisplayAsIcon:=False, _
   Left:=50, Top:=50, Width:=200, Height:=100).Object

' Set ListView properties through the objListView reference
objListView.LabelEdit = lvwAutomatic
objListView.CheckBoxes = True

Pourriez vous m'aider a faire fonctionner le contrôle soit par code vba soit en l'ajoutant?

Il me valide bien le MSCOMCTL.OCX quand je l'ajoute avec la commande MSDOS mais il n'apparait pas dans les controles supplémentaire....

Peut-on remplacer la listview par MSFlexGrid?

Merci....

Bonjour,

A mon avis, vous êtes en Office 2016 64 bits, version pour laquelle ce contrôle ne fonctionne pas. Il faut en choisir un autre ou revenir à Office 2016 32 bits.

L'alternative 64 bits est une ListBox qu'il faudra paramétrer manuellement au niveau des propriétés ColumnCount et Rowsource .

Merci thev effectivement excel 64 bits....

comment transformer mon code listview en listbox s'il te plait?

If UserForm1.ListView1.ListItems.Count >= 27 Then
      MsgBox "Bon de commande rempli": Exit Sub
    Else
      With UserForm1
        .ListView1.ListItems.Add , , TextBoxNCOMMANDE.Value
        .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox2.Value
        .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox8.Value
        .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox10.Value
          .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , Textbox9.Value
         .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox4.Value
  .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox1.Value
   .ListView1.ListItems(.ListView1.ListItems.Count).ListSubItems.Add , , TextBox3.Value

   End With
End If

Me suffit-il de remplacer listview1 par listbox?

Merci cordialement.

Bonjour,

ci-dessous code avec ListBox

 With Me.ListBox1
        If .ListCount >= 27 Then
            MsgBox "Bon de commande rempli": Exit Sub
        Else
            .ColumnCount = 8
            .AddItem TextBoxNCOMMANDE.Value
            .List(.ListCount - 1, 1) = TextBox2.Value
            .List(.ListCount - 1, 2) = TextBox8.Value
            .List(.ListCount - 1, 3) = TextBox10.Value
            .List(.ListCount - 1, 4) = Textbox9.Value
            .List(.ListCount - 1, 5) = TextBox4.Value
            .List(.ListCount - 1, 6) = TextBox1.Value
            .List(.ListCount - 1, 7) = TextBox3.Value
        End If
    End With

Merci thev j'ai appliqué ton code qui fonctionne très bien par contre je ne vois pas entièrement le texte dans ma listbox comment renvoyer a la ligne le texte d'une colonne?

ensuite quand je valide avec un bouton ma liste de ma listbox je la transfere vers mon bon de commande peut tu me modifier le code pour que ca se copie vers mon bon de commande?

 With Sheets("Bon de commande")
     If .ListCount >= 1 Then
     ' If UserForm1.ListView1.ListItems.Count >= 1 Then
         For k = 1 To UserForm1.ListView1.ListItems.Count
          .Range("A" & k + 20) = UserForm1.ListView1.ListItems(k).ListSubItems(1)
           .Range("G" & k + 20) = UserForm1.ListView1.ListItems(k).ListSubItems(7)
           .Range("F" & k + 20) = UserForm1.ListView1.ListItems(k).ListSubItems(6)
         .Range("F12").Value = UserForm1.TxtDatedecommande.Value
         .Range("B12").Value = UserForm1.Txtsaisipar.Value
         .Range("B14").Value = UserForm1.Textbox9.Value

         Next k
      End If
     End With
 Dim lg As Long, cl As Long, i As Long, j As Long
Dim T As Variant

    With UserForm1.ListView1
        lg = .ListItems.Count
        cl = .ColumnHeaders.Count
        ReDim T(1 To lg, 1 To cl + 1)
        For i = 1 To lg
            T(i, 1) = .ListItems(i).Text
            For j = 1 To cl - 1
                T(i, j + 1) = .ListItems(i).ListSubItems(j).Text
            Next j
        Next i
    End With

    Dim derlig As Long

Merci pour tout.

reglaet a écrit :

Merci thev j'ai appliqué ton code qui fonctionne très bien par contre je ne vois pas entièrement le texte dans ma listbox comment renvoyer a la ligne le texte d'une colonne?

Je pense que le mieux est de jouer sur la taille des colonnes pour afficher ton texte. Ci-dessous exemple de ListBox avec largeur totale de 720 pt et les 8 colonnes de même taille :
    With Me.ListBox1
            .Width = "720"
            .ColumnCount = 8
            .ColumnWidths = "90;90;90;90;90;90;90;90"
    End With
reglaet a écrit :

ensuite quand je valide avec un bouton ma liste de ma listbox je la transfere vers mon bon de commande peut tu me modifier le code pour que ca se copie vers mon bon de commande?

Ce code devrait fonctionner
Set F = Sheets("Bon de commande")
With UserForm1.ListBox1
    If .ListCount >= 1 Then
        For k = 0 To .ListCount - 1
            F.Range("A" & k + 21) = .List(k, 0)
            F.Range("G" & k + 21) = .List(k, 6)
            F.Range("F" & k + 21) = .List(k, 5)
            With UserForm1
                F.Range("F12").Value = .TxtDatedecommande.Value
                F.Range("B12").Value = .Txtsaisipar.Value
                F.Range("B14").Value = .Textbox9.Value
            End With
        Next k
    End If
End With

super un grand merci il me reste juste une petite erreur que je n'arrive pas a expliquer....[code With Me.ListBox1

If .ListCount >= 27 Then

MsgBox "Bon de commande rempli": Exit Sub

Else

.ColumnWidths = "640"

.ColumnCount = 5

.ColumnWidths = "80;280;230;0;50"

.AddItem TextBoxNCOMMANDE.Value

.List(.ListCount - 1, 1) = TextBox2.Value

.List(.ListCount - 1, 2) = Textbox9.Value

.List(.ListCount - 1, 3) = TextBox4.Value

.List(.ListCount - 1, 4) = TextBox1.Value

End If

'End][/code]

je n'explique pas pourquoi il me décale le textbox 1 d'une colonne dans la listbox et pour le coup je suis obligé de mettre 0 en largeur dans la 4eme colonnes?


quels est le code a utiliser pour supprimer une ligne du listbox merci?

ListBox1.ListItems.Remove (ListBox1.SelectedItem.Index)

et pour modifier la quantitée?

With ListView1.ListItems(ListView1.SelectedItem.Index)
.ListSubItems(6).Text = TextBox1.Value
End With

Merci pour ton aide précieuse qui me permet d'avancer dans mon projet , j'ai vraiment du mal à convertir cette listview en listbox....

reglaet a écrit :

je n'explique pas pourquoi il me décale le textbox 1 d'une colonne dans la listbox et pour le coup je suis obligé de mettre 0 en largeur dans la 4eme colonnes?

D'abord erreur d'inattention, la propriété relative à la largeur totale de la ListBox est "Width" :
.Width = "640"
.ColumnCount = 5
.ColumnWidths = "80;280;230;0;50"

Ensuite au niveau de la taille spécifique de chaque colonne, il faut toujours indiquer les 5. Pour ne pas en afficher une, il suffit de mettre sa taille à 0.

reglaet a écrit :

quels est le code a utiliser pour supprimer une ligne du listbox merci?

ci-dessous exemple de code (attention!, il faut partir du dernier élément pour ne pas se mélanger les pinceaux)
    With Me.ListBox1
        For i = .ListCount - 1 To 0 Step -1
            'si  l'élément est selectionné dans la ListBox, on le supprime
            If .Selected(i) = True Then .RemoveItem (i)
        Next i
    End With

Pour remplacer ton instruction Listview

    With Me.ListBox1
        .RemoveItem (.ListIndex)
    End With
reglaet a écrit :

et pour modifier la quantité?

    With Me.ListBox1
        .List(.ListIndex, 5) = TextBox1.Value
    End With

merci pour les colonnes je ne comprends pas pourquoi ca m'en creer une vide mais bon je la mettrait a 0 pour ne pas la voir.

Pour la suppression OK ca fonctionne parfaitement, par contre pour la modification de la quantité il ne se passe rien?

Problème dans le code ou mauvaise manip de ma part....

une derniere modif de listview à listbox pour transferer ma liste sur mon historique de commande apres j'espere ne plus t'embeter...[code

Dim lg As Long, cl As Long, i As Long, j As Long

Dim T As Variant

With UserForm1.ListView1

lg = .ListItems.Count

cl = .ColumnHeaders.Count

ReDim T(1 To lg, 1 To cl + 1)

For i = 1 To lg

T(i, 1) = .ListItems(i).Text

For j = 1 To cl - 1

T(i, j + 1) = .ListItems(i).ListSubItems(j).Text

Next j

Next i

End With

Dim derlig As Long

With Sheets("Historique Commande")

derlig = .Cells(Rows.Count, 1).End(xlUp).Row ' dernière ligne occupée

For i = 1 To lg ' boucle sur les lignes du tableau

derlig + i => pour incrémenter au fur et à mesure les lignes de la feuille

.Range("A" & derlig + i) = T(i, 1) ' N°commande

.Range("B" & derlig + i) = Txtsaisipar.Value

.Range("C" & derlig + i) = T(i, 2) ' Ref produit

.Range("D" & derlig + i) = T(i, 3) ' conditionnement

.Range("E" & derlig + i) = T(i, 4) ' dosage

.Range("F" & derlig + i) = T(i, 5) ' fournisseur

.Range("G" & derlig + i) = T(i, 6) ' ref fournisseur

.Range("H" & derlig + i) = T(i, 8) 'Prix

.Range("I" & derlig + i) = T(i, 7) 'Quantité

.Range("J" & derlig + i) = CDate(TxtDatedecommande.Value)

.Range("K" & derlig + i) = CDate(TxtDatedelivraison.Value)

Next i

End With][/code]

Bonsoir,

reglaet a écrit :

une derniere modif de listview à listbox pour transferer ma liste sur mon historique de commande

Pour terminer, un code optimisé qui devrait convenir :
    Dim cel_vide As Range, lig_vide As Range

    '1ère cellule disponible en colonne A et 1ère ligne associée
     Set cel_vide = Sheets("Historique Commande").Columns("A").Find("")
    Set lig_vide = cel_vide.EntireRow  

    With UserForm1.ListBox1
        'ajout données ListBox1 à partir de la première cellule disponible
         cel_vide.Resize(.ListCount, .ColumnCount).Value = Application.Transpose(Application.Transpose(.List))

        'décalage d'une colonne à partir de la colonne B ajoutée
         lig_vide.Columns("B").Resize(.ListCount).Insert Shift:=xlToRight

        'remplissage colonnes B,J,K pour les lignes ajoutées
         lig_vide.Columns("B").Resize(.ListCount).Value = Txtsaisipar.Value
        lig_vide.Columns("J").Resize(.ListCount).Value = CDate(TxtDatedecommande.Value)
        lig_vide.Columns("K").Resize(.ListCount).Value = CDate(TxtDatedelivraison.Value)
    End With

bonjour,

dans le dernier code j'ai une erreur d'incompatibilité sur cette ligne:

[codecel_vide.Resize(.ListCount, .ColumnCount).Value = Application.Transpose(Application.Transpose(.List))][/code]

j'ai aussi un autre bouton qui me permet de récupérer les produits "a commander" et me les transfere directement sur la listview

Dim Com As Worksheet
Set Com = Worksheets("Historique Commande")
Dim ligne As Long
Dim Cel As Range

 If TxtDatedecommande.Value = "" Then
   Me.TxtDatedecommande.BackColor = &H80FFFF
   MsgBox "Veuillez saisir une date de commande"
Exit Sub
End If

   If Txtsaisipar.Value = "" Then
   Me.Txtsaisipar.BackColor = &H80FFFF
   MsgBox "Veuillez saisir un Nom pour la commande"
Exit Sub
End If

     If TxtDatedelivraison.Value = "" Then
    Me.TxtDatedelivraison.BackColor = &H80FFFF
   MsgBox "Veuillez saisir une date de livraison prévue"
Exit Sub
End If

If TextBoxNCOMMANDE.Value = "" Then
   MsgBox "Veuillez cliquer sur le Bouton Nouvelle Commande"
Exit Sub
End If

  With UserForm1.ListView1

    .ListItems.Clear
        With .ColumnHeaders
        'Titres des colonnes
            .Clear
            'Ajout des colonnes
            .Add , , "N° Commande", 50
            .Add , , "Désignation", 200
            .Add , , "Conditionnement", 90, lvwColumnCenter
            .Add , , "Dosage", 50, lvwColumnCenter
            .Add , , "Fournisseur", 70, lvwColumnCenter
            .Add , , "Réf Fournisseur", 90, lvwColumnCenter
            .Add , , "Quantité", 50, lvwColumnCenter
            .Add , , "Prix", 50, lvwColumnCenter

        End With
    .Font.Size = 8
    .Font.Bold = True
    .View = lvwReport 'affichage en mode Rapport
    .Gridlines = True 'affichage d'un quadrillage
    .FullRowSelect = True 'Sélection des lignes comlètes
    .LabelEdit = lvwAutomatic
    .HotTracking = False

    With UserForm1.ListView1

        For cellule = 7 To Cells(65535, 7).End(xlUp).Row

                If Range("Q" & cellule) = "A COMMANDER" Then

                    .ListItems.Add , , TextBoxNCOMMANDE
                    '.ListItems.Add , "Q" & cellule, Range("Q" & cellule)
                    Compteur = .ListItems.Count
                    .ListItems(Compteur).ListSubItems.Add , "D" & cellule, Range("D" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "B" & cellule, Range("B" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "C" & cellule, Range("C" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "G" & cellule, Range("G" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "H" & cellule, Range("H" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "K" & cellule, Range("K" & cellule)
                    .ListItems(Compteur).ListSubItems.Add , "J" & cellule, Range("J" & cellule)

             End If

        Next cellule

    End With
    End With

Merci pour le temps que tu passe pour mon projet .

Cette listview incompatible avec office 2016 64 bits me pénalise beaucoup GRRRRR!!!!

reglaet a écrit :

dans le dernier code j'ai une erreur d'incompatibilité sur cette ligne: [codecel_vide.Resize(.ListCount, .ColumnCount).Value = Application.Transpose(Application.Transpose(.List))][/code]

Je n'ai pas cette erreur. Il faudrait me communiquer un extrait de ton nouveau code plus complet. A tout hasard, essayer cette modif :

    Dim cel_vide As Range, lig_vide As Range

    '1ère cellule disponible en colonne A et 1ère ligne associée
     With Sheets("Historique Commande")
        Set cel_vide = .Columns("A").Find(""): If cel_vide Is Nothing Then Set cel_vide = .Range("A1")
        Set lig_vide = cel_vide.EntireRow
    End With

    With UserForm1.ListBox1
        If .ListCount > 0 Then
            'ajout données ListBox1 à partir de la première cellule disponible
             cel_vide.Resize(.ListCount, .ColumnCount).Value = Application.Transpose(Application.Transpose(.List))

            'décalage d'une colonne à partir de la colonne B ajoutée
             lig_vide.Columns("B").Resize(.ListCount).Insert Shift:=xlToRight

            'remplissage colonnes B,J,K pour les lignes ajoutées
             lig_vide.Columns("B").Resize(.ListCount).Value = Txtsaisipar.Value
            lig_vide.Columns("J").Resize(.ListCount).Value = CDate(TxtDatedecommande.Value)
            lig_vide.Columns("K").Resize(.ListCount).Value = CDate(TxtDatedelivraison.Value)
        End If
    End With

non c'est pareil avec ce code erreur incompatibilité de type et l'userform se ferme et rien n'est inscrit dans ma feuille historique commande...

c'est pas facile tout ca....

le probleme vient de cette ligne:

 cel_vide.Resize(.ListCount, .ColumnCount).Value = Application.Transpose(Application.Transpose(.List))

Pour que je voie d'où vient l'erreur, il me faudrait un code plus complet de l'alimentation de l'historique et le code constitutif de ListBox1, voire un extrait non confidentiel de votre classeur.

bonjour ci joint le fichier.

click sur bouton commande et bouton passer une commande et tu trouvera l'userform a modifier pour le transformer avec une listbox plutôt qu'une listview ou autre idée je suis preneur si ça améliore le projet.

Merci pour tout Thev

Bonjour,

ci-jointe version modifiée avec :

1- paramétrage ListBox1 via éditeur VBA

2- adaptation de la désignation au niveau BDD et Bon de Commande

Un grand merci toute tes modifications fonctionnent à merveille

Juste un dernier bouton qu'on à pas traiter dans l'userform 1 le bonton ajouter les produits "A COMMANDER" de la feuille listing directement dans la listbox bouton en haut à droite.

Merci

Bonsoir,

Ajout des produits "A COMMANDER" avec pour simplifier code et formules, la création du nom de plage :

Produits_à_commander =DECALER('Listing Produits'!$Q:$Q;5;0;NBVAL('Listing Produits'!$A:$A);1)

Cette plage correspond donc à la colonne Q de la feuille Listing Produits, commençant à la ligne 6 avec un nombre de lignes égal au nombre de cellules non vides de la colonne A (référence Produit).

Rechercher des sujets similaires à "listview 2016"