Ajouter et supprimer des lignes dans un tableau

Valval35 -  
ThauTheme Messages postés 1564 Statut Membre -
Bonjour,

J'explique ma demande : j'ai un tableau avec une ligne par personne (des salariés) et plusieurs informations sur chaque personne. J'ai un tableau par mois, rangé à chaque fois dans un onglet différent.

Mais comme chaque mois des salariés partent ou arrivent, il faudrait que je puisse enlever une personne sur tous les mois suivants comme en rajouter une.

Comment faire une macro pour répondre à cette demande ?

Merci d'avance !

5 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Vaval, bonjour le forum,

    Je vois bien une macro qui, quand tu rajouterais ou supprimerais une donnée dans le tableau principal, irai l'ajouter ou la supprimer dans les onglets des mois... Mais sans fichier reprenant la structure de ton fichier original avec une poignée de données non confidentielles difficile de t'aider davantage...

    1
  2. Valval35
     
    Bonjour ThauThem

    Je t'envoie donc un fichier avec de fausses données mais qui reprend la structure de ce que j'ai réellement.
    J'aimerai également classé tous mes salariés par ordre alphabétique.

    Et admettons que pour le mois d'Aout, un salarié arrive et un autre repart. Il me faudrait alors une macro pour supprimer le salarié qui part (sur ce mois puis pour tous les autres mois) et ajouter le salarié qui arrive (en gardant ses informations pour les mois suivants).

    Merci beaucoup !
    0
    1. Valval35
       
      Mince, comment peut-on joindre un fichier ?
      0
  3. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Regarde avec, par exemple, https://www.cjoint.com/
    0
    1. Valval35
       
      Cool merci,

      Voici le fichier alors :

      http://www.cjoint.com/c/GFmov3JE8Wm
      0
  4. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Je ne voyais pas les choses comme ça... Est-ce que ce que je te propose te conviendrait :

    • Supression
    - clic du bouton sur un nom a supprimer
    - message de validation
    - le nom est supprimé dans tous les onglets du classeur

    • Ajout
    - tu ajoutes les données du nouveau salarié puis,
    - double- clic sur le nouveau nom
    - message de validation
    - le nom est ajouter du mois en cours jusqu'en décembre

    Dans l'attente de ta réponse... Pourrait certainement pas finaliser aujourd'hui...
    0
    1. Valval35
       
      Merci beaucoup pour ta réponse et le temps pris pour résoudre mon problème !

      ça me conviendrait : il faudrait juste que les noms ne soient pas supprimés pour les mois où ils ont été salarié.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Le code ci-dessous est à placer dans la composant ThisWorkbook. Une fois intégré, voilà comment ça fonctionne :

    AJOUT
    - Tu rajoutes dans un mois donnée toutes les données du salarié entrant
    - Tu double-cliques dans la cellule de la colonne A de cette nouvelle ligne
    - Un message de confirmation indique que cette nouvelle ligne sera ajoutée à tous les mois suivant le mois donnée jusqu'au dernier
    - Si tu valides, le nouveau salarié est ajouté et un tri alphabétique est fait

    SUPPRESSION
    - dans un mois donné tu cliques avec le bouton droit dans la cellule en colonne A du salarié sortant
    - Un message de confirmation indique que ce salarié sera supprimé du mois donné jusqu'au dernier mois
    - Si tu valides, le salarié est supprimé et un tri alphabétique est fait

    Attention, l'ajout de fait à partir du mois suivant jusqu'au dernier alors que la suppression se fait du mois en cours jusqu'au dernier !...

    Le code :
    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 'au double-clic dans un onglet
    Dim IOA As Byte 'déclare la variable IOA (Index de l'Onglet Actif)
    Dim LI As Long 'déclare la variable LI (LIgne)
    Dim DM As Worksheet 'déclare la variable DM (Dernier Mois)
    Dim PLV As Long 'déclare la variable PLV (Première Ligne Vide)
    
    Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
    If Target.Column <> 1 Then Exit Sub 'si le double-clic a lieu ailleurs que dans la colonne 1 (=A), sort de la procédure
    Cancel = True 'évite le mode [Édition] lié au double-clic
    IOA = ActiveSheet.Index 'définit l'index IOA de l'onglet actif
    If IOA = Sheets.Count Then Exit Sub 'si l'onglet actif est le dernier, sort de la procédure
    LI = Target.Row 'définit la ligne LI de la cellule double-cliquée
    Set DM = Sheets(Sheets.Count) 'définit l'onglet DM du dernier mois
    'si "non" au message sort de la procédure
    If MsgBox("Êtes-vous sûr(e) de vouloir ajouter " & Target.Offset(0, 1).Value & " " & Target.Value & _
       ", du mois de " & Sheets(IOA + 1).Name & " au mois de " & DM.Name & " ?", vbYesNo, "AJOUT") = vbNo Then Exit Sub
    For I = IOA + 1 To Sheets.Count 'boucle sur les onglets, de IOA + 1 au dernier
        PLV = Sheets(I).Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la première ligne vide PLV de la colonne A
        'copie la ligne de la cellule double-cliquée et la colle dans la cellule ligne PLV colonne A de l'onglet de la boucle
        Sheets(IOA).Rows(LI).Copy Sheets(I).Cells(PLV, "A")
        'tri par ordre alphabétique l'onglet de la boucle
        Sheets(I).Range("A1").CurrentRegion.Sort Key1:=Sheets(I).Range("A1"), Order1:=xlAscending, Header:=xlYes
    Next I 'prochain onglet de la boucle
    'tri par ordre alphabétique l'onglet de la cellule double-cliquée
    Sheets(IOA).Range("A1").CurrentRegion.Sort Key1:=Sheets(IOA).Range("A1"), Order1:=xlAscending, Header:=xlYes
    Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
    End Sub
    
    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 'au clic-droit dans un onglet
    Dim N As String 'déclare la variable N (Nom)
    Dim P As String 'déclare la variable P (Prénom)
    Dim IOA As Byte 'déclare la variable IOA (Index de l'Onglet Actif)
    Dim DM As Worksheet 'déclare la variable DM (Dernier Mois)
    Dim R As Range 'déclare la variable R (Recherche)
    Dim PAS As String 'déclare la variable PA (Première Adresse)
    
    Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
    If Target.Column <> 1 Then Exit Sub 'si le clic-droit a lieu ailleurs que dans la colonne 1 (=A), sort de la procédure
    Cancel = True 'évite le menu contextuel lié au clic-droit
    N = Target.Value 'définit le nom N de la cellule cible (=cellule du clic-droit)
    P = Target.Offset(0, 1).Value 'définit le prénom P
    IOA = ActiveSheet.Index 'définit l'index IOA de l'onglet actif
    Set DM = Sheets(Sheets.Count) 'définit l'onglet DM du dernier mois
    'si "non" au message sort de la procédure
    If MsgBox("Êtes-vous sûr(e) de vouloir Supprimer " & Target.Value & " " & Target.Offset(0, 1).Value & _
       ", du mois de " & Sheets(IOA).Name & " au mois de " & DM.Name & " ?", vbYesNo, "SUPPRESSION") = vbNo Then Exit Sub
    For I = IOA To Sheets.Count 'boucle sur les onglets, de IOA au dernier
        Set R = Nothing 'vide variable R
        'définit la recherche R (recherche le nom N dans la première colonne de l'onglet de la boucle)
        Set R = Sheets(I).Columns(1).Find(N, , xlValues, xlWhole)
        If Not R Is Nothing Then 'condition : s'il existe au moins une occurrence trouvée
            PA = R.Address 'définit l'adresse PA de la première occurrence trouvée
            Do 'exécute
                'si le prénom de l'occurrence trouvé correspond au prénom de la cellule cible,
                'supprime la ligne de l'occurrence trouvé et va à l'étiquette "suite"
                If R.Offset(0, 1).Value = P Then Sheets(I).Rows(R.Row).Delete: GoTo suite
                Set R = Sheets(I).Columns(1).FindNext(R) 'redéfinit la recherche R (occurrence suivante) [en cas d'homonymie]
            Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en PA
        End If 'fin de la condition
    suite: 'étiquette
        'tri par ordre alphabétique l'onglet de la boucle
        Sheets(I).Range("A1").CurrentRegion.Sort Key1:=Sheets(I).Range("A1"), Order1:=xlAscending, Header:=xlYes
    Next I 'prochain onglet de la boucle
    Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
    End Sub
    

    0