[VBA]ListView sans doublon et ajout [Résolu]

jojokun 7 Messages postés mardi 28 mars 2006Date d'inscription 22 octobre 2012 Dernière intervention - 16 oct. 2012 à 10:39 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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
Afficher la suite 

7 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 oct. 2012 à 08:01
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 oct. 2012 à 11:02
0
Utile
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
Commenter la réponse de ucfoutu
jojokun 7 Messages postés mardi 28 mars 2006Date d'inscription 22 octobre 2012 Dernière intervention - 17 oct. 2012 à 06:21
0
Utile
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 
Commenter la réponse de jojokun
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 oct. 2012 à 08:14
0
Utile
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
Commenter la réponse de ucfoutu
jojokun 7 Messages postés mardi 28 mars 2006Date d'inscription 22 octobre 2012 Dernière intervention - 18 oct. 2012 à 08:53
0
Utile
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.
Commenter la réponse de jojokun
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 oct. 2012 à 10:45
0
Utile
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
Commenter la réponse de ucfoutu
jojokun 7 Messages postés mardi 28 mars 2006Date d'inscription 22 octobre 2012 Dernière intervention - 22 oct. 2012 à 07:51
0
Utile
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?
Commenter la réponse de jojokun

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.