Supprimer une ligne via un userform

Résolu/Fermé
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 - 24 sept. 2018 à 11:56
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 - 26 sept. 2018 à 08:17
Bonjour,

J'ai fait un tableau pour le travail qui me permet de gérer l'accueil. Lorsque j'ouvre mon tableau on sélectionne le mois et ça ouvre la bonne feuille.
Il y a un userform qui apparait et quand on clique sur supprimer un consultant ça affiche un userform demandant le numéro d'ordre (de consultation en colonne A). Je souhaiterais que ça supprime toute la ligne de la feuille active quand on valide.

J'ai mis ça comme code :

Private Sub CommandButton1_Click()
Dim i As Integer
With ThisWorkbook.ActiveSheet
For i = Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("A" & i).Value = TextBox1 Then
.Row(i).Delete
End If
Next i
End With
UserForm_SUPPRESSION.Hide
End Sub

Mais ça ne fonctionne pas...quelqu'un pourrait me dire ce qui ne va pas ?

Merci encore d'avance.

Cordialement,

Rémi
A voir également:

5 réponses

thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié le 24 sept. 2018 à 13:37
Bonjour,

ci-dessous correction du code

Private Sub CommandButton1_Click()
    Dim i As Integer
    Const mot_de_passe As String = "XXXXX"
    
    With ThisWorkbook.ActiveSheet
        For i = Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
            If .Range("A" & i).Value = Val(TextBox1) Then
                .Unprotect mot_de_passe
                .Rows(i).Delete
                .Protect mot_de_passe
            End If
        Next i
    End With
    Me.Hide
End Sub

NB :
1- votre numéro d'ordre est numérique mais celui saisi dans le formulaire est au format texte, il faut donc le convertir
2- erreur sur la propriété "Rows" et non "Row"
3- mot de passe à définir : remplacer les "XXXX"
4- nul besoin de répéter le formulaire, l'objet "Me" le représente
5- pour une meilleure lisibilité du code, procéder à son indentation, c.a.d. aligner correctement les instructions with, for, if.
1
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 1
24 sept. 2018 à 13:57
Merci, ça fonctionne mais quand je mets supprimer une ligne ça m'indique :
"Erreur d’exécution 13
Incompatibilité de type"

Et ça me met en surbrillance une ligne d'un code :

"Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D2:E3627")) Is Nothing Then
If Not IsEmpty(Target) Then
Application.EnableEvents = False
Target.Value = UCase(Target.Value) => cette ligne en surbrillance
Application.EnableEvents = True
End If
End If
End Sub"

De plus, ça m'efface la formule dans la colonne A et du coup ça me met #REF sur toutes les autres lignes. Je pense qu'il faudrait demander au code à n'effacer que les colonnes C à H de la ligne concernée...comment faire ?
Je vous joins un exemple sur le mois de janvier, si on essaye de supprimer le numéro 2 dans l'exemple.

https://www.cjoint.com/c/HIylWjgjNST

Enfin, je me demande en effaçant un numéro si l'ordre va quand même suivre ? Exemple si j'ai dans l'ordre le 1,2,3,4,5....etc... et que je demande d'effacer le 2, si les autres lignes vont reprendre la bonne numérotation et ne pas me retrouver avec 1,3,4,5.....

Merci du temps accordé.

Cordialement,

Rémi
0
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié le 24 sept. 2018 à 16:03
Bonjour,

Assurez--vous que l'événement "Change" ne porte que sur une seule cellule.
ci-dessous correction du code :

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("D2:E3627")) Is Nothing And Target.Count = 1 Then
    If Not IsEmpty(Target) Then
      Application.EnableEvents = False
      Target.Value = UCase(Target.Value)
      Application.EnableEvents = True
    End If
  End If
End Sub


Pour le numéro d'ordre, modifier votre formule ainsi
=SI(NON(ESTVIDE(C2));LIGNE(C2)-1;"")
1
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 1
24 sept. 2018 à 16:47
Merci, pour la suppression ça marche bien. Mais du coup ça me met encore une autre erreur :

"Erreur 1404 : erreur définit par l'application ou par l'objet."

Le code pour faire en sorte que le fond des cellules des colonnes C à G soit en vert par rapport à la cellule active affiche en surbrillance :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set champ = Range("C:G")
champ.FormatConditions.Delete => ligne en surbrillance
If Not Intersect(champ, Target) Is Nothing Then
If Target.Count = 1 Then
Intersect(Target.EntireRow, champ).FormatConditions.Add Type:=xlExpression, Formula1:="VRAI"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Interior.Color = RGB(0, 255, 0)
End If
End If
End Sub

De plus, la technique pour que le numéro d'ordre reprenne fonctionne mais j'ai une autre question car du coup j'ai plusieurs mois qui se suivent et la première ligne du mois de février va chercher le dernier chiffre et ajoute +1 (ce qui donne par exemple qu'au mois de février ce serait le 5ème consultant) mais avec votre formule la ligne 2 du mois de février devient le numéro 2 puis 3...et non 6 par rapport à l'exemple.

https://www.cjoint.com/c/HIyoVi3wLlT

Vous auriez une solution ?

Cordialement,

Rémi
0
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié le 24 sept. 2018 à 19:15
Bonjour,

Je vous propose ce code car la suppression du format conditionnel lorsqu'il n'existe pas, provoque une erreur.
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim champ As Range
    
    Set champ = Me.Range("C:G")
    On Error Resume Next
    If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
        Intersect(Target.EntireRow, champ).FormatConditions.Delete
        Intersect(Target.EntireRow, champ).FormatConditions.Add Type:=xlExpression, Formula1:="VRAI"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        Selection.FormatConditions(1).Interior.Color = RGB(0, 255, 0)
    End If
End Sub

Ici, l'objet "Me" représente la feuille car le code est rattaché à la feuille.


et cette formule pour février :
=SI(NON(ESTVIDE(C2));MAX(Janvier!A:A)+LIGNE(C2)-1;"")


1
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 1
25 sept. 2018 à 09:14
Bonjour,

Merci pour cette réponse, c'est presque parfait !

Il y a juste un dernier problème, c'est que je voudrais que lorsque je clique sur une cellule (admettons C2 qui devient la cellule active), cela colore en vert la ligne de la cellule active entre la colonne C et la colonne G (dans l'exemple C2 à G2) mais que si je clique sur une autre cellule ça fasse le même effet mais que du coup le fond vert ne reste pas sur l'ancienne ligne (du coup de C2 à G2).

Or actuellement cela reste coloré. On peut résoudre le problème en modifiant le code ?

Merci merci en tout cas de tout ce temps consacré.

Cordialement,

Rémi
0
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié le 25 sept. 2018 à 16:40
Bonjour,

Dans ce cas, il suffit de supprimer pour les colonnes C à G toute mise en forme conditionnelle qu'elle existe ou non.
modification du code ci-dessous :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim champ As Range
    
    Set champ = Range("C:G")
    On Error Resume Next
    champ.FormatConditions.Delete
    If Not Intersect(champ, Target) Is Nothing And Target.Count = 1 Then
        Intersect(Target.EntireRow, champ).FormatConditions.Add Type:=xlExpression, Formula1:="VRAI"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        Selection.FormatConditions(1).Interior.Color = RGB(0, 255, 0)
    End If
End Sub


1
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 1
26 sept. 2018 à 08:17
Tu es merveilleux ! lol, ça fonctionne à merveille.

Merci beaucoup de tout ce temps accordé pour mon problème.

Bonne journée à toi et au plaisir.

Cordialement,

Rémi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Remi2236 Messages postés 83 Date d'inscription jeudi 10 septembre 2015 Statut Membre Dernière intervention 29 novembre 2023 1
24 sept. 2018 à 12:15
J'ai omis de joindre le tableau :
https://www.cjoint.com/c/HIykoTdxsrT
0