Non fiabilité d'une méthode VBA de suppression des doublons [Résolu]

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2010 à 09:33 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 26 janv. 2010 à 09:43
Bonjour,

1) Ma version d'Excel : 2007

2) la découverte :

Une méthode proposée par VBA/Excel pour supprimer les doublons d'une plage n'est pas fiable (ou est boguée).
Elle ne fonctionne sans faille que si la 1ère cellule de la plage concernée n'est pas elle-même un doublon. Dans le cas contraire : le doublon correspondant demeure

Démo :
un projet vierge et sur Feuil1 : un boyuton de commande
Code :

Private Sub CommandButton1_Click()
  'faites l'expérience avec chacun des deux toto ci-dessous (en mettant en commentaires celui non utilisé)
  ' la 1ère cellule n'est ici pas elle-même un doublon ===>> tout va bien se passer
  toto = Array("x", "a", "c", "b", "b", "c", "a")
  ' la 1ère cellule est elle-même un doublon ===>> le doublon restera
  'toto = Array("c", "a", "c", "b", "b", "c", "a")
  For i = 0 To UBound(toto)
    Range("A" & i + 1).Value = toto(i)
    Range("B" & i + 1).Value = i + 1
  Next
  MsgBox "on va maintenant traiter les doublons"
   Range("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
  
   'ce qui suit est encore une autre "affaire" :
   ' VBA ne détruit pas (comme on pourrait s'y attendre", les doublons ! il se contente de masquer les lignes !
   ' il nous faut donc rétablir nous-mêmes la situation ...
   Dim c As Range, cunion As Range
    For Each c In UsedRange.Rows
    If c.Hidden = True Then
       If cunion Is Nothing Then
         Set cunion = c
       Else
         Set cunion = Application.Union(c, cunion)
       End If
     End If
   Next c
   If Not cunion Is Nothing Then
     cunion.EntireRow.Delete
   End If
End Sub


on voit bien ce qui se passe dans le cas d'un toto ou de l'autre :
Dans le cas du 1er toto (dont "x" n'est pas lui-même un doublon) ===>> parfait
Dans le cas du second toto (dont la 1ère valeur "c" est elle-même un doublon) ===>>> Badaboum !

NB : ce n'est pas pour rien que j'ai mis les rangs dans la colonne "B" ===>> Elle me permettra, après vos essais sur votre version, de revenir sur un autre sujet que j'"avais ouvert en ce qui concerne la transposition, par VBA, des plages en tableaux dynamiques, ceci (cette manière de faire) pouvant peut-être expliquer cela (notre constatation/bug)..

J'aimerais connaître les résultats de ce test sur d'autres versions.
Merci d'avance.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 21 janv. 2010 à 10:24
3
Merci
Salut Jaques,

si tu vas voir ce snippet que j'ai posté il y à quelque temps et qui utilise la même methode, tu veras en commentaire dans le code:

' le filtre élaboré a besoin d'une colonne de donnée avec etiquette
' donc pour ne pas mettre cette etiquette dans la liste on se décale d'une ligne vers le bas


si tu ne respects pas cette regle la premire valeur sera considérée comme l'étiquette.

dans ton cas il faudrait faire comme ceci:

Sub Exemple()
' maintenant cela fonctionne dans tout les cas
'toto = Array("x", "a", "c", "b", "b", "c", "a")
toto = Array("c", "a", "c", "b", "b", "c", "a")
Range("A1").Value = "Ma liste"
For i = 2 To UBound(toto) + 2
Range("A" & i).Value = toto(i - 2)
Range("B" & i).Value = i - 1
Next
MsgBox "on va maintenant traiter les doublons"
Range("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True

'ce qui suit est encore une autre "affaire" :
' VBA ne détruit pas (comme on pourrait s'y attendre", les doublons ! il se contente de masquer les lignes !
' il nous faut donc rétablir nous-mêmes la situation ...
Dim c As Range, cunion As Range
For Each c In ActiveSheet.UsedRange.Rows
If c.Hidden = True Then
If cunion Is Nothing Then
Set cunion = c
Else
Set cunion = Application.Union(c, cunion)
End If
End If
Next c
If Not cunion Is Nothing Then
cunion.EntireRow.Delete
End If
End Sub

A+

Merci bigfish_le vrai 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de bigfish_le vrai
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 janv. 2010 à 10:20
0
Merci
sacrément merdique, faut le dire !
il s'attend sûrement a avoir une entete de colonne

mais ne donnée pas de moyen de lui dire que non !

(Excel 2002)

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 janv. 2010 à 10:21
0
Merci
support.microsoft.com/kb/262277

Remarques

Si le premier enregistrement des données d'origine est en double, il apparaît deux fois dans la nouvelle liste. Masquez simplement la première ligne.

Si vous exécutez la commande Filtre élaboré sur place, la feuille contient encore tous les enregistrements. Les enregistrements doubles sont masqués. Pour contourner ce problème, pointez sur Lignes dans le menu Format, puis cliquez sur Afficher.


quels branques !

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Commenter la réponse de Renfield
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 21 janv. 2010 à 10:26
0
Merci
re, en plus lisible
Sub Exemple()
  ' maintenant cela fonctionne dans tout les cas 
  'toto = Array("x", "a", "c", "b", "b", "c", "a")
  toto = Array("c", "a", "c", "b", "b", "c", "a")
  Range("A1").Value = "Ma liste"
  For i = 2 To UBound(toto) + 2
    Range("A" & i).Value = toto(i - 2)
    Range("B" & i).Value = i - 1
  Next
  MsgBox "on va maintenant traiter les doublons"
   Range("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
  
   'ce qui suit est encore une autre "affaire" :
   ' VBA ne détruit pas (comme on pourrait s'y attendre", les doublons ! il se contente de masquer les lignes !
   ' il nous faut donc rétablir nous-mêmes la situation ...
   Dim c As Range, cunion As Range
    For Each c In ActiveSheet.UsedRange.Rows
    If c.Hidden = True Then
       If cunion Is Nothing Then
         Set cunion = c
       Else
         Set cunion = Application.Union(c, cunion)
       End If
     End If
   Next c
   If Not cunion Is Nothing Then
     cunion.EntireRow.Delete
   End If
End Sub
Commenter la réponse de bigfish_le vrai
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 21 janv. 2010 à 10:34
0
Merci
Ah oui ! et le lien sur le snippet :

[ http://www.codyx.org/snippet_supprimer-doublons-combobox_374.aspx]

pas encore réveillé !
Commenter la réponse de bigfish_le vrai
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2010 à 13:03
0
Merci
Bonjour, bigfish_le vrai

Tu as là donné une solution pour "réparer" ....
Il n'en reste pas moins vrai que :
- L'aide en ligne ne mentionne nulle part cette nécessité "réductrice" d'utiliser un entête.
- Il n'est pas normal de forcer à utiliser un entête pour supprimer des doublons.
- ta solution est bonne, mais quid si l'on ne veut pas d'entête ? Il y en a d'autres, bien évidemment, parmi lesquelles celle-ci, par exemple :
Ajouter ces lignes de code juste avant le End Sub :

  Dim couic As Range
   Set couic = Range("A:A").Find(Range("A1").Value, LookIn:=xlValues)
     If Not couic Is Nothing Then
     couic.EntireRow.Delete
   End If
   Set couic = Nothing


Mais rien de ceci (ni ta solution d'ajouter un entête, ni la mienne de "réparer" lorsque l'on ne veut pas d'entête) n'est vraiment totalement "acceptable" et justifierait la carence de la méthode VBA. Cela reste désolant, d'en arriver à devoir contourner une carence.
Amitiés


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2010 à 14:57
0
Merci
Et surtout (la voilà ,la question) : pourquoi faire une telle manoeuvre :
- forcer à un entête
- remplir en dessous de l'entête
- mais reprendre entête incluse pour oter les doublons !
Que pourrait justifier l'imposition d'une telle gymnastique ?


Mon impression personnelle (mais ce n'est qu'une impression) et c'est la raison pour laquelle j'avais mis des rangs dans la colonne B (pour y voir clair) :
- Cette méthode de VBA constitue une liste (un tableau, vraisemblablement) commençant à l'indice 0 (et non 1)
- l'enlèvement des doublons se fait par recensement, du haut vers le bas, des cellules de même valeur que l'indice en cours, dans une boucle. Ces cellules sont mises en mémoire (genre Union)
- malheureusement( (force de l'habitude VBA ?), le traitement se fait de haut en bas en commençant par l'indice 1 (comme cela parait apparemment l'habitude ches VBA) et non l'indice 0 (comme semble être celui de la "liste" dressée). L'indice 0 (la toute 1ère cellule) échapperait de ce fait au traitement par la méthode
- in fine, la méthode semble supprimer (en fait masquer seulement, comme nous l'avons vu) les ranges de l' "Union", union qui ne peut commencer qu'à la 3ème cellule (d'indice 2 si l'on admet le principe d'une liste dont le 1er élément est 0) et non de la deuxième cellule (d'indice 1 dans le même esprit). En rappelant que la toute 1ère cellule (d'indice 0 dans le même esprit) est par vdéfinition écartée de la liste des doublons.
Ce n'est là qu'une hypothèse, mais elle paraît fort vraisemblable
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2010 à 15:04
0
Merci
J'ajoute ceci : imaginons que Microsoft "répare" unh jour cette carence ...
Imaginons maintenant une colonne avec un "entête ajouté" pour faire face
Imaginons que, par malheur, une ou plusieurs cellule(s) de la colonne contienne(nt) la même valeur que l'entête (vous me suivez ?) ...
Comme ensuite ta méthode (BigFish) inclut l'entête, ce corrigé de VBA supprimerait toutes les cellules contenant la même valeur que l'entête ! Resterait à prier alors (si on a appliqué ta méthode) pour que Microsoft "laisse ce bug en paix" (ne le corrige jamais)
C'est là une affaire qui promet ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 21 janv. 2010 à 22:39
0
Merci
Bon...
Quoi qu'il en soit, voici une procédure que je viens de mettre en place pour ce faire en dépit du mauvais tour joué par la méthode Microsoft en question :

Private Sub supp_doublons(colonne As Range, ligne1 As Integer, ligne2 As Integer)
    Application.ScreenUpdating = False
    Rows(ligne1).Insert Shift:=xlUp
    Cells(ligne1, colonne.Address).Value = Chr(0)
    Range(Cells(ligne1, colonne.Column), Cells(ligne2 + 1, colonne.Column)).AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    Dim c As Range, couic As Range
    For Each c In Range(Cells(ligne1, colonne.Column), Cells(ligne2 + 1, colonne.Column)).Rows
      If c.Hidden = True Then
        If couic Is Nothing Then Set couic c Else Set couic Application.Union(couic, c)
      End If
    Next c
    couic.EntireRow.Delete
    Cells(ligne1, colonne.Column).EntireRow.Delete
    Application.ScreenUpdating = True
End Sub


Elle est appelable ainsi :
'supp_doublons Columns("B"), 6, 12
'ou, à son gré
supp_doublons Columns(2), 6, 12


où le premier paramètre définit la colonne, le 2ème la ligne de démarrage et le 3ème la ligne de fin du traitement
Il s'agit bien ici de la plage à traiter, sans se préoccuper de header ou non. De surcroît : on peut même choisir une portion de colonne ne commençant pas forcément à la ligne1 (flexibilité totale, donc).

A bigfish_le vrai : comme j'ai déjà eu l'occasion de le dire, je n'en suis qu'aux balbutiements en matière de VBA/Excel.
Je compte sur toi pour mettre du tien (en l'allégeant où en améliorant les performances partout où réalisable dans ce code). Tu me parais tout désigné pour accomplir cette tâche importante (tu as déjà déposé une source à ce propos) puis, cette tâche étant réalisée, pour déposer (à ton nom, of course) une source complémentaire ...
Je compte sur toi, ami. (pardonne ce cadeau empoisonné, mais je vois mal le bleu que je suis en VBA le faire poi-même).
Amitiés.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 janv. 2010 à 08:18
0
Merci
petite correction (importante si pas de doublons) et petit allègement

Private Sub supp_doublons(colonne As Range, ligne1 As Integer, ligne2 As Integer)
    Dim c As Range, zone As Range, couic As Range
    Application.ScreenUpdating = False
    Rows(ligne1).Insert Shift:=xlUp
    Cells(ligne1, colonne.Address).Value = Chr(0)
    Set zone = Range(Cells(ligne1, colonne.Column), Cells(ligne2 + 1, colonne.Column))
    zone.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    For Each c In zone.Rows
      If c.Hidden = True Then
        If couic Is Nothing Then Set couic c Else Set couic Application.Union(couic, c)
      End If
    Next c
    If Not couic Is Nothing Then couic.EntireRow.Delete
    Cells(ligne1, colonne.Column).EntireRow.Delete
    Set zone Nothing: Set couic Nothing
    Application.ScreenUpdating = True
End Sub



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 22 janv. 2010 à 17:22
0
Merci
En réalité, j'en suis déjà à une autre étape, car même le résultat de mon code ne me satisfait pas entièrement.
Expliquons-nous donc :
- on commence par l'inventaire des reproches à la méthode microsoft, telle qu'elle est :

1) elle ne fonctionne sans gymnastique additionnelle que si header ! ===>> déjà réglé autrement
2) elle masque les lignes au lieu de les effacer !
- elle suggère ensuite de .... réafficher les lignes masquées (notamment si par "sur place", - voir le lien de Renfield) ==>> hé bé ! ils se foutent littéralement du monde ! Quid si certaines lignes sont déjà masquées avant traitement ? en réaffichant toutes les lignes masquées, on réaffiche également celles qui ne devraient pas l'être ! Microsoft va-t-il, en plus, demander une autre intervention pour les masquer à nouveau ? C'est littéralement incroyabe ... un vrai foutage de gueule !
- on a réglé (monh code plus haut) le problème de l'effacement au lieu de la suppression, mais cet effacement, tel que fait, efface également les lignes masquées d'origine !
etc...

Bref : ce qu'il faut, c'est une procédure qui :
- permette de décider de supprimer ou de masquer (aparamètre), au choix du développeur
- si choix "supprimer" ===>> supprimer réellement tous les doublons, masqués où non, mais laisser masquées les lignes qui, masquées avant traitement, ne contiennent pas de doublons !
- si choix "masquer simplement" : masquer les doublons (sur lignes originelles masquées ou nbon) sans "démasquer" les lignes qui l'étaient avant traitement.

Rien que çà !
Bon... je pense y parvenir (à toute cette acrobatie) ce soir-même et reviens dans ce laps de temps avec une nouvelle procédure.
A BigFish : ce que j'ai dit plus haut restrera parfaitement valable (perfectionnement éventuel et dépôt)
Aux autres : on va avoir besoin de "gratteurs" pour faire des essais divers et vériés et vérifier l'absence totale de bugs.
A ce soir...


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 23 janv. 2010 à 11:55
0
Merci
Bon..

j'ai tout fini et ça tourne bien, avec toutes les options de traitement prévues par mon précédent message
Si BigFish ne réagit pas (j'aurais préféré les améliorations d'un meilleur connaisseur que moi en VBA/Excel), je vais déposer moi-même (avec toutes les explications d'utilisation) la source correspondante de la procédure finale (dont j'ai simplifié l'appel.

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 23 janv. 2010 à 17:11
0
Merci
Source et explications déposées à l'instant.
Sujet terminé en ce qui me concerne.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
[color=red]Cliquer sur "Réponse acceptée" (en bas d'une solu
Commenter la réponse de ucfoutu
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 25 janv. 2010 à 11:31
0
Merci
Salut,

désolé de ne pas t'avoir répondu plutot, mais je n'ai pas été tres disponible ces dernier temps.

Apparemment tu t'en n'es bien sortie sans moi. Je ne crois pas avoir de valeur ajouté à ta résolution du probleme.

Par contre voici une copie de l'aide excel2003(pas du VBA!) sur le sujet:

Filtrer à l'aide de critères élaborés
Insérez, au-dessus de la plage, au moins trois lignes vides qui peuvent être utilisées comme plage de critères. Cette plage doit posséder des étiquettes de colonne. Veillez à laisser au moins une ligne vide entre les valeurs des critères et la plage.
Exemple de présentation de ces éléments

Type Vendeur Ventes



Type Vendeur Ventes
Boissons Suyama 5 122
Viande Bartoli 450
Produit Beaune 6 328
Produit Bartoli 6 544

Dans les lignes situées sous les étiquettes de colonne, entrez les critères de comparaison.
Exemples de critères

Plusieurs conditions dans une seule colonne

Si vous voulez appliquer au moins deux conditions à une seule colonne, tapez les critères directement les uns en dessous des autres dans des lignes distinctes. Par exemple, la plage de critères suivante affiche les lignes qui contiennent « Bartoli », « Beaune » ou « Suyama » dans la colonne Vendeur.

Vendeur
Bartoli
Beaune
Suyama

Une condition dans deux colonnes ou davantage

Pour rechercher des données qui remplissent une condition dans plusieurs colonnes, tapez tous les critères dans la même ligne de la plage de critères. Par exemple, la plage de critères suivante affiche toutes les lignes qui contiennent « Produit » dans la colonne Type, « Bartoli » dans la colonne Vendeur et un montant de ventes supérieur à 1 000 euros.

Type Vendeur Ventes
Produit Bartoli >1 000

Une condition dans une colonne ou dans une autre

Pour rechercher des données qui remplissent soit une condition dans une colonne, soit une condition dans une autre colonne, tapez les critères dans des lignes différentes de la plage de critères. Par exemple, la plage de critères suivante affiche toutes les lignes qui contiennent soit « Produit » dans la colonne Type, soit « Bartoli » dans la colonne Vendeur, soit un montant de ventes supérieur à 1 000 euros.

Type Vendeur Ventes
Produit
Bartoli
>1 000

Un des deux jeux de conditions pour deux colonnes

Pour rechercher des lignes qui remplissent un des deux jeux de conditions, comprenant chacun des conditions pour plusieurs colonnes, tapez les critères dans des lignes distinctes. Par exemple, la plage de critères suivante affiche les lignes qui contiennent à la fois « Bartoli » dans la colonne Vendeur et un montant de ventes supérieur à 3 000 euros, et celles qui affichent « Beaune » dans la colonne Vendeur et un montant de ventes supérieur à 1 500 euros.

Vendeur Ventes
Bartoli >3 000
Beaune >1 500

Plus de deux jeux de conditions pour une colonne

Pour rechercher des lignes qui remplissent plus de deux jeux de conditions, incluez plusieurs colonnes ayant le même en-tête de colonne. Par exemple, la plage de critères suivante affiche les ventes comprises entre 5 000 et 8 000 en plus de celles qui sont inférieures à 500.

Ventes Ventes
>5 000 <8 000
<500

Conditions créées par le calcul d'une formule

Vous pouvez utiliser comme critère une valeur calculée par une formule. Dans ce cas, n'utilisez pas une étiquette de colonne comme étiquette de critère. Conservez l'étiquette de critère vide ou utilisez une étiquette qui ne soit pas une étiquette de colonne de la plage. Par exemple, la plage de critères suivante affiche les lignes dont la valeur contenue dans la colonne C est supérieure à la moyenne des cellules C7:C10.


=C7>MOYENNE($C$7:$C$10)

Remarques

La formule que vous utilisez pour une condition doit faire appel à une référence relative pour faire référence à l'étiquette de colonne (par exemple, Ventes) ou au champ correspondant dans le premier enregistrement. Toutes les autres références au sein de la formule doivent être des références absolues, et la formule doit prendre la valeur VRAI ou FAUX. Dans l'exemple de formule, « C7 » fait référence au champ (colonne C) pour le premier enregistrement (ligne 7) de la plage.
Vous pouvez utiliser une étiquette de colonne dans la formule au lieu d'une référence de cellule relative ou d'un nom de plage. Si Microsoft Excel affiche une erreur de valeur telle que #NOM? ou #VALEUR! dans la cellule qui contient le critère, ignorez ce message, car il est sans conséquence sur les modalités de filtrage de la plage.
Lors de l'évaluation de données, Microsoft Excel ne distingue pas les majuscules des minuscules.
Tous les éléments commençant par ce texte sont filtrés. Par exemple, si vous tapez le texte Dav comme critère, Microsoft Excel trouve « David » et « Davis ». Pour rechercher uniquement le texte spécifié, tapez la formule suivante, où texte correspond au texte recherché : =''=texte''

Pour rechercher des valeurs de texte qui contiennent certains caractères mais pas d'autres, utilisez un caractère générique.

Caractères génériques

Les caractères génériques suivants peuvent être utilisés comme critères de comparaison pour des filtres, ainsi que lors de la recherche et du remplacement d'un contenu.

Utilisez Pour rechercher
? (point d'interrogation) un seul caractère
Par exemple, p?rt trouve « port » et « part ».
* (astérisque) un nombre quelconque de caractères
Par exemple, *Est trouve « Nord-Est » et « Sud-Est ».
~ (tilde) suivi de ?, *, ou ~ un point d'interrogation, un astérisque ou un tilde
Par exemple, fy91~? trouve « fy91? ».

Cliquez sur une cellule de la plage.
Dans le menu Données, pointez sur Filtrer, puis sur Filtre avancé.
Pour filtrer la plage en masquant les lignes qui ne remplissent pas les critères, cliquez sur l'option Filtrer la liste sur place.
Pour filtrer la plage en copiant dans un autre emplacement de la feuille de calcul les lignes qui correspondent aux critères, cliquez sur l'option Copier vers un autre emplacement, cliquez dans la zone Destination, puis sur l'angle supérieur gauche de la zone dans laquelle vous souhaitez coller les lignes.

Dans la zone Zone de critères, tapez la référence de la plage de critères, y compris les étiquettes de critère.
Pour déplacer temporairement la boîte de dialogue Filtre avancé pendant que vous sélectionnez la plage de critères, cliquez sur Réduire la boîte de dialogue .

Pour modifier la manière dont les données sont filtrées, modifiez les valeurs de la zone de critères, puis recommencez le filtrage des données.

Conseils

Vous pouvez nommer une plage Critères et afficher ainsi automatiquement la référence à la plage dans la zone Zone de critères. Vous pouvez aussi spécifier le nom Base de données pour la plage de données à filtrer, et le nom Extraire pour la plage dans laquelle vous souhaitez coller les lignes. Ces plages apparaîtront alors automatiquement dans les zones Plage et Destination.
Quand vous copiez des lignes filtrées vers un autre emplacement, vous pouvez spécifier les colonnes à inclure dans la copie. Avant de procéder au filtrage, copiez les étiquettes des colonnes souhaitées vers la première ligne de la zone dans laquelle vous envisagez de coller les lignes filtrées. Lors du filtrage, saisissez une référence aux étiquettes de colonne copiées dans la zone Destination. Les lignes copiées incluront alors uniquement les colonnes dont vous avez copié les étiquettes.


J'ajouterais que les étiquettes font parties intégrante de la philosophie d'excel. Il y à beaucoup de methodes qui utilisent les étiquettes comme par exemple : les tableaux Croisé dynamique

Amicalement

Philippe
Commenter la réponse de bigfish_le vrai
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 25 janv. 2010 à 13:06
0
Merci
Merci, Philippe (je me doutais bien que tu avais des empêchements)...

Les explications de Microsoft ne me convainquent absolument pas et je maintiens donc la source déposée.

Si tu y as jeté un coup d'oeil et que te viennent des idées d'oiptimisation, n'hésite pas à les exposer (en commentaires de la source) avant que (j'attends une semaine) que je ne rende ma procédure plus polyvalente (en l'étendant à sa méthode "par copie"). Merci d'avance
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 26 janv. 2010 à 09:43
0
Merci
Re coucou,

Je préfère commenter ICI les curieuses réactions de la méthode incriminée plutôt que de polluer les commentaires de la source que j'ai déposée (et que je vais compléter).

Si l'on utilise la méthode "par copie" d'une feuille à l'autre : aucun problème si les colonnes de la feuille d'accueil de sont pas dotées elles-mêmes de headers.
Mais voilà : quid si l'utilisateur veut passer des données sans doublons des colonnes concernées de feuille1 vers feuille2, où, pour y voir clair : il a prévu les mêmes headers ?

Faites donc l'expérience ! vous allez être surpris ! (et ce : quoi que vous tentiez de faire ) !

Alors oui et sans aucun doute : si l'on ne veut pas utiliser le mot bug, utilisons celui d'inconscience totale
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Commenter la réponse de ucfoutu

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.