Masquer dans une colonne les doublés
Résolu/Fermé
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
-
11 déc. 2007 à 00:03
plastickman Messages postés 64 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 8 février 2012 - 17 déc. 2007 à 21:01
plastickman Messages postés 64 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 8 février 2012 - 17 déc. 2007 à 21:01
A voir également:
- Masquer dans une colonne les doublés
- Déplacer une colonne excel - Guide
- Masquer conversation whatsapp - Guide
- Colonne word - Guide
- Comment masquer les amis sur facebook - Guide
- Additionner colonne excel - Guide
9 réponses
BloodyAngel
Messages postés
1479
Date d'inscription
mardi 21 juin 2005
Statut
Contributeur
Dernière intervention
21 juin 2018
401
11 déc. 2007 à 06:00
11 déc. 2007 à 06:00
Ce n'est pas tellement compliqué...
J'imagine que ça devrait ressembler +/- à ça :
Dim i as integer
Dim j as integer
i=1
WHILE i<20 ' Suppression des lignes vides
IF Cells(i,1) = "" THEN
Rows(i).Delete
END IF
i=i+1
Wend
i=1
WHILE Cells(i,1)<>"" ' Suppression des doublons
j=i+1
WHILE Cells(j,1)<>""
IF cells(j,1) = Cells(i,1) THEN
Rows(j).Delete
END IF
j=j+1
WEND
i=i+1
WEND
Voilà je pense que ça devrait fonctionner nickel mais j'ai la flemme de tester ^^
Juste deux choses :
- cela ne fonctionne que pour une plage allant de A1 à A20 comme tu l'as demandé
- quand le code supprimme, il ne supprime pas que la données en question mais toute la ligne qui y correspond. Par exemple si en A3 tu as une ligne vide ou un doublon, il va te supprimer toute la ligne 3. Donc si dans mon exemple tu as des données en B3, C3, D3, etc, elle seront également supprimée.
Si tu as des problèmes avec ce code fait-le moi savoir. Là je suis fatigué donc il se peut que j'aie fais une erreur. Cela dit je ne pense pas.
Tchuss
J'imagine que ça devrait ressembler +/- à ça :
Dim i as integer
Dim j as integer
i=1
WHILE i<20 ' Suppression des lignes vides
IF Cells(i,1) = "" THEN
Rows(i).Delete
END IF
i=i+1
Wend
i=1
WHILE Cells(i,1)<>"" ' Suppression des doublons
j=i+1
WHILE Cells(j,1)<>""
IF cells(j,1) = Cells(i,1) THEN
Rows(j).Delete
END IF
j=j+1
WEND
i=i+1
WEND
Voilà je pense que ça devrait fonctionner nickel mais j'ai la flemme de tester ^^
Juste deux choses :
- cela ne fonctionne que pour une plage allant de A1 à A20 comme tu l'as demandé
- quand le code supprimme, il ne supprime pas que la données en question mais toute la ligne qui y correspond. Par exemple si en A3 tu as une ligne vide ou un doublon, il va te supprimer toute la ligne 3. Donc si dans mon exemple tu as des données en B3, C3, D3, etc, elle seront également supprimée.
Si tu as des problèmes avec ce code fait-le moi savoir. Là je suis fatigué donc il se peut que j'aie fais une erreur. Cela dit je ne pense pas.
Tchuss
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
6
11 déc. 2007 à 14:28
11 déc. 2007 à 14:28
bonjour, ça à l'air de fonctionner , et je t'en remercie, mais je n'arrive pas à l' adapter à une autre feuille.
J'ai le cas ou je place mon bouton sur une feuille et je veux activer ma macro sur ma feuille 2 de la cellule A5:A48, je te montre ce que j'ai écrit (on ne se moque pas si j'ai fait des grosses bêtises ...):
Sheets ("feuille 2").select
Dim i as integer
Dim j as integer
i=1
WHILE 4 < i< 48
IF Cells(i,1) = "" THEN
Rows(i).Delete
END IF
i=i+1
Wend
i=1
WHILE Cells(i,1)<>""
j=i+1
WHILE Cells(j,1)<>""
IF cells(j,1) = Cells(i,1) THEN
Rows(j).Delete
END IF
j=j+1
WEND
i=i+1
WEND
A+
J'ai le cas ou je place mon bouton sur une feuille et je veux activer ma macro sur ma feuille 2 de la cellule A5:A48, je te montre ce que j'ai écrit (on ne se moque pas si j'ai fait des grosses bêtises ...):
Sheets ("feuille 2").select
Dim i as integer
Dim j as integer
i=1
WHILE 4 < i< 48
IF Cells(i,1) = "" THEN
Rows(i).Delete
END IF
i=i+1
Wend
i=1
WHILE Cells(i,1)<>""
j=i+1
WHILE Cells(j,1)<>""
IF cells(j,1) = Cells(i,1) THEN
Rows(j).Delete
END IF
j=j+1
WEND
i=i+1
WEND
A+
BloodyAngel
Messages postés
1479
Date d'inscription
mardi 21 juin 2005
Statut
Contributeur
Dernière intervention
21 juin 2018
401
12 déc. 2007 à 00:01
12 déc. 2007 à 00:01
Je n'ai regardé que le début car à mon avis ça ne marchera pas.
Tu intialises i à 1.
Ensuite, tu lui dis "TANT QUE i est plus grand ou égal à 4 et qu'il est plus petit que 48, fais la suite"
Or, puisqu'au début de ta boucle i est égal à 1, la boucle ne s'effectuera pas une seule fois.
Je ne suis pas sûr d'avoir bien compris ton problème mais je pense que ceci pourra t'aider.
Quand je veux effectuer une opération dans une feuille qui n'est pas active, je fais comme dans l'exemple suivant :
Worksheets(2).Activate
Worksheets(2).Cells(1, 1) = "Test"
Fais juste attention que le numéro (2 dans mon exemple) correspond à l'ordre de tes feuilles de gauche à droite dans ton classeur.
L'inconvéniant c'est donc que ton code buggera si tu changes les feuilles de place.
A part ça pour moi ça marche nickel.
Tu intialises i à 1.
Ensuite, tu lui dis "TANT QUE i est plus grand ou égal à 4 et qu'il est plus petit que 48, fais la suite"
Or, puisqu'au début de ta boucle i est égal à 1, la boucle ne s'effectuera pas une seule fois.
Je ne suis pas sûr d'avoir bien compris ton problème mais je pense que ceci pourra t'aider.
Quand je veux effectuer une opération dans une feuille qui n'est pas active, je fais comme dans l'exemple suivant :
Worksheets(2).Activate
Worksheets(2).Cells(1, 1) = "Test"
Fais juste attention que le numéro (2 dans mon exemple) correspond à l'ordre de tes feuilles de gauche à droite dans ton classeur.
L'inconvéniant c'est donc que ton code buggera si tu changes les feuilles de place.
A part ça pour moi ça marche nickel.
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
6
12 déc. 2007 à 18:54
12 déc. 2007 à 18:54
Bon, ça ne marche toujours pas.... j'ai du mal à comprendre tout ce que tu m'expliques, comme je te l'ai dit je commence tout juste le VBA. Pour etre franc, je ne comprends pas bien ce que représente i et j, et comment fonctionne exactement une boucle.
Jusque là, les seules macros que j'ai réussi à déchiffrer étaient avec la fonction"if"......."end if", je n'avais pas encore vu avec "while" ..."wend".
Je te redis ce que je voudrais faire, je n'ai peu-etre pas été tres clair:
J'ai une collone B4:B48 remplie avec "noms de matériaux" , desfois les matériaux apparaissent plusieurs fois, mais desfois la cellule est vide. Le but de ma macro est de masquer (sans les effacer) les cellules vides, et les cellules dont le matériau est déjà apparu une fois.
exemple:
je voudrais que:
A B C
4 placo
5 bois
6
7 bois
8
9 placo
10
11 béton
.
.
se trasforme en:
A B C
4 placo
5 bois
11 béton
.
.
J'espère m' etre mieux exprimé.
En tout cas je tiens à te remercie de passer autant de temps à m' expliquer.
Je te montre ce que j'ai "essayé "de faire:
Worksheets("materiaux 2").Activate
Dim i As Integer
Dim j As Integer
i = 4
While 4 < i < 48
If Cells(i, 1) = "" Then
Rows(i).Delete
End If
i = i + 1
Wend
i = 1
While Cells(i, 1) <> ""
j = i + 1
While Cells(j, 1) <> ""
If Cells(j, 1) = Cells(i, 1) Then
Rows(j).Delete
End If
j = j + 1
Wend
i = i + 1
Wend
Jusque là, les seules macros que j'ai réussi à déchiffrer étaient avec la fonction"if"......."end if", je n'avais pas encore vu avec "while" ..."wend".
Je te redis ce que je voudrais faire, je n'ai peu-etre pas été tres clair:
J'ai une collone B4:B48 remplie avec "noms de matériaux" , desfois les matériaux apparaissent plusieurs fois, mais desfois la cellule est vide. Le but de ma macro est de masquer (sans les effacer) les cellules vides, et les cellules dont le matériau est déjà apparu une fois.
exemple:
je voudrais que:
A B C
4 placo
5 bois
6
7 bois
8
9 placo
10
11 béton
.
.
se trasforme en:
A B C
4 placo
5 bois
11 béton
.
.
J'espère m' etre mieux exprimé.
En tout cas je tiens à te remercie de passer autant de temps à m' expliquer.
Je te montre ce que j'ai "essayé "de faire:
Worksheets("materiaux 2").Activate
Dim i As Integer
Dim j As Integer
i = 4
While 4 < i < 48
If Cells(i, 1) = "" Then
Rows(i).Delete
End If
i = i + 1
Wend
i = 1
While Cells(i, 1) <> ""
j = i + 1
While Cells(j, 1) <> ""
If Cells(j, 1) = Cells(i, 1) Then
Rows(j).Delete
End If
j = j + 1
Wend
i = i + 1
Wend
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
BloodyAngel
Messages postés
1479
Date d'inscription
mardi 21 juin 2005
Statut
Contributeur
Dernière intervention
21 juin 2018
401
13 déc. 2007 à 02:19
13 déc. 2007 à 02:19
Hello
A quelle ligne est-ce que tes données commencent ? En voyant le code, j'ai l'impression qu'elles commencent à la ligne 4.
Si c'est le cas, tu dois changer "i=1" en "i=4" lorsque tu effaces les doublons.
Sinon l'instruction While Cells(i,1)<>"" renverra false directement et tu ne passeras pas dans la boucle (sauf si les lignes 1 à 4 ne sont pas vides).
En fait, pour répondre à ta question, une boucle While ... Wend fonctionne comme ceci :
Il s'agit d'une boucle "TANT QUE... FAIRE".
Donc quand tu écris :
While 4 < i < 48
Cela veut dire :
TANT QUE i est entre 4 et 48 FAIRE
[code]
FIN
La fin est marquée par Wend.
Voilà. Donc dans mon code, l'effacement des cellules vides est assez simple à comprendre.
Pour les doublons, je fais comme suis :
i=4
TANT QUE la cellule à la ligne i et colonne 1 n'est pas vide (parcours complet de la liste puisque j'ai déjà supprimé les cellules vides)
Initialisation de j à 4
TANT QUE la cellule à la ligne j et colonne 1 n'est pas vide
SI la valeur de la cellule j:1 et la même que la valeur de la cellule i:1 ALORS
SUPPRIME la ligne j
Incrémentation de j
Incrémentation de i
Autrement dit, je parcours une fois toute la liste, et pour chaque ligne je parcours les cellules suivantes et je les supprime si je trouve la même valeur que ma cellule.
J'essaie d'être clair mais ce n'est pas facile ^^
A quelle ligne est-ce que tes données commencent ? En voyant le code, j'ai l'impression qu'elles commencent à la ligne 4.
Si c'est le cas, tu dois changer "i=1" en "i=4" lorsque tu effaces les doublons.
Sinon l'instruction While Cells(i,1)<>"" renverra false directement et tu ne passeras pas dans la boucle (sauf si les lignes 1 à 4 ne sont pas vides).
En fait, pour répondre à ta question, une boucle While ... Wend fonctionne comme ceci :
Il s'agit d'une boucle "TANT QUE... FAIRE".
Donc quand tu écris :
While 4 < i < 48
Cela veut dire :
TANT QUE i est entre 4 et 48 FAIRE
[code]
FIN
La fin est marquée par Wend.
Voilà. Donc dans mon code, l'effacement des cellules vides est assez simple à comprendre.
Pour les doublons, je fais comme suis :
i=4
TANT QUE la cellule à la ligne i et colonne 1 n'est pas vide (parcours complet de la liste puisque j'ai déjà supprimé les cellules vides)
Initialisation de j à 4
TANT QUE la cellule à la ligne j et colonne 1 n'est pas vide
SI la valeur de la cellule j:1 et la même que la valeur de la cellule i:1 ALORS
SUPPRIME la ligne j
Incrémentation de j
Incrémentation de i
Autrement dit, je parcours une fois toute la liste, et pour chaque ligne je parcours les cellules suivantes et je les supprime si je trouve la même valeur que ma cellule.
J'essaie d'être clair mais ce n'est pas facile ^^
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
6
13 déc. 2007 à 19:35
13 déc. 2007 à 19:35
ok, je commence à comprendre le fonctionnement.
En effet mes donnée commence bien en ligne 4
J'ai fais ce que tu m'as dit: j'ai mis i=4 pour initialiser en ligne 4 pour 'effacer les lignes et ' effacer les doublons, mais ça ne fonctionnait toujours pas, la boucle se lançait mais ne s'arrêtait pas. J' ai cherché et je me suis rendu compte que c'était le fait d'écrire: while 4 < i < 48
qui posait problème, en écrivant juste i < 48, ma boucle s'arrete normalement.
Ca c'est la bonne nouvelle .....
Par contre, le résultat n'est toujours pas parfait, j'ai certaines lignes vides qui restent affichées et certains doublons qui ne s'effacent pas.
et je me suis rendu compte également d'un autre problème:
exemple:
A B
1 placo
2 béton
3
4 placo
5
6 bois
.
.
avec ce code, le ésultat sera:
A B
1 placo
2 béton
3 placo
4 bois
5
6
.
.
et je me retrouve encore une fois avec un doublon: "placo"
J'ai beau me creuser le tête... je ne sais pas comment faire.
Je te renvoie mon code modifié au cas où tu verrais encore une faute.
Encore merci pour tout...
Dim i As Integer
Dim j As Integer
i = 4
While i < 48
If Cells(i, 1) = "" Then
Rows(i).Delete
End If
i = i + 1
Wend
i = 4
While Cells(i, 1) <> ""
j = i + 1
While Cells(j, 1) <> ""
If Cells(j, 1) = Cells(i, 1) Then
Rows(j).Delete
End If
j = j + 1
Wend
i = i + 1
Wend
En effet mes donnée commence bien en ligne 4
J'ai fais ce que tu m'as dit: j'ai mis i=4 pour initialiser en ligne 4 pour 'effacer les lignes et ' effacer les doublons, mais ça ne fonctionnait toujours pas, la boucle se lançait mais ne s'arrêtait pas. J' ai cherché et je me suis rendu compte que c'était le fait d'écrire: while 4 < i < 48
qui posait problème, en écrivant juste i < 48, ma boucle s'arrete normalement.
Ca c'est la bonne nouvelle .....
Par contre, le résultat n'est toujours pas parfait, j'ai certaines lignes vides qui restent affichées et certains doublons qui ne s'effacent pas.
et je me suis rendu compte également d'un autre problème:
exemple:
A B
1 placo
2 béton
3
4 placo
5
6 bois
.
.
avec ce code, le ésultat sera:
A B
1 placo
2 béton
3 placo
4 bois
5
6
.
.
et je me retrouve encore une fois avec un doublon: "placo"
J'ai beau me creuser le tête... je ne sais pas comment faire.
Je te renvoie mon code modifié au cas où tu verrais encore une faute.
Encore merci pour tout...
Dim i As Integer
Dim j As Integer
i = 4
While i < 48
If Cells(i, 1) = "" Then
Rows(i).Delete
End If
i = i + 1
Wend
i = 4
While Cells(i, 1) <> ""
j = i + 1
While Cells(j, 1) <> ""
If Cells(j, 1) = Cells(i, 1) Then
Rows(j).Delete
End If
j = j + 1
Wend
i = i + 1
Wend
BloodyAngel
Messages postés
1479
Date d'inscription
mardi 21 juin 2005
Statut
Contributeur
Dernière intervention
21 juin 2018
401
14 déc. 2007 à 04:57
14 déc. 2007 à 04:57
Honnêtement je ne vois pas pourquoi ce code ne te supprimerais pas les doublons...
Cela dit, quand je serai chez moi (dans qq heures) je testerai ça et je le corrigerai si il y a des erreurs ;-)
Cela dit, quand je serai chez moi (dans qq heures) je testerai ça et je le corrigerai si il y a des erreurs ;-)
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
6
14 déc. 2007 à 09:44
14 déc. 2007 à 09:44
Merci, c'est tres gentil, je ne voisvraiment pas pourquoi il m'efface certaines lignes vides et certains doublons , mais pas tous....
Mais par contre je pense que ce code n'effacera pas les doublons s'ils sont séparés de plusieurs lignes remplis par d'autres noms de matériaux comme dans l'exemple.
A tout à l'heure ;-)
Mais par contre je pense que ce code n'effacera pas les doublons s'ils sont séparés de plusieurs lignes remplis par d'autres noms de matériaux comme dans l'exemple.
A tout à l'heure ;-)
plastickman
Messages postés
64
Date d'inscription
mercredi 5 décembre 2007
Statut
Membre
Dernière intervention
8 février 2012
6
17 déc. 2007 à 21:01
17 déc. 2007 à 21:01
Je crois que j'ai trouvé une autre solution. merci pour tout.