Supprimer une ligne via un userform

Résolu
Remi2236 Messages postés 89 Statut Membre -  
Remi2236 Messages postés 89 Statut Membre -
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

5 réponses

  1. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    1. Remi2236 Messages postés 89 Statut Membre 1
       
      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
  2. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    1. Remi2236 Messages postés 89 Statut Membre 1
       
      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
  3. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    1. Remi2236 Messages postés 89 Statut Membre 1
       
      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
  4. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    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
    1. Remi2236 Messages postés 89 Statut Membre 1
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question