Supprimer une ligne dans une autre feuille

Résolu
Signaler
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Bonjour à tous,

Une feuille nommée XX contient la valeur XX en A3.
Une feuille "Sommaire" contient la valeur liée XX "quelque part" dans sa colonne A :
     par exemple  en A125 de Sommaire on a   = XX!A3
Depuis la feuille "Sommaire" une macro me permet de supprimer la feuille XX et effacer les formules de la ligne 125.

Code :
Private Sub SupprimerFiche_Click() ' Dans la feuille Sommaire (seule feuille affichée)
f = ActiveCell.Value ' sélection en colonne A du nom correspondant à la feuille à supprimer
Worksheets(Sheets(f).Name).Visible = True ' Affichage de la feuille à supprimer précédemment cachée.
Worksheets(Sheets(f).Name).Select ' Sélection de la feuille à supprimer
ActiveWindow.SelectedSheets.Delete ' suppression (on repasse dans Sommaire)
R = ActiveCell.Row ' On récupère le N° de ligne...
Rows(R).Select ' On le sélectionne...
Selection.ClearContents ' On efface

End Sub

Mais je n'ai pas réussi à trouver le mode inverse, c'est à dire depuis la feuille XX, trouver la ligne liée dans "Sommaire" et l'effacer, puis supprimer la feuille XX et revenir au Sommaire...

Comment chercher et sélectionner dans la feuille Sommaire la ligne où est la valeur "toto" en colonne A puis effacer la ligne ?

J'ai essayé ceci sans succès (mauvaise syntaxe après Else...)

Private Sub SupprimeFiche_Click() ' Dans l'unique feuille affichée (XX="toto") avec A3 (="toto") sélectionné par défaut

Range("A3").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sommaire").Visible = True  ' Affiche le feuille Sommaire pérédemment cachée
Sheets("Sommaire").Select ' Sélectionne la feuille Sommaire
Range("AB2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'copie la valeur XX!A3 en AB2 
s = Range("AB1").Value
' valeur renvoyée en AB1 par RECHERCHEV de la valeur en AB2 dans la colonne A
If s = "N" Then
Doublon.Show

Else
    X = Columns(1).Find(s).Row'
Pour donner le numéro de la ligne présentant la valeur de AB2 en colonne A ?
    Rows(X).Select 'sélectionne la ligne en question
   Selection.ClearContents ' la supprine
   Sheets("Sommaire").Visible = False ' Cache la feuille Sommaire (on revient dans la feuille "toto" qui devient active)

   Sheets("Sommaire").Visible = True
' On reste dans la feuille "toto" et on affiche la feuille Sommaire
   ActiveWindow.SelectedSheets.Delete ' suppression de la feuille "toto" (on repasse dans Sommaire)

End If
End Sub

Merci pour une aide très attendue.

"Ce qui est terrible, c'est que quand on vous la donne, la solution est souvent honteusement simple, et d'autant plus simple qu'on l'a souvent cherchée longtemps, ce qui est pire."                              
                                                                                                                                    Mon Prof de Math

18 réponses

Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Ben voilà !!!!!!!!!!!   

Je résume ces 12 échanges aussi passionants que fructueux avec le BON code final

Private Sub SupFeuille_Click()
'Supprimer la feuille "Toto" sélectionnée + sa ligne de report au Sommaire DEPUIS la feuille "Toto" seule affichée et active

ActiveSheet.Unprotect 
' Feuille "Toto" déprotégée
Sheets("Sommaire").Visible = True 
' Feuille "Sommaire" cachée rendue visible (onglet grisé)
    Dim Recherche
As Range
    Set Recherche = Sheets("Sommaire").Columns("A:B").Find(Range("A3:B3").Value, LookIn:=xlValues, LookAt:=xlWhole)
        
' Parce que dans la feuille "Sommaire" les cellules des colonnes A et B sont fusionnées
        ' cherche une ligne (i) dans "Sommaire" dont la valeur en colonne A:B est celle de A3:B3 dans "Toto"
        If Not Recherche Is Nothing Then
'si la recherche a abouti  (car il existe bien une ligne (i) dans "Sommaire" dont la valeur en colonne A:B est celle de A3:B3 dans "Toto") :
        Sheets("Sommaire").Unprotect  ' Feuille "Sommaire" déprotégée
        Sheets("Sommaire").Rows(Recherche.Row).ClearContents
'sélectionne la ligne d'index "Recherche" trouvée dans "Sommaire"et l'efface
        Application.DisplayAlerts = False 'n'affiche pas le warning de confirmation de suppression
        ActiveSheet.Delete 'supprime la feuille "Toto" (on revient dans "Sommaire")
        Else
            MsgBox "Introuvable dans le Sommaire" 'message d'erreur si la recherche n'abouti pas
        End If
End Sub

Merci encore : Un Ban pour la patience et l'efficacité de Mpi siouplaît !!!
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut,

Je ne vois pas l'intérêt à mettre du code dans une feuille qu'on va effacer ... Peux-tu expliquer un peu ?

Pour rechercher la formule dansune cellule plutôt que la valeur inscrite par cette formule, utilise Find avec xlFormulas plutôt que xlValues. Sachant que tu es dans la feuille XX, tu peux donc rechercher la formule = XX!A3 en utilisant le nom de la feuille sur laquelle tu te trouves Activesheet.name

Mais je ne vois toujours pas l'intérêt et je me demande même si ça ne risque pas de crasher si tu effaces la feuille dans laquelle le code est présent et en train de rouler... (?)

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut MPI,

Désolé du retard, je viens seulement de pouvoir me reconnecter.

Mon appli gère des devis dont les éléments essentiels sont remonté dans une feuille "Sommaire". Chaque ligne comporte en tête (colonne A) le N° du Devis, il "remonte" par liaison avec une feuille dont le nom est le même que le N° du Devis (en case A3 sur la feuille Devis.
Pour une facilité de lisibilité par l'utilisateur, une seule feuille est affichée (et donc active) à la fois.
Quand on veut supprimer un Devis, pas de problème depuis la feuille Sommaire : Après sélection de A(i) ="x" au Sommaire, la macro supprime d'abord la feuille "x" (A(i)=#REF) ; puis la ligne (i).

En revanche, si on a d'abord voulu vérifier plus en détail le devis avant de le supprimer, c'est la feuille "x" qui est seule affichée et active. La macro doit donc d'abord ne plus cacher Sommaire, trouver la ligne (i) telle que A(i) = "x" et l'effacer (pas la supprimer) ; puis supprimer la feuille "x" (Sommaire est alors seule visible et active). Pas de soucis pour ce dernier point ; mais je patauge pour le code de :
Trouver dans la feuille "sommaire" la ligne (i) telle que A(i) = "x" et l'effacer ("x" étant soit le nom de la feuille Devis"x" à supprimer, soit encore la valeur de la cellule A3 dans la feuille Devis"x")

J'espère être plus clair...

Je vais suivre tes conseils et vais encore user la touche F1 sur la fonction Find !!!



Merci





PS : Plus haut où j'ai tenté une approche en copiant la valeur "x" de A3 de la feuille"x" dans  la feuille sommaire en AB2, mais je ne m'en sort pas quand même , je laisse tomber cette voie peu élégante.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Si ton code est dans un module, ça pourrait se faire, mais comment vas-tu déclancher la macro à partir de la feuille que tu effaces ? As-tu créer une barre de menu ?

Dans ton premier code, tu écris
f = ActiveCell.Value
Pour pouvoir utiliser ce code, ton curseur doit impérativement se trouver dans la colonne A
Tu devrais peut-être plus y aller comme ceci
f = Range("A" & Activecell.Row)

Pour simplifier un peu ton code (ça devrait fonctionner)
Private Sub SupprimerFiche_Click() ' Dans la feuille Sommaire (seule feuille affichée)
f = Range("A" & Activecell).Row
Sheets(f).Visible = True ' Affichage de la feuille à supprimer précédemment cachée.
Sheets(f).Delete ' suppression (on repasse dans Sommaire)
Rows(Activecell.Row).ClearContents ' On efface

End Sub

Je reviens plus tard pour la suite...

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut MPI,

Le code que tu donnes (quand on veut supprimer une feuille Devis"x" depuis le Sommaire va bien.
En fait, tu fais remonter automatiquement la valeur A(i) pour n'importe quelle cellule sélectionnée en ligne (i) ; j'attends de l'utilisateur qu'il sélectionne bien A(i), et seulement une cellule en colonne A . Je ne t'ai pas donné la totalité du code pour être plus clair, mais j'ai une boucle if pour n'autoriser une suppression que si et seulement si c'est une cellule de la colonne A qui est active (+ un warning de confirmation) dans "Sommaire".

Pour "la suite" (cad quand on est^pas dans "Sommaire" mais dans une feuille Devis "x"), bien sûr tu as raison :la macro doit être dans un module et pas dans la feuille. C'est le bouton Supprimer qui renvoi un code dans la feuille, mais qui appelle appelle en fait application.run "SupprimerDéfinitivement" dans un module.


Reste que je ne sais toujours pas comment écrire :



Depuis la feuille seule affichée et active nommée "X", dont la même valeur "x" est en A3, aller trouver dans la feuille "Sommaire" la ligne (i) contenant en A(i) la valeur "x" et supprimer cette ligne, sachant que en A(i) on a en fait la formule =X!A3...

J'ai bien noté que tu m'as suggéré de rechercher la formule et non la valeur en A(i),
mais pfffff,
j'y arrive pô...!

Merci pour ta patience
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Je demeure toujours sceptique par rapport à ce bouton Supprimer qui se trouve dans la feuille à effacer (je suppose...) mais ça reste à voir.

Pour rechercher la valeur dans Sommaire quand tu es dans une autre feuille, utilise Find avec quelque chose comme ceci

    Dim Recherche as Range
    Set Recherche = Sheets("Sommaire").Columns("A:A").Find(Range("A3"))
    If Not Recherche is Nothing Then
        Ligne = Recherche.Row
    ...............

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Merci MPi,

Mais ça marche pas : J'ai l'impression que ton code renvoie à recherher une valeur "A3" dans la colonne A de la feuille "Sommaire", et non la valeur "toto" de la cellule A3 dans la feuille nommée "Toto"


Dans mon code initial, j'ai pensé contourner une partie de ma  difficulté en copiant la valeur "toto" dans A3 de la feuille "Toto", dans la cellule AB2 de la feuille "Sommaire".


Puis, en AB1 de sommaire, j'ai la formule :
=SI(ESTERREUR(RECHERCHEV(AB2;Sommaire!A4:A256;1;FAUX));"N";RECHERCHEV(AB2;Sommaire!A4:A256;1;FAUX))

Dans une boucle If je reprends le résultat  :
"N" => Anomalie !!! la valeur "toto" n'existe pas en colonne A de "Sommaire"
"toto" => La valeur "toto" existe bien quelque part en colonne A de "Sommaire"

Problème : Trouver la ligne où se trouve cette valeur "toto" en colonne A de "Sommaire" et effacer la ligne en question (sachant que cette valeur est maintenant également présente en AB2 de "Sommaire"), et là, je ne me sort pas de la syntaxe

Je cherche une suite Else à mon code du genre :
Dim x As String
x = Range("AB2").value ' x renvoie la valeur "toto" de AB2
Ligne = Columns(1).Find(x).Row : MAUVAISE SYNTAXE !!  ' trouve la ligne où on a en colone A la valeur présente en AB2
Rows(Ligne).Select
Selection.ClearContents

J'espère avoir bien clairement posé ma question, car mes recherches sont, elles, de plus en plus embrumées...

Aide impatiemment attendue...
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Ceci fonctionne très bien ici (à partir de la feuille "toto")

    Dim Recherche As Range
   
    Set Recherche = Sheets("Sommaire").Columns("A:A").Find(Range("A3").Values, LookIn:=xlValue, LookAt:=xlWhole)
    If Not Recherche Is Nothing Then
        MsgBox Recherche.Row
    Else
        MsgBox "Introuvable"
    End If

J'ai rajouté les paramètres xlValues qui recherchera le texte et non la formule de la cellule, le cas échéant
xlWhole spécifie que la cellule recherchée contient exactement la même valeur que l'autre

N'oublie pas qu'un seul espace en plus ou en moins dans une des 2 cellules fera échouer la recherche...

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut,

Jai mis ton code tel quel dans un module : Négatif
J'ai pensé que "Sommaire" devait peut être être visible , et j'y ai ajouté Sheets("Sommaire").visible=true : Négatif
J'ai tenté de mettre ce code dans la feuille (avec un CommandButton + Private sub) : Négatif
Dans chaque cas j'ai essayé sans LookAt:=xlWhole : Négatif

Je résume :
La feuille "Sommaire" étant visible mais non active, avec :
   - En AB2 la copie de la valeur de la cellule A3 de la feuille "Toto"
   - Quelque part en colonne A, une cellule qui contient la formule =Toto!A3
La feuille 'Toto" étant active, avec :
   - En A3 la valeur "toto"
   - Un CommandButton1

Première tentative infructueuse :
   Private Sub CommandButton1_Click()
   Sheets("sommaire").Visible = True
   Dim Recherche As Range
    Set Recherche = Sheets("Sommaire").Columns("A:A").Find(Range("A3").Values, LookIn:=xlValue, LookAt:=xlWhole)
    If Not Recherche Is Nothing Then
        MsgBox Recherche.Row
    Else
        MsgBox "Introuvable"
    End If
End Sub

Deuxième tentative infructueuse :
 Private Sub CommandButton1_Click()
   Application.run "Test"
 End Sub
avec un module contenant
Sub Test()
   Sheets("sommaire").Visible = True
   Dim Recherche As Range
    Set Recherche = Sheets("Sommaire").Columns("A:A").Find(Range("A3").Values, LookIn:=xlValue, LookAt:=xlWhole)
    If Not Recherche Is Nothing Then
        MsgBox Recherche.Row
    Else
        MsgBox "Introuvable"
    End If
End Sub

 Arfffff ....! Je pige pas...  

Zen... Et si on tentait une autre approche ? 
Par exemple, je recopie la valeur de A3 ("toto") de ma feuille à supprimer "Toto"dans la cellule AB2 de la feuille "Sommaire"  : Il "ne resterait plus qu'à" chercher dans la feuille "Sommaire" la ligne (i) dont :
   - soit dont la valeur en colonne A  (renvoyée par la formule de A(i) =Toto!A3) est celle de AB2   
   - soit dont la formule en colonne A est  =("valeurdeAB2")!A3 (aucune idée de comment faire ça...!)

Ton avis ?
Comment verrais-tu un tel code ?
Merci encore de ta patience.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Oups... désolé, mais erreur de syntaxe dans ce que je t'ai envoyé... mea culpa...
les "s" n'étaient pas au bon endroit...

Dim Recherche As Range
        Set Recherche Sheets("Sommaire").Columns("A:A").Find(Range("A3"). Value , LookIn:xlValues, LookAt:=xlWhole)
    If Not Recherche Is Nothing Then
        MsgBox Recherche.Row
    Else
        MsgBox "Introuvable"
    End If

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut,

Je craque... ça me répond : INTROUVABLE !!!!!!!!!!!!

Jai fait comme plus haut : mis sommaire visible, mis en private + Button ; mis en module , supprimé xlWhole...  même réponse.

Comme dans la cellule A(i) de Sommaire j'ai en fait une formule (=Toto!A3) , j'ai carrément entré la VALEUR "Toto" dans  A5 de "Sommaire" pour essayer de voir si ça me renvoyait bien (et me sélectionnait) la ligne 5 de Sommaire : Que dalle !


Pour  ma suggestion d'une autre approche, t'as un avis ?

Je suis désolé d'abuser de te solliciter encore ... mais pourrais-tu s'il te plaît me "décrire" le déroulement de ton code pour que je  comprenne  où je cloche peut être quand je le reprends.

Merci
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Le déroulement est des plus simples

Recherche est une variable qui recevra l'adresse de la valeur trouvée.
La commande demande de faire une recherche (Find) dans la feuille "Sommaire", dans la colonne A
La valeur recherchée est celle figurant en A3 sur la feuille active
xlValues spécifie que c'est la valeur de la cellule et non sa formule, le cas échéant
xlWhole spécifie que la valeur de la cellule doit être identique à celle recherchée. Si tu recherches "1", la fonction ne te retournerait pas "11"

Il pourrait y avoir un problème si tu recherches un chiffre.
Dans une cellule, le chiffre pourrait être du texte et dans l'autre un chiffre (numérique), ce qui n'est pas identique...
123 est différent de "123"

Tu pourrais parer à ça en "castant" la valeur cherchée
Set Recherche = Sheets("Sommaire").Columns("A:A").Find( CStr (Range("A3")).Value
Set Recherche = Sheets("Sommaire").Columns("A:A").Find(CLng(Range("A3")).Value

Un simple espace pourrait causer des problèmes aussi si tu utilises xlWhole

Autrement, ça devrait rouler aisément...

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut MPi,

"On" (surtout grâce à toi !) avance...

1° Concernant ton premier code ("s" corrigés)

J'ai compris pourquoi ça me retournait "introuvable", si j'avais ce résultat, c'est que ton code tournait bien ...
Ce sont ces P... de cellules fusionnées qui foutaient la pagaille !
Une fois intégré, voilà ce que ça donne :

Private Sub SupFeuille_Click()
'Supprimer la feuille Devis sélectionnée "Toto" + la ligne de report correspondante au "Sommaire"
ActiveSheet.Unprotect  'Feuille "Toto" déprotégée
Sheets("Sommaire").Visible = True  ' "Sommaire" est visible
    Dim Recherche As Range
    Set Recherche = Sheets("Sommaire").Columns("A:B").Find(Range("A3:B3").Value, LookIn:=xlValues, LookAt:= xlWhole)
        If Not Recherche Is Nothing Then
        Sheets("Sommaire").Select ' Active le "Sommaire"
        ActiveSheet.Unprotect  'Feuille "Sommaire" déprotégée
        Recherche.rows.select ' Sélectionne la ligne de valeur "Recherche" NON ! ça sélectionne la cellule A/Recheche ???
        Selection.ClearContents ' la supprine
        Else
            MsgBox "Introuvable au Sommaire"
        End If
   Sheets("Sommaire").Visible = False' Cache la feuille Sommaire (on revient dans la feuille "Toto" qui devient active)
   Sheets("Sommaire").Visible = True' On reste dans la feuille "Toto" et on affiche la feuille Sommaire
   ActiveWindow.SelectedSheets.Delete ' Supprime la feuile "Toto" et revient au Sommaire
End Sub

... J'ai encore une bourde quelque part... ça me sélectionne et m'efface la cellule, mais pas la ligne ! Je sais, tu n'aimes pas du tout les fusions, et je les pressens bien me taquiner encore sur ce coup avec Range ou Row. Mais j'ai ôté les fusions, et c'est pareil. Vu mon niveau plus que de base, j'opterai plutôt pour une bonne vieille erreur de syntaxe, dont je n'ai pas été foutu de trouver la correction... Help!

2° Concernant le code de ton dernier post
Je lui corrige les plages, il me demande une parenthèse de plus, mais il ne passe pas et je n'ai pas trouvé comment lui ajouter xlWhole... Pas grave, mais j'aurai aimé comprendre pourquoi
Set Recherche= Sheets("Sommaire").Columns("A:B").Find(CStr(Range("A3:B3"))).Value

Merci de me lire aussi longuement
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Pour la fusion de cellules, je ne le dirai jamais assez...









Recherche.rows.select




Écris plutôt
Rows(recherche.row).select  'c'était bien, je pense, une simple erreur de syntaxe...

Pour la parenthèse, tu as raison, il en manquait une ...
Ça m'arrive quand j'écris du code à main levée sans tester... vilain moi...

MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Autre chose,
ClearContents va effacer les données de la ligne, mais la ligne restera là.
Si tu veux supprimer la ligne, utilise Delete

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour MPi,

dans ton code ci dessous :


1)  If Not Recherche Is Nothing Then
2)     MsgBox Recherche.Row

La MsgBox renvoie bien la valeur de l'index de la ligne que je cherche dans Sommaire 
Mai comment "récupérer" cette valeur de l'index pour aller sélectionner (et effacer ; pas supprimer) la ligne de même index de la Feuille Sommaire ?

dans mon code (corrigé) ci dessous :

1)  If Not Recherche Is Nothing Then
2)       Sheets("Sommaire").Select


' Active le "Sommaire"
3)       ActiveSheet.Unprotect  'Feuille "Sommaire" déprotégée

4)       select  



' Sélectionne la ligne de valeur d'index trouvé ( "Recherche") dans Sommaire,  



5)       Selection.ClearContents ' la supprime





Ben, ça le fait pas ; évidemment car je  retourne à la feuille "Sommaire", où Recherche ne correspond à rien...

J'abuse (bien amicalement) ... de ta patience! M'en veux pas STP : "On" va y arriver.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Même si tu actives la feuille "Sommaire", la valeur de Recherche devrait toujours être en mémoire, à moins que tu ne changes de procédure et que Recherche était déclarée dans la procédure précédente... Si ça ne fonctionne toujours pas, essaie de déprotéger ta feuille avant la recherche

Toujours est-il que, dans ton cas, tu n'as pas besoin de sélectionner la feuille Sommaire

1)  If Not Recherche Is Nothing Then
2)       Sheets("Sommaire").Unprotect  'Feuille "Sommaire" déprotégée

3)       Sheets("Sommaire").Rows(Recherche.row).
ClearContents ' vide la ligne

Ceci devrait être suffisant, je pense...

Pour les feuilles, préfère Activate à Select. À moins que tu ne veuilles sélectionner plusieurs feuilles en utilisant éventuellement le paramètre False.
Pour les cellules, Select est OK

MPi
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Pardon, 17 échanges... Je sais, je suis un peu lent ... Espérons que j'apprendrai vite !
Ola ! pour le Forum !