VBA - Recherchemots et suppression de lignes
Bonjour à tous,
J'ai recherché un code VBA permettant de rechercher des mots dans une liste de cellules et supprimé les lignes contenant uniquement les mots saisies.
J'ai trouvé un code qui me plait bien qui a été fournis par DUBOIS en 2011. Que je remercie.
Ma problématique est mon manque de compétence dans la lecture d'un code VBA avec variable. J'ai pas encore pigé la logique. C'est mieux mais pas encore assez.
Donc j'ai besoin d'un petit coup de main pour adapter le code comme je le voudrai.
Dans le fichier joint vous avez :
- La macro opérationnelle sur la feuille1 avec la macro1. Celle écrite par DUBOIS en 2011.
- Dans mon adaptation, J'ai déplacer la zone de mot dans l'onglet "Paramètre" et je voudrai que cette liste de mots soit appliquer dans l'onglet "Test".
Si une personne pouvais résoudre ce petit souci qui semble finalement bien simple. Et surtout commenter un peu le code afin de comprendre le fonctionnement.
D'avance merci de votre retour constructif et très bonne fin de journée.
Bonjour Franck, bonjour le forum,
Essaie comme ça :
Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Parametres)
Dim T As Worksheet 'déclare la variable T (onglet Test)
Dim TM As Variant 'déclare la variable TM (Tableau des Mots)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Set P = Worksheets("Parametre") 'définit l'onglet P
Set T = Worksheets("Test") 'définit l'onglet T
TM = P.Range("E3:E" & P.Range("E" & Application.Rows.Count).End(xlUp).Row) 'définit le tableau des Mots TM
DL = T.Range("B" & Application.Rows.Count).End(xlUp).Row 'définit la dernière ligne édité DL de la colonne B de l'onglet T
For I = 1 To UBound(TM, 1) 'boucle 1 : sur toules les lignes I du tableau des mots TM (=> sur tous les mots de ce tableau)
For J = DL To 4 Step -1 'boucle 2 : boucle inversée des lignes DL à 4 en remontant
'si la valeur de la cellule ligne J, colonne 2 (=B) de l'onglet T est ágale au mot du tableau ds mots TM, efface la cellule en décalant vers le haut
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUp
Next J 'prochaine ligne de la boucle 2
Next I 'prochain mot de la boucle 1
End SubBonjour Thauthème,
Merci de ton retour.
1) La 1er partie est nickel c'est très claire :
- On déclare les variables en fonction de leur nature :
° 'Worksheet' = onglet,
° 'Variant' = Saisie en cellule,
° 'Integer' = Dernière ligne (????????????????????)
2) Pour le Set je peux dire :
Set P = Worksheets("Parametre") 'affecte pour la variable définit en 'P' l'onglet 'Parametre'
Set T = Worksheets("Test") 'affecte pour la variable définit en 'T' l'onglet 'Test'
3) Application de formule au variable TM et DL : En traduction je peux dire cela ?
TM = P.Range("E3:E" & P.Range("E" & Application.Rows.Count).End(xlUp).Row)
'TM = P.Range = Dim P Worksheet (Mes cellules de saisie : "E3:E" & P.Rang = Set P ("E" = ??????? & Application = Variable Objet saisie depuis la dernière ligne
DL = T.Range("B" & Application.Rows.Count).End(xlUp).Row
'Définit la dernière ligne édité DL de la colonne B de l'onglet T
4) J'ai un petit souci sur les lignes For I=1 et For J = DL. J'ai une erreur. Et j'ai compris le sens du résultat obtenu mais ne je ne connais pas I et J déclaré null part ??? Merci de ton aide.
For I = 1 To UBound(TM, 1) 'boucle 1 : sur toute les les lignes I du tableau des mots TM (=> sur tous les mots de ce tableau)
For J = DL To 4 Step -1
'boucle 2 : boucle inversée des lignes DL à 4 en remontant ????????????????
'si la valeur de la cellule ligne J, colonne 2 (=B) de l'onglet T est égale au mot du tableau des mots TM, efface la cellule en décalant vers le haut ?????????????????????????
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUp
Next J 'prochaine ligne de la boucle 2
Next I 'prochain mot de la boucle 1
Bonne réception.
Cordialement.
Bonjour tout le monde,
Franck222 a écrit :'Integer' = Dernière ligne (????????????????????)
dernière ligne est comme son nom l'indique le N° de la dernière ligne donc un nombre entier positive
TM = P.Range("E3:E" & P.Range("E" & Application.Rows.Count).End(xlUp).Row)
'TM = P.Range = Dim P Worksheet (Mes cellules de saisie : "E3:E" & P.Rang = Set P ("E" = ??????? & Application = Variable Objet saisie depuis la dernière ligne
"E" ici fait référence au nom de colonne et non une variable
4) J'ai un petit souci sur les lignes For I=1 et For J = DL. J'ai une erreur. Et j'ai compris le sens du résultat obtenu mais ne je ne connais pas I et J déclaré null part ??? Merci de ton aide.
pas besoin de déclarer les variable utiliser pour incrémenté dans une boucle " for " ce sont des "integer"
For J = DL To 4 Step -1
'boucle 2 : boucle inversée des lignes DL à 4 en remontant ????????????????
'si la valeur de la cellule ligne J, colonne 2 (=B) de l'onglet T est égale au mot du tableau des mots TM, efface la cellule en décalant vers le haut ?????????????????????????
le step -1 signifie qu'on déincrémente donc on part de la dernière ligne et on remonte petit a petit (a pas de 1 par 1)
Merci de ton retour : c'est très claire.
J'ai juste un message d'erreur (Erreur de compilation : Variable non définie) : Sur I
For I = 1 To UBound(TM, 1) 'boucle 1 : sur toules les lignes I du tableau des mots TM (=> sur tous les mots de ce tableau)
For J = DL To 4 Step -1 'boucle 2 : boucle inversée des lignes DL à 4 en remontant
'si la valeur de la cellule ligne J, colonne 2 (=B) de l'onglet T est ágale au mot du tableau ds mots TM, efface la cellule en décalant vers le haut
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUp
Next J 'prochaine ligne de la boucle 2
Next I 'prochain mot de la boucle 1l'erreur s'affiche sur
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUp ???
je pense l'erreur viens du dépassement de limite du tableau "TM" a cause de l'instruction "TM(I, 1)" et non du variable "I" qui est inconnu. comme je ne suis pas très doué avec les tableau de dimention >1 alors je ne prononcerai pas il faudra voire sa avec notre chère ThauThème qui devrai vous donnée plus de détail que moi
Bonjour le fil, bonjour le forum,
Tout d'abord grand merci à Minanse pour avoir pris le relai avec de longues explications.
Ensuite, si tu utilises Option Explicit, tu avais raison, je navet (dans ce cas on peux l'écrire comme ça) pas déclaré les variables I et J, qui, avec cette option, doivent obligatoirement être déclarées.
Si ton tableau est très grand (plus de 32 000 lignes) utilise le type Long pour DL et J et Integer pour I sinon, Integer pour les trois DL, I, et J :
Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Parametres)
Dim T As Worksheet 'déclare la variable T (onglet Test)
Dim TM As Variant 'déclare la variable TM (Tableau des Mots)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Set P = Worksheets("Parametre") 'définit l'onglet P
Set T = Worksheets("Test") 'définit l'onglet T
TM = P.Range("E3:E" & P.Range("E" & Application.Rows.Count).End(xlUp).Row) 'définit le tableau des Mots TM
DL = T.Range("B" & Application.Rows.Count).End(xlUp).Row 'définit la dernière ligne édité DL de la colonne B de l'onglet T
For I = 1 To UBound(TM, 1) 'boucle 1 : sur toules les lignes I du tableau des mots TM (=> sur tous les mots de ce tableau)
For J = DL To 4 Step -1 'boucle 2 : boucle inversée des lignes DL à 4 en remontant
'si la valeur de la cellule ligne J, colonne 2 (=B) de l'onglet T est ágale au mot du tableau ds mots TM, efface la cellule en décalant vers le haut
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUp
Next J 'prochaine ligne de la boucle 2
Next I 'prochain mot de la boucle 1
End SubC'est nickel les gars Merci beaucoup.
Juste un petit complément : Je ne parviens à supprimer la ligne complète juste la cellule trouvé.
J'ai essayé d'ajouter 'Rows' devant .Delete Shift:=xlUp mais rien n'y fait.
Un dernier coup pouce.
Bonjour le fil, bonjour le forum,
Pour la ligne complète remplace la ligne de code :
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).Delete shift:=xlShiftUppar :
If T.Cells(J, 2).Value = TM(I, 1) Then T.Cells(J, 2).EntireRow.DeleteLe VBA c'est fantastique
Un grand merci à Thauthème, Minanse.
Comment je fais pour indiquer Résolu ?