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
Bonjour à tous,
Je ne sais pas si le titre de mon message est très clair, mais je vais essayer de m'expliquer:

J'ai une colonne avec différents remplissages et des vides. (A1:A20)
Je cherche une macro qui me permettrait de masquer les cellules vides et celles qui ont le même remplissage qu'une autre en amont
(plus simplement, le but est de ne pas avoir deux fois le même remplissage dans deux cellules de la colonne).

Merci de votre aide,
A voir également:

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
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
0
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
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+
0
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
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.
0
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
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
0

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
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 ^^
0
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
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
0
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
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 ;-)
0
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
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 ;-)
0
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
Je crois que j'ai trouvé une autre solution. merci pour tout.
0