[VBA]ListView sans doublon et ajout

Résolu
jojokun Messages postés 5 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 22 octobre 2012 - 16 oct. 2012 à 10:39
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 22 oct. 2012 à 08:01
Bonjour à tous,
Je suis de ceux qu’on appelle des débrouillards en vba, en voulant réaliser une macro je coince sur le problème suivant : j’ai réalisé un tri d’un tableau Excel en additionnant certain valeur dans le cas d’un doublon. Jusqu’à je m’en sors mais je voudrais afficher le résultat dans une listView et je me rends compte que tout le résultat est affiché sur une colonne de la listView. Pouvez-vous m’aider à remplir toute les colonnes de ma listView. Une deuxième demande est d’imprimer le contenu de la listView.

Voici mon code car je ne trouve pas comment joindre mon fichier:

Application.ScreenUpdating = False
Set F1 = Sheets("Feuil3")
a = F1.Range("A1").CurrentRegion.Value
Dim c()
ReDim c(1 To UBound(a, 1), 1 To UBound(a, 2))
ligne = 1
Set mondico = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(a)
temp = a(i, 1) & a(i, 2)
If Not mondico.exists(temp) Then
mondico.Add temp, ""
For k 1 To UBound(a, 2) - 1: c(ligne, k) a(i, k): Next k
c(ligne, k) = c(ligne, k) + a(i, k)
ligne = ligne + 1
Else
p = Application.Match(temp, mondico.keys, 0)
col = UBound(a, 2) - 1
c(p, col) = c(p, col) + a(i, col)
End If
Next
Feuil3.[A1].CurrentRegion.ClearContents
'Feuil3.[A1].Resize(mondico.Count, UBound(a, 2)) = c
With UserForm1.ListView1
With .ColumnHeaders
.Clear
.Add , , "Réference", 50, lvwColumnLeft
.Add , , "Nom produit", 140, lvwColumnLeft
.Add , , "Quantité", 48, lvwColumnLeft
.Add , , "Unité ", 53, lvwColumnLeft
End With
ligne = 1
.View = lvwReport
.FullRowSelect = True
.Gridlines = True
.AllowColumnReorder = True

For Each Z In c
.ListItems.Add , , Z
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 1)
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 3)
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 2)
'ligne = ligne + 1
Next Z

End With

Comment définir Z comme un tableau pour l'afficher dans la listView?
Merci à vous

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 oct. 2012 à 08:01
1) Relis attentivement mon message (très clair) du mardi 16 octobre 2012 à 11:02:10, dont voici un extrait :
On va donc ne pas tenir compte de :

"Une deuxième demande est d’imprimer le contenu de la listView."

2) Libère la présente discussion (tag "réponse acceptée")
3) ouvre une nouvelle discussion pour cette AUTRE DIFFICULTE.
Si tu veux de l'aide, respecte les règles fondamentales de ce forum.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 oct. 2012 à 11:02
Bonjour, tu es ici dans la section :
1)
Forum > Visual Basic 6
et non celle, adéquate puisque tu développes sous VBA/Excel : Langages dérivés > VBA !
Un administrateur bienveillant déplacera cette discussion, mais veux-tu bien s'il te plait veiller dorénavant à prendre ce soin indispensable ? Merci de respecter cette règle.
2) une seule question par discussion est également une règle. On va donc ne pas tenir compte de :
Une deuxième demande est d’imprimer le contenu de la listView.

3) nous allons également attendre que tu nous présente à nouveau ton code, mais cette fois-ci :
- indenté
- entre balises code (3ème icône en partant de la droite) pour en conserver la mise en forme.
Ce ne sera qu'alors que je te répondrai, personnellement.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
jojokun Messages postés 5 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 22 octobre 2012
17 oct. 2012 à 06:21
Bonjour à toi UCFOUTU, sympa le pseudo
Je suis désolé d'avoir posté une demande n'importe où mais la raison de cela est que sur les thèmes proposés, je n'ai pas trouvé mieux celui ci. J'ai beau fouiller partout je ne trouve pas à part dans vos archives les sujets qui se rapprochent de mon problème. ton aide pour m'orienter sera le bienvenue.

Application.ScreenUpdating = False
Set F1 = Sheets("Feuil3")
a = F1.Range("A1").CurrentRegion.Value
Dim c()
ReDim c(1 To UBound(a, 1), 1 To UBound(a, 2))
ligne = 1
Set mondico = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(a)
temp = a(i, 1) & a(i, 2)
If Not mondico.exists(temp) Then
mondico.Add temp, ""
For k 1 To UBound(a, 2) - 1: c(ligne, k) a(i, k): Next k
c(ligne, k) = c(ligne, k) + a(i, k)
ligne = ligne + 1
Else
p = Application.Match(temp, mondico.keys, 0)
col = UBound(a, 2) - 1
c(p, col) = c(p, col) + a(i, col)
End If
Next
Feuil3.[A1].CurrentRegion.ClearContents
'Feuil3.[A1].Resize(mondico.Count, UBound(a, 2)) = c
With UserForm1.ListView1
With .ColumnHeaders
.Clear
.Add , , "Réference", 50, lvwColumnLeft
.Add , , "Nom produit", 140, lvwColumnLeft
.Add , , "Quantité", 48, lvwColumnLeft
.Add , , "Unité ", 53, lvwColumnLeft
End With
ligne = 1
.View = lvwReport
.FullRowSelect = True
.Gridlines = True
.AllowColumnReorder = True

For Each Z In c
.ListItems.Add , , Z
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 1)
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 3)
'.ListItems(ligne).ListSubItems.Add , , Z.Offset(, 2)
'ligne = ligne + 1
Next Z

End With 
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 oct. 2012 à 08:14
Ton code n'est pas indenté et est donc pénible à lire !
Il montre des lignes n'ayant rien à voir directement avec ton problème, que tu aurais du isoler, qui est au bout du compte :
- celui de parcourir un tableau dynamique C constitué d'un certain nombre de lignes et de colonnes (lignes et colonnes commençant à l'index 1). En espérant (mais c'est une autre question) que ce tableau contienne bien ce que tu voulais.
- remplir une listview à partir du contenu de ce tableau
Ton code n'étant pas indenté, je me refuse à l'examiner (encore que ... je vois bien que ta "listview", pour laquelle tu utilises des propriétés que je ne lui connais pas, est assez bizarre.
Avance donc pas à pas, difficulté par difficulté !
Parcourir un tableau ? ===>> exemple que tu devrais comprendre :
 Dim c(1 To 4, 1 To 3)
  For i = 1 To 4
    For j = 1 To 3
       c(i, j) = i + j
    Next
  Next
  
  For i = LBound(c, 1) To UBound(c, 1)
    For j = LBound(c, 2) To UBound(c, 2)
      MsgBox "j'ai " & c(i, j) & " en colonne " & j & " de la ligne " & i
    Next
  Next

Il s'agit là de la toute première étape à passer pour commencer à comprendre.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jojokun Messages postés 5 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 22 octobre 2012
18 oct. 2012 à 08:53
Bonjour,
Je me risque ici à continuer l'explication de mon code. Du début du code jusqu'au redimensionnement de "c", il s'agit d'effectuer un tri d'un tableau Excel, je repère des cellules identiques et j'ajoute les valeurs des cellules de l'avant dernière colonne. Le résultat de cette opération est afficher sur Excel en redimensionnant le "c". Maintenant je cherche à afficher directement celui-ci dans une Listview. En définissant Les Z valeurs de "c", j’espérais les afficher dans ma Listview mais l'ensemble des valeurs Z de "c" sont afficher que sur la première colonne de ma Listview, j'ai essayé de bidouiller avec de Z.Offset (,1) mais en vain. Voila j’espère avoir enlever quelque bizarrerie sur ma demande.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 oct. 2012 à 10:45
Oui. Et ?
Ce qui revient (comme dit plus haut) à la question :
Comment charger dans une listview les valeurs d'un tableau dynamique.
Il faut commencer par apprendre à les parcourir, ce que je t'ai montré !
Où en es-tu donc de ce parcours ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
jojokun Messages postés 5 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 22 octobre 2012
22 oct. 2012 à 07:51
Bonjour,
Merci pour ton aide et excuse moi mais je n'avais pas bien regardé le dimensionnement de "c" mais après ta remarque j'ai modifié mon code en:
Application.ScreenUpdating = False
  Set F1 = Sheets("Feuil3")
  a = F1.Range("A1").CurrentRegion.Value
    Dim c()
  ReDim c(1 To UBound(a, 1), 1 To UBound(a, 2))
  ligne = 1
  Set mondico = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(a)
    temp = a(i, 1) & a(i, 2)
    If Not mondico.exists(temp) Then
      mondico.Add temp, ""
      For k 1 To UBound(a, 2) - 1: c(ligne, k) a(i, k): Next k
      c(ligne, k) = c(ligne, k) + a(i, k)
      ligne = ligne + 1
    Else
      p = Application.Match(temp, mondico.keys, 0)
      col = UBound(a, 2) - 1
      c(p, col) = c(p, col) + a(i, col)
    End If
  Next
  Feuil3.[A1].CurrentRegion.ClearContents
With UserForm1.ListView1
    With .ColumnHeaders
       .Clear
       .Add , , "Réference", 50, lvwColumnLeft
       .Add , , "Nom produit", 140, lvwColumnLeft
       .Add , , "Quantité", 48, lvwColumnLeft
       .Add , , "Unité ", 53, lvwColumnLeft
    End With
ligne = 1
 .View = lvwReport
 .FullRowSelect = True
 .Gridlines = True
 .AllowColumnReorder = True
For i = LBound(c, 1) + 1 To mondico.Count
        .ListItems.Add , , c(i, 1)
        .ListItems(.ListItems.Count).ListSubItems.Add , , c(i, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , c(i, 3)
        .ListItems(.ListItems.Count).ListSubItems.Add , , c(i, 4)
    Next

  End With

Et ça marche encore merci beaucoup
Je passe à la suite, comment j'imprime cette listview?
0
Rejoignez-nous