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
A voir également:
Remplir une listview vba excel
Listview vba - Meilleures réponses
Access requête ajout sans doublon - Meilleures réponses
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
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
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
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
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.
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
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?