Transfert de données d'une page à l'autre

Bonjour à tous,

Dans le cadre de mon nouveau poste, je cherche à créer un fichier où en fonction d'une réponse dans une cellule la ligne passe dans une autre feuille, cela pour la destruction des dossiers.

ensuite pour la sortie des dossiers, je souhaite que lors de leur sortie la ligne du dossier aille dans "sortie dossier" et lors de son retour il retourne dans son tableau d'origine.

Je suis complètement novice dans les macros et après une semaine d’essais en lisant les forums et les tutos, je craque....

Merci d'avance pour votre aide

14test.xlsx (732.00 Ko)

Bonjour,

Je suppose que lorsque tu mets "OUI" dans la colonne N d'un onglet (sauf Secteurs, et Sortie Dossiers bien sûr), tu souhaites que la ligne soit transférée dans Sortie Dossiers (et supprimée dans l'onglet initial) ?

Merci de le confirmer.

Oui alors oui dans la colonne J pour les mettre dans "destruction" (page selon secteur) et oui dans N pour le mettre dans sortie.

Merci

Tu ajoutes un élément !

Oui dans J ? Je ne vois pas de feuille Destruction ?

Il y a les onglet des services (ASV, Compta, RH....) et à coté, RH à détruire, Compta à détruire....

Chaque service à sa page de destruction....

Voilà qui devrait correspondre :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim Lgn, ws$, n%
    If Target.Column = 10 Or Target.Column = 14 Then
        Select Case Sh.Name
            Case "Secteurs", "Sortie dossier"
            Case Else
                If Target.Column = 10 Then
                    ws = Sh.Name & " à détruire"
                Else
                    ws = "Sortie dossier"
                End If
                If UCase(Target.Value) = "OUI" Then
                    Lgn = Sh.Range("A" & Target.Row).Resize(, 15).Value
                    With Worksheets(ws)
                        n = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                        .Cells(n, 1).Resize(, 15).Value = Lgn
                    End With
                    Application.ScreenUpdating = False
                    Sh.Rows(Target.Row).Delete
                End If
        End Select
    End If
End Sub

Macro évènementielle dans le module ThisWorkbook.

Cordialement.

14titi59-test.xlsm (738.66 Ko)

Je pense que je me suis mal exprimé.

Dans mon fichier il y a des feuilles par secteurs et des feuilles "à détruire" par secteur, je veux que lorsqu'il y a oui dans "A détruire" (dans la feuille RH par exemple), il aille dans la page du secteur à détruire (page RH à détruire) et cela pour chaque secteur (ASV vers ASV à détruire, Compta vers Compta à détruire....)

Puis pour les sortie de dossier, je veux que lorsqu'il y a oui dans "Sortie", la ligne aille dans la page "Sortie dossier" et quand j'enlève le oui, la ligne retourne dans sa feuille d'origine...

Je sais pas si cela est compréhensible, c'est peut être à cause de cette complexité que je galérais..

Merci d'avance

Cordialement

et quand j'enlève le oui, la ligne retourne dans sa feuille d'origine...

Ça, ce n'était pas clairement exprimé ! "retour", c'est vague. On va donc momentanément laisser le "retour" de côté !

Pour le reste, c'est ce que fait la macro : si OUI en J, la ligne va dans X à détruire, et si OUI en N, elle va dans Sortie dossier.

Tu commences par constater que c'est bien le cas, et la suite, ensuite !

Oui, ok, c parce que j'avais mis des protection sur mes feuilles, et une formule qui me met automatiquement le "oui" en J, et là ca ne fonctionnait pas....Je me demande si j'accumule pas trop de demande pour créer ces macros....

Merci beaucoup

Si tu ne mets pas tous les éléments, tu risques d'avoir des surprises...

Le déclenchement est lié à un changement de valeurs des cellules en J ou N. Ce déclenchement n'intervient pas si la valeur est le résultat d'une formule. Dans ce cas on détecte la changement sur ce qui provoque le changement de résultat renvoyé par la formule (il y a toujours quelque chose qui a changé pour modifier le résultat, et on doit remonter à la source)...

Mais vu ta formule en J, il semble que la mention en J doive être traitée séparément, une fois par an, sur déclenchement manuel après le 1er janvier !

Par contre la mention en N est mise manuellement.

Je ne comprends pas bien pourquoi "retour" de documents supprimés, mais en tout cas ce retour n'interviendrait que sur effacement de la colonne N ?

Désolé, ne connaissant pas bien le fonctionnement des macros, je tatonne dans toutes les infos à donner...

Oui il n'y a que pour les sorties de dossier qu'il doit y avoir un "retour" dans sa feuille d'origine...

Je te remercie vraiment de ta patience avec moi

Bonjour,

Il reste un petit problème : une ligne dans Sortie dossier, rien n'indique quelle est la feuille d'origine vers laquelle il faudra faire retour.

Donc : soit tu introduis un élément d'identification qui sera permanent, soit j'ajoute une identification de la feuille origine pour toute ligne transférée dans Sortie dossier, élément qui ne sera présent que dans Sortie dossier.

Cordialement.

Bonjour,

Désolé de répondre qu'aujourd'hui, mais week-end assez chargé....

Pour le retour de la ligne dans son emplacement de départ, je ne sais pas ce qui est le plus simple, sinon je peux faire comme les "A détruire", c'est à dire une feuille "sortie" par secteur, cela ne me dérange pas sur l'utilisation

Merci

Cordialement

Bonsoir,

J'ai conservé les différentes opérations dans la même procédure... Je te laisse tester.

Si tes feuilles sont protégées, il faudra que ajoutes à chaque fois pour les feuilles concernées la déprotection (Unprotect), et la reprotection à l'issue (Protect).

Je conseille de commencer par tester sans protection pour voir si c'est OK pour les différents cas.

Avant de tester il conviendrait aussi de rétablir tes tableaux Excel à la taille des données. Un millier de lignes vide dans un tableau, c'est une mauvaise utilisation de ces tableaux.

Si tu ne le fais pas, tu iras chercher tes "retours" en fin de tableau (après les lignes vides)...

Le code :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim Lgn, ws$, wso$, n%, i%, isect As Range, c As Range
    Set isect = Intersect(Target, Sh.Columns(14))
    If Not isect Is Nothing Then
        Select Case Sh.Name
            Case "Secteurs"
            Case "Sortie dossier"
                For Each c In isect
                    If c.Value = "" Then
                        wso = Sh.Cells(c.Row, 16)
                        Lgn = Sh.Cells(c.Row, 1).Resize(, 15).Value
                        With Worksheets(wso)
                            n = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                            .Cells(n, 1).Resize(, 15).Value = Lgn
                        End With
                    End If
                Next c
                Application.ScreenUpdating = False
                Application.EnableEvents = False
                With Sh
                    n = .Cells(.Rows.Count, 14).End(xlUp).Row
                    For i = n To 3 Step -1
                        'If .Cells(i, 14) = "" Then .Cells(i, 14).EntireRow.Delete
                    Next i
                End With
                Application.EnableEvents = True
            Case Else
                ws = "Sortie dossier"
                wso = Trim(Replace(Sh.Name, "à détruire", ""))
                For Each c In isect
                    If UCase(c.Value) = "OUI" Then
                        Lgn = Sh.Range("A" & c.Row).Resize(, 15).Value
                        With Worksheets(ws)
                            n = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                            .Cells(n, 1).Resize(, 15).Value = Lgn
                            .Cells(n, 16) = wso
                        End With
                    End If
                Next c
                Application.ScreenUpdating = False
                Application.EnableEvents = False
                With Sh
                    n = .Cells(.Rows.Count, 14).End(xlUp).Row
                    For i = n To 3 Step -1
                        If UCase(.Cells(i, 14)) = "OUI" Then .Cells(i, 14).EntireRow.Delete
                    Next i
                End With
                Application.EnableEvents = True
        End Select
        Exit Sub
    End If
    Set isect = Intersect(Target, Sh.Columns(10))
    If Not isect Is Nothing Then
        Select Case Sh.Name
            Case "Secteurs", "Sortie dossier"
            Case Else
                If Sh.Name Like "*à détruire" Then Exit Sub
                ws = Sh.Name & " à détruire"
                For Each c In isect
                    If UCase(c.Value) = "OUI" And c.Offset(, 1) = "" Then
                        Lgn = Sh.Range("A" & c.Row).Resize(, 15).Value
                        With Worksheets(ws)
                            n = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                            .Cells(n, 1).Resize(, 15).Value = Lgn
                        End With
                    End If
                Next c
                Application.ScreenUpdating = False
                Application.EnableEvents = False
                With Sh
                    n = .Cells(.Rows.Count, 10).End(xlUp).Row
                    For i = n To 3 Step -1
                        If UCase(.Cells(i, 10)) = "OUI" And .Cells(i, 11) = "" Then _
                         .Cells(i, 10).EntireRow.Delete
                    Next i
                End With
                Application.EnableEvents = True
        End Select
    End If
End Sub

Cordialement.


8titi59-test.xlsm (700.41 Ko)

Bonjour,

C'est vraiment bien, les fonctionnalités que je cherche sont impeccable.

Pour le retour des lignes dans leur tab d'origine, la forme des cellules ne sont pas garder, je dois modifier qq chose? Tu me conseilles de réduire les tableaux pour le retour des lignes car elles reviennent en bas? Quand la ligne revient dans son tableau, elle reste dans sortie, je dois juste l'effacer manuellement?

Si tu as des idées ou conseil d'optimisation n'hésite pas.

Merci pour tout

Cordialement

Bonjour,

Quand la ligne revient dans son tableau, elle reste dans sortie, je dois juste l'effacer manuellement?

Mes excuses !

J'avais invalidé la ligne pour un test...

                    For i = n To 3 Step -1
                        'If .Cells(i, 14) = "" Then .Cells(i, 14).EntireRow.Delete
                    Next i

Tu supprimes l'apostrophe devant pour la rétablir.

la forme des cellules ne sont pas garder

Que veux-tu dire par là ?

Il y a un message d'erreur quand j'enlève le "oui" dans les sortie (je te le met en PJ)

Pour les cellules, je voulais dire les mises en forme, par exemple les années je les ai mis en texte et quand elles reviennent dans le tableau, elles sont en date

Cordialement

capture

Si tu as testé sur la ligne préexistante dans le fichier, elle n'a pas été mise avec la nouvelle procédure, la colonne P est vide, et l'erreur 9 est donc normale. Il faut éliminer cette ligne.

Pour les années, le format Texte est à éviter, laisser format Standard. Mais je ne comprends pas pourquoi les années se mettent en format date alors que la colonne est au format standard ! Je vais essayer de savoir pourquoi...

Dans cette ligne (que tu trouveras plusieurs fois dans la proc.

n = .Cells(.Rows.Count,1).End(xlUp).Row

il y en 2 dont le nombre surligné est 14 et 1 dont c'est 10.

Pour ces 3 lignes, remplace 14 ou 10 par 1.

(il n'y en a qu'une qui pose problème, mais autant les aligner toutes.)

En mettant les 3 colonnes G H I au format standard, petite amélioration : il n'y a plus que la colonne G qui bascule en format date ! Mais je ne sais toujours pas pourquoi...


En mettant l'ensemble du tableau au format Standard, le problème de format Date disparaît !

Je ne sais comment ni pourquoi, mais il semble bien que ton format Texte y était pour quelque chose !?

En tout cas si le problème se règle ainsi, tu n'as plus qu'à aligner tous les formats de cellule de tes tableaux sur Standard.

Cordialement.

Alors j'ai remplacé les 3 lignes par 1, il me met toujours le même message d'erreur...

Pour les formats, je vais essayer

Cordialement

Rechercher des sujets similaires à "transfert donnees page"