Forum Clubic

VBA - Rechercher une ligne dans un tableau avec 3 critères et la supprimer

Bonjour à tous.

Je débute depuis 2 mois sur un programme de facturation sous excel/VBA, et je solicite votre aide car je bloque sur une fonction. cela fait des heures et des heures que je cherche, mais je ne trouve pas :frowning: Je m’explique:

J’ai un tableau de 10 colonnes et 10000 lignes. La pluspart sont encore vides. Je souhaiterais chercher les lignes correspondantes aux 3 critères de recherche mis en variables et les supprimer.

exemple:

critère1 = “Laurent” critère2 = “2011” critère3 = “payé”


|              A              |                      B                      |                       C                     |
||||
|
|||
||||
|
|||
||||
|
|||

SI A = critère1 ET B = critère2 ET C = critère 3 ==> on supprime la ligne.

De plus, toutes mes lignes remplies sont regroupées en haut, donc si A devient vide, on arrete la boucle
(pour ne pas perdre de temps avec les lignes vides.)

En vous remerciant milles fois par avance!

Laurent
Message edité le 19/07/2011 à 04:11

Bonjour,

As-tu essayé avec un filtre automatique ?

L’idée serait d’appliquer un filtre automatique, avec le premier critère, dans la colonne concernée, puis faire en suite de même pour les deux autres critères. Ainsi il ne devrait plus rester affichées que les lignes correspondant chacune aux trois critères à la fois.
En suite supprimer les lignes visibles (donc celles correspondant aux trois critères à la fois).
Et enfin, supprimer tout filtrage automatique.

Ca pourrait donner un truc dans ce genre :

Sheets(“NomFeuille”).Range("$A$2:$J$10001").AutoFilter Field:=ColonneCritere1, Criteria1:=Critere1
Sheets(“NomFeuille”).Range("$A$2:$J$10001").AutoFilter Field:=ColonneCritere2, Criteria1:=Critere2
Sheets(“NomFeuille”).Range("$A$2:$J$10001").AutoFilter Field:=ColonneCritere3, Criteria1:=Critere3

Sheets(“NomFeuille”).Range("$A$2:$J$10001").SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp

Sheets(“NomFeuille”).Range(.AutoFilter.Range.Address).AutoFilter

Remplacer NomFeuille par le nom de la feuille contenant le tableau.
Remplacer ColonneCritere1 par le numéro de la colonne concernée.
Remplacer Critere1 par le critère correspondant, soit directement sous forme d’une chaîne de caractères, soit par une variable contenant le contenu d’un cellule contenant le critère sous forme de chaîne de caractères, soit encore par l’adresse d’une cellule contenant le critère sous forme de chaîne de caractères.

PS : je ne suis pas certain de la valeur à donner au Range (en rouge).
Edité le 19/07/2011 à 04:01

tu tiens absolument à le faire par fonction (VBA)?
En excel simple, tu as la commande filtre automatique qui te permet de réaliser cette fonction en quelques clics.
Au pire, tu fais générer ton filtre et l’effacement associé par une fonction VBA

cela fonctionne! merci pour le tuyau des filtres! :slight_smile:

Content pour toi que ça fonctionne

Jacky67 ->
Je devais être mal réveillé ce matin, je n’avais pas vu que tu avais déjà donné la solution, et en plus avec tout le détail de la marche à suivre…
Par contre, au niveau de l’effacement, là tu ne dois supprimer que les cellules de la partie “tableau” concernée, et non les lignes entières correspondantes comme demandé.

Salut gcc :hello:

Je n’ai pas testé dans cet exemple précis, mais j’ai repris et modifié un bout de code que j’ai créé pour un fichier au boulot où je dois supprimer des lignes d’un tableau.
Je pense que ça fonctionne (ça supprime bien les lignes complètes), à condition peut-être de donner la bonne valeur pour le Range en rouge.

Ce Range peut aussi se calculer :

  • On connait les colonnes gauche et droite du tableau, elles ne changent pas.
  • On connait la ligne d’en-tête du tableau, elle ne change pas.
  • Il n’y a donc que la dernière ligne qui change en fonction du filtrage appliqué. Il est vrai qu’il serait sans doute préférable de la calculer plutôt que de laisser toujours le même Range comme dans mon bout decode donné ci-dessus, mais ce n’était qu’un début de piste de recherche. :wink:

Je profite de cette réponse pour préciser que la méthode des ficltres automatiques est beaucoup plus rapide qu’une boucle FOR…NEXT qui était bien trop lente.