Ajouter et supprimer des lignes dans un tableau

Fermé
Valval35 - Modifié le 12 juin 2017 à 15:09
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 - 12 juin 2017 à 21:21
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 !




A voir également:

5 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
12 juin 2017 à 14:51
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
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
Mince, comment peut-on joindre un fichier ?
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
12 juin 2017 à 16:20
Re,

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

Voici le fichier alors :

http://www.cjoint.com/c/GFmov3JE8Wm
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
12 juin 2017 à 17:30
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
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

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

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
12 juin 2017 à 21:21
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