Recherche et suppression ligne [Résolu]

Signaler
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011
-
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011
-
Bonjour,
Pour mon boulot je dois faire une macro qui repère où l'on est positionné sur la feuille, copie la valeur de cette cellule dans une variable.
Ensuite dans une autre feuille fait une recherche (du contenu de la variable) dans une colonne et supprime la totalité de la ligne si jamais il s’avère que la variable était présente.

Une partie de mon code
Sub DelSuppression_Click()

Dim myVar 'declaration de ma variable

Row = Selection.Row

'If ((Cells(Row, 1) Cells(Row - 1, 1)) Or (Cells(Row, 1) Cells(Row + 1, 1))) Then
    If (MsgBox("Etes-vous sure de vouloir supprimer l'activité de la ligne  #" & Row, vbOKCancel) = vbOK) Then
             
        ActiveSheet.Rows(Row).Delete

        Sheets("Feuil2").Activate
  
        
        For i = 100 To 1 Step -1 'la jai mis 100 mais il est possible qu'il y est plus de cent ligne
If Cells(i, 3).Value = Range("b4") Then Cells(i, 3).EntireRow.Delete 'le 3 dans cells cest que je travaille sur la troisieme ligne mais je crois cest pas bon

Next
 
    End If
  ' End If
    
Sheets("Feuil1").Activate



End Sub


Merci de votre aide.

13 réponses

Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

Je fais part de ma solution.
Merci de ton aide.
Bonne journée


Sub DelSuppression_Click() 'Suppresion d'une activité

Row = Selection.Row 'Recuperation de la ligne sur laquelle on se situe
ID = Cells(Row, 1).Value 'On recupere et met dans une variable l'id situé en row(a)

If ((Cells(Row, 1) <> Cells(Row - 1, 1)) Or (Cells(Row, 1) <> Cells(Row + 1, 1))) Then
If (MsgBox("Etes-vous sure de vouloir supprimer les dépendances et l'activité situées a la ligne Excel#" & Row, vbOKCancel) = vbOK) Then

       ActiveSheet.Rows(Row).Delete 'Suppression de la ligne dans la feuille activité

Sheets("Feuil2").Activate 'On active la feuille

Dim J As Long 'Declaration de la variable J
Dim Plage As Range 'Declaration de la variable utilisée pour stocker la plage

Set Plage = Range("A1", Range("A10000").End(xlUp)) 'On initialise la variable avec la plage souhaitée
For J = Plage.Cells.Count To 1 Step -1 'Boucle qui part de la fin en remontant
    If Plage.Cells(J).Value ID Then 'Si jamais la valeur de la cellule parcouru valeur ID
        Plage.Cells(J).EntireRow.Delete 'Alors on supprime la totalité de la ligne
    End If
Next
End If

    End If
    
    Sheets("Feuil1").Activate 'On active la feuille de depart

End Sub





Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

c'est quoi la question au juste ?

'le 3 dans cells cest que je travaille sur la troisieme ligne mais je crois cest pas bon


bon pressentiment dans ton cas le 3 represente la colonne et pas la ligne

A+
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

La question c'est: Peut-on m'aider à réaliser cette macro?

Ensuite je me suis trompé dans mon commentaires je pensais bien à colonne.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,

Intéresse-toi à la méthode Find (regarde-la dans ton aide VBA) et applique-la au lieu de ta boucle.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

Merci, je regarde ça et je reviendrai pour "valider" ou non.
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

Voilà où j'en suis.


Sub DelSuppression_Click() 'Suppresion d'une activité

Row = Selection.Row 'Recuperation de la ligne sur laquelle on se situe
ID = Cells(Row, 1).Value 'On recupere et met dans une variable l'id situé en row(a)

'If ((Cells(Row, 1) Cells(Row - 1, 1)) Or (Cells(Row, 1) Cells(Row + 1, 1))) Then
    If (MsgBox("Etes-vous sure de vouloir supprimer l'activité de la ligne  #" & Row, vbOKCancel) = vbOK) Then
       
       ActiveSheet.Rows(Row).Delete 'Suppression de la ligne dans la feuille activité
  
        With Worksheets("R1- BC Strategy").Range("A1:A9999") 'Dans la feuille R1- BC Strategy sur la plage A1 a A999 (id)
    Set c = .Find(ID, LookIn:=xlValues) 'On recherche la valeur var(id)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
          ActiveCell.EntireRow.Delete
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    
End With

End If

End Sub


Seul petit soucis ca ne supprime que la première cellule de mon deuxieme fichier à la place de toute la ligne et pourtant j'ai bien mis :
ActiveCell.EntireRow.Delete



Merci de votre aide.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Euh ...
Explique déjà pourquoi tu te réfères à la cellule active (qui ne bouge pas, elle) dans ta boucle ?

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

Tout simplement parceque je suis C**. un EntireRow.Delete suffit simplement?

Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
un EntireRow.Delete suffit simplement?

1) EntireRow de quoi, d'après toi ? ===>> il suffit que tu réfléchisses un peu ...
2) A supprimer ainsi, tu prends un risque : celui qu'à la suite d'une telle suppression, une autre occurence se produise à la même adresse (si par exemple la nouvelle occurence est à la ligne suivante, la suppression de la ligne antérieure fait que l'adresse nouvelle de la ligne suivante devient celle de la ligne supprimée et que, donc, "c.Address <> firstAddress" ne sera pas vérifié !).
Parade : ne rien supprimer au fur et à mesure, mais constitituer une plage de ce qui est à supprimer (intéresse-toi à la méthode Union) puis applique ton entirerow.delete à cette plage.
Allez ===>> A toi ...

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

J'ai essayé avec firstAddress.EntireRow.Delete et c.EntireRow.Delete et rien de cela ne fonctionne. Cela fait plus de 4-5 que je n'ai pas fais de VBA donc je dois m'y remettre mais pas touours facile.

Le problème actuel que j'ai est que cela ne supprime mais pas Row (Ca supprime rien du tout, à la base je pensais mais finalement NON).

Ta remarque est juste cependant étant avec uniquement des ID unique dans ma colonne (valeur que je recherce) je ne devrais jamais me retrouver dans ce cas, n'est ce pas?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
étant avec uniquement des ID unique dans ma colonne (valeur que je recherce)

ceci contredit ta boucle avec Find pour rechercher plusieurs occurences !

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

ceci contredit ta boucle avec Find pour rechercher plusieurs occurences !


Sub DelSuppression_Click() 'Suppresion d'une activité

Row = Selection.Row 'Recuperation de la ligne sur laquelle on se situe
ID = Cells(Row, 1).Value 'On recupere et met dans une variable l'id situé en row(a)

'If ((Cells(Row, 1) Cells(Row - 1, 1)) Or (Cells(Row, 1) Cells(Row + 1, 1))) Then
    If (MsgBox("Etes-vous sure de vouloir supprimer l'activité de la ligne  #" & Row, vbOKCancel) = vbOK) Then
       
       ActiveSheet.Rows(Row).Delete 'Suppression de la ligne dans la feuille activité
  
        Sheets("R1- BC Strategy").Activate
        
        With Worksheets("R1- BC Strategy").Range("A1:A9999") 'Dans la feuille R1- BC Strategy sur la plage A1 a A999 (id)
    Set c = .Find(ID, LookIn:=xlValues) 'On recherche la valeur var(id)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
          ActiveCell.EntireRow.Delete

            
            'Set c = .FindNext(c)
       ' Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    
End With

End If

End Sub



J'en reste toujours bloqué sur ma suppression de ligne.
Messages postés
303
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
29 juillet 2011

Même après une bonne partie de la journée sur le problème je n'arrive pas a le corriger.