Copier colonne filtrée
Bonjour à tous,
Malgré de nombreuses recherches je n'ai pas trouvé de solutions à mon problème.
Je veux filtrer une page de mon excel (ça c'est bon). Ensuite j'aimerai copier les cellules d'une colonne en particulier (c'est bon aussi) en m'assurant de n'en avoir aucune en double et enfin de les copier dans une même cellule (c'est plutôt cette partie le problème).
Voici un schéma (le premier tableau c'est ma page filtrée avec uniquement janvier en colonne 1) :
| Colonne 1 | Colonne 2 |
| Janvier | A |
| Janvier | B |
| Janvier | A |
| Janvier | C |
Et donc j'aimerais mettre dans une cellule d'une autre page (avec un espace entre les lettres si possible pour que cela soit plus lisible) :
| A B C |
Voici le code que j'ai pour le moment :
'Dernière ligne de Data
lastRow = WbAColler.Worksheets("Data").Range("A" & WbAColler.Worksheets("Data").Rows.Count).End(xlUp).Row
'Filtres
reseau = WbAColler.Worksheets("Trames absentes").Range("A2").Value
trame = WbAColler.Worksheets("Trames absentes").Range("C2").Value
WbAColler.Worksheets("Data").Range("A1").AutoFilter Field:=4, Criteria1:=Array(synoptic(reseau)), Operator:=xlFilterValues
WbAColler.Worksheets("Data").Range("A1").AutoFilter Field:=5, Criteria1:=Array(trame), Operator:=xlFilterValues
'Affichage ECU destinataire
WbAColler.Worksheets("Data").Range("D2:D" & lastRow).SpecialCells(xlCellTypeVisible).Copy
WbAColler.Worksheets("Trames absentes").Range("I4").PasteSpecial Paste:=xlPasteAll
Application.CutCopyMode = FalseSi ce n'est pas clair, n'hésitez pas à me demander des précisions.
Merci d'avance pour votre aide
Hello,
La façon la + simple d'avoir une liste sans doublon est d'utiliser la méthode .RemoveDuplicates.
L'inconvénient de cette méthode c'est qu'elle s'utilise sur une feuille et non en mémoire.
Mais si tu n'es pas contre rajouter une feuille de travail dans ton fichier, utilise la !
Puisque tu as un feuille de travail, tu peux utiliser une formule pour concaténer ton résultat en une cellule
=CONCAT(TRANSPOSE(A1:A3)&" ") Plage à modifier
Pour résumer :
1 tu ajoutes une feuille vierge dans ton fichier
2 tu fais le filtre sur le mois
3 copier la colonne 2 dans ta feuille de travail
4 removeduplicate
5 tu utilises la formule avec la plage de doublons.
le tout en vba
=JOINDRE.TEXTE(" ";;UNIQUE(FILTRE(B2:B5;A2:A5="janvier")))
ou sans ce filtre
=JOINDRE.TEXTE(" ";;UNIQUE(B2:B5))Merci pour vos réponses rapides.
Effectivement j'ai une feuille de travail que je créée plus tôt dans la macro mais je souhaite la supprimer à la fin. C'est pour cela que je voulais faire cela en mémoire et non directement avec une formule dans les cellules.
Là j'en suis à avoir réussi à copier les cellules qui m'intéressent (donc déjà filtrée) dans une plage. Maintenant j'aimerai (en mémoire) copier ces cellules (en évitant les doublons) et ensuite les mettre dans une seule et même string (avec des espaces entre les lettres) et les afficher dans ma cellule souhaitée.
Pour cela j'avais l'idée suivante que je n'arrive pas à réaliser :
1) Prendre la première cellule et l'ajouter dans un tableau en même temps que dans une string (avec un espace à la fin pour avoir un espace entre chaque lettre)
2) Passer à la cellule suivante, vérifier si elle n'est pas dans déjà dans la string (en utilisant le tableau, c'est pour cela que je pensais en faire un). Si elle n'est pas dedans, l'ajouter à la string
3) Faire cela jusqu'à la fin de ma liste de lettre
4) Afficher la string avec les lettres dans la cellule que je veux
La difficulté majeure que j'ai rencontrée est pour compter le nombre de fois que je dois faire l'étape 2 (je voulais faire une boucle for mais je n'arrive pas à compter le nombre de cellules)
Que pensez-vous tout d'abord de mon raisonnement ? Et comment compter le nombre de cellule non vide dans une colonne (sachant qu'il y a des cellules occupées dans le reste de la page)
Merci d'avance pour vos réponses
bonjour, vous pouvez faire tout cela en mémoire avec un dictionaire
Sub test()
Dim c As Range, Dict, c0, s, WbAColler, lastrow
'ceci est déjà dans votre macro
Set WbAColler = ActiveWorkbook
lastrow = WbAColler.Worksheets("Data").Range("A" & WbAColler.Worksheets("Data").Rows.Count).End(xlUp).Row
'à partir d'ici nouveau
On Error Resume Next
Set c = Nothing
Set c = WbAColler.Worksheets("Data").Range("D2:D" & lastrow).SpecialCells(xlCellTypeVisible) 'plage avec les cellules visible (s'il y en a !)
On Error GoTo 0
If Not c Is Nothing Then 'il y a des cellules visibles
Set Dict = CreateObject("scripting.dictionary") 'cahier de brouillon
Dict.comparemode = vbTextCompare 'majuscules et miniscules sont traités égal
For Each c0 In c.Cells 'boucle
If Len(c0.Value) > 0 Then Dict(c0.Value) = vbEmpty 'si cellule n'est pas vide, ajouter valeur UNIQUE au dictionaire
Next
If Dict.Count Then 'dictionaire n'est pas vide
s = Join(Dict.keys) 'joindre les clefs du dictionaire
MsgBox s
End If
End If
End SubMerci pour vos réponses
J'ai réussi à avancer avec vos conseils et aussi à ma sauce.
Concernant le sujet de mon poste, j'ai bien réussi à copier ma colonne filtrée.
Voici le code si certains en ont besoin :
'Dernière ligne de Data
lastRow = WbAColler.Worksheets("Data").Range("A" & WbAColler.Worksheets("Data").Rows.Count).End(xlUp).Row
'Copie colonne filtrée
WbAColler.Worksheets("Data").Range("D2:D" & lastRow).SpecialCells(xlCellTypeVisible).Copy
WbAColler.Worksheets("Data").Range("Z1").PasteSpecial Paste:=xlPasteAllCela copie la colonne D qui est filtrée dans la colonne Z.
Si vous voulez voir le reste de ce dont l'on a discuté dans ces messages, n'hésitez pas.
Bonne journée
Bonjour,
Vous l'avez essayé ?
- Ce n'est pas nécessaire de coller vers la colonne Z, vous prenez la partie "à partir d'ici ...".
- Cela met tout les valeurs dans un dictionaire, de manière qu'il n'y a pas de doublons.
Oui je l'ai essayé et cela fonctionne.
Pour les doublons, je le fais plus loin dans mon programme mais je ne l'ai pas inclu dans mon message car ce n'était pas le titre du sujet que j'ai ouvert
WbAColler.Worksheets("Data").Range("A10").value = Join(Dict.keys) 'joindre les clefs du dictionaire