Microsoft 365 Archivage Ligne Tableau sous condition

  • Initiateur de la discussion Initiateur de la discussion eric72
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

eric72

XLDnaute Accro
Bonjour à tous,
Nouveau petit souci!!!
J'ai un Tableau "BDDEffectif" avec une colonne date de Sortie, j'aimerais que lorsque la date est renseignée, ça coupe la ligne et la copie dans mon autre tableau dans archives "TbArchives", j'ai trouvé pas mal d'exemples mais je n'arrive pas à l'adapter.
Quelqu'un peut-il m'aider.
Merci d'avance à tous les cracks d'Excel
Eric
 

Pièces jointes

Bonsoir Éric, bonsoir le forum,

Essaie avec l'événementielle Change ci-dessous à placer dans le composant Feuil1 (Base Effectifs). L'action se fera chaque fois que tu taperas une date dans la colonne Date Sortie :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TS As ListObject 'déclare la variale TS (Tableau structuré Source)
Dim OD As Worksheet 'déclare la variale OD (Onglet Destination)
Dim TD As ListObject 'déclare la variale TD (Tableau structuré Destination)
Dim R As Range 'déclare la variale R (Recherche)
Dim LI As Integer 'déclare la variale LI (LIgne)

Set TS = Me.ListObjects(1) 'définit le tableau structuré source TS
Set OD = Worksheets("Archives") 'définit l'onglet destination OD
Set TD = OD.ListObjects(1) 'définit le tableau structuré destination TD
'si le changement a lieu ailleurs que dans la colonne 38 du tableau structuré source
If Application.Intersect(Target, TS.DataBodyRange.Columns(38)) Is Nothing Then Exit Sub
Set R = TD.DataBodyRange.Columns(1).Find("") 'définit la recherche R (recherche du vide dans la première colonne du tableau structuré destination)
If R Is Nothing Then 'si ocune occurrence trouvée
    TD.ListRows.Add 'ajoute une ligne au tableau structuré destination
    LI = TD.ListRows.Count 'définit la ligne LI
Else 'sinon (au moins une occurrence trouvée)
    LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée - la ligne des en-têtes))
End If 'fin de la condition
TS.DataBodyRange.Rows(Target.Row - TS.HeaderRowRange.Row).Copy TD.DataBodyRange(LI, 1) 'copy la ligne de la date et la colle dans LI
TS.DataBodyRange.Rows(Target.Row - TS.HeaderRowRange.Row).Delete 'supprime la ligne de la date
End Sub
 
Bonjour Robert,
Tout d'abord merci pour la réponse, toutefois je préfèrerais mettre le code dans un module car, la date de sortie est inscrite lors de la modification des infos du salarié et du coup ca beug car il veut modifier une ligne qui n'existe plus dans la base!!!
J'espère être assez clair dans mes explications.
L'avantage du module c'est que je pourrais l'attribuer au bouton quitter de l'userform.
Merci beaucoup
Eric
 
Re,

Je pensais ça aussi mais ta requête était :

j'aimerais que lorsque la date est renseignée, ça coupe la ligne et la copie dans mon autre tableau dans archives
Je regarde ça...

[Édition]
Ça donne :

VB:
Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TS As ListObject 'déclare la variale TS (Tableau structuré Source)
Dim OD As Worksheet 'déclare la variale OD (Onglet Destination)
Dim TD As ListObject 'déclare la variale TD (Tableau structuré Destination)
Dim PL As Range 'déclare la variable PL (Plage)
Dim I As Integer 'déclare la variable I (Incrément)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim R As Range 'déclare la variale R (Recherche)
Dim LI As Integer 'déclare la variale LI (LIgne)

Set OS = Worksheets("Base Effectifs") 'définit l'onglet source OS
Set TS = OS.ListObjects(1) 'définit le tableau structuré source TS
Set OD = Worksheets("Archives") 'définit l'onglet destination OD
Set TD = OD.ListObjects(1) 'définit le tableau structuré destination TD
Set PL = OS.Range("A1") 'initialise la plage PL
For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du tableau structuré TS
    If TS.DataBodyRange(I, 38) <> "" Then 'condition : si la cellule ligne I colonne 38 des données de TS n'est pa vide
        'définit la plage PL (si PL ne contient qu'une seule cellue, la ligne, sinon l'union de PL et de la ligne)
        Set PL = IIf(PL.Cells.Count = 1, TS.DataBodyRange.Rows(I), Application.Union(PL, TS.DataBodyRange.Rows(I)))
        NL = NL + 1 'incrémente NL
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
TD.Resize TD.Range.Resize(TD.ListRows.Count + NL, TD.ListColumns.Count) 'redimensionne le tableau structuré source TS
Set R = TD.DataBodyRange.Columns(1).Find("") 'définit la recherche R (recherche du vide dans la première colonne du tableau structuré destination)
If R Is Nothing Then 'si ocune occurrence trouvée
    TD.ListRows.Add 'ajoute une ligne au tableau structuré destination
    LI = TD.ListRows.Count 'définit la ligne LI
Else 'sinon (au moins une occurrence trouvée)
    LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée - la ligne des en-têtes))
End If 'fin de la condition
PL.Copy TD.DataBodyRange(LI, 1) 'copy la plage PL et la colle dans LI
PL.Delete 'supprime la plage PL
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
208
Réponses
5
Affichages
410
Réponses
10
Affichages
458
Retour