Copier/ coller (ou pas) suivant plusieurs critères

Bonjour le forum !

Je reviens vers vous une nouvelle fois pour essayer de trouver une solution à mon problème. J'ai créé un post en début de semaine pour un problème qui y ressemble, mais comme mon chef attend mon moi un outil plus simple, cela doit passer par une macro plus compliquée... J'ai cherché à simplifier mon problème en plusieurs parties, mais tout mettre en une seule macro est malheureusement trop compliqué pour moi...

[Après relecture, j'ai vraiment l'impression de vous proposer un défi la... ]

Je vous explique mon problème en entier, pour vous donner une vue d'ensemble. Si vous avez ne serait-ce que des pistes pour m'aider à avancer je vous en serai plus que reconnaissante !

Sur ma première feuille "Tab_gen_AE", j'ai un tableau en deux parties. La première comprend cinq colonnes, et ses lignes sont toutes différentes. La seconde est constituée d'une répétitions de colonnes représentant des agences pour lesquelles je précise à chaque ligne "Concerné" ou "Non concerné".

Mon but est de copier/coller les lignes dans ma seconde feuille "Hiérarchisation_AE" autant de fois qu'elle "concerne" une agence, en précisant en première colonne son nom (colonne M).

Ensuite, je souhaiterai pouvoir "mettre à jour" mon outil. C'est à dire que si dans ma première feuille une agence passe de "Non concerné" à "Concerné", elle doit pouvoir s'incrémenter à la suite de mon tableau sans interagir avec le reste. Je précise qu'à la suite de chaque ligne collée j'effectue d'autres opérations, et si ça bouge ou si le tableau se décale je ne pourrais pas récupérer ça manuellement.

Dans cette mise à jour, à l'inverse, si une ligne passe de "Concerné" à "Non concerné", elle ne doit pas être supprimée mais la mention "Clos" doit être inscrite pour la ligne dans la colonne S.

Et (pour finir), comme j'aurai travaillé sur chaque ligne et indiqué des informations pour chacune d'entre-elles, je ne dois pas les perdre lors de la "mise à jour". Par exemple, si une agence est déjà passée dans la seconde feuille et qu'elle est toujours "concernée", on n'y touche pas...

Voilà, j'ai vraiment l'impression que c'est compliqué par rapport à mes problèmes précédents, une sorte de défi que l'on pourrait essayer de surmonter ? Comme d'habitude, je vous ai mis en fichier joint une version allégée de mon fichier... Il y a beaucoup plus de lignes dans le premier fichier, et de nombreuses agences...

Un grand merci d'avance pour votre aide, je sais que ça ne se résoudra pas en 3 posts mais je compte bien y arriver !!

Cordialement,

Mareelo54

27ae-3-1-copie.xlsm (40.09 Ko)

Le défi n'a rien d'insurmontable. Essaie de compléter ce début (macro dans la feuille "Tab_gen_AE") :

Dim oldVal As String

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim iRow As Integer
    Dim iCol As Integer
    Dim newVal As String
    Dim xlSheet As Worksheet
    Dim dernLigne As Integer

    iRow = Target.Row
    iCol = Target.Column

    If (iCol < 6) And (iCol > 8) Then Exit Sub

    newVal = Target.Value

    If newVal = oldVal Then Exit Sub

    ' On détecte ici un changment de valeur dans la cellule

    Set xlSheetH = ThisWorkbook.Worksheets(2)

    If newVal = "Concerné" Then

        ' On incrémente à la suite du tableau
        dernLigne = xlSheetH.Range("M" & Rows.Count).End(xlUp).Row + 1

        xlSheetH.Range("M" & dernLigne).Value = Range(Cells(9, iCol), Cells(9, iCol)).Value
        xlSheetH.Range("N" & dernLigne).Value = Range("A" & iRow).Value
        xlSheetH.Range("O" & dernLigne).Value = Range("B" & iRow).Value
        xlSheetH.Range("P" & dernLigne).Value = Range("C" & iRow).Value

        ' ... et ainsi de suite aver les autres valeurs données

    ElseIf newVal = "Non concerné" Then

        ' Ici on recherche la ligne modifiée et on passe la valeur de la colonne S à Clos
        '

    End If

     Set xlSheetH = Nothing

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    oldVal = Target.Value

End Sub

Merci !! Je vais me pencher là-dessus sérieusement et revenir si je suis bloquée...

Et merci aussi pour les explications ! Je commence à piger quelques trucs en vba mais la ça va être plus simple

Voilà pour la recherche, à fignoler :

Dim oldVal As String
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim iRow As Integer
    Dim iCol As Integer
    Dim newVal As String
    Dim xlSheet As Worksheet
    Dim dernLigne As Integer
    Dim err As String

    iRow = Target.Row
    iCol = Target.Column

    If (iCol < 6) And (iCol > 8) Then Exit Sub

    newVal = Target.Value

    If newVal = oldVal Then Exit Sub

    ' On détecte ici un changment de valeur dans la cellule

    Set xlSheetH = ThisWorkbook.Worksheets(2)
    dernLigne = xlSheetH.Range("M" & Rows.Count).End(xlUp).Row + 1

    If newVal = "Concerné" Then

        ' On incrémente à la suite du tableau

        xlSheetH.Range("M" & dernLigne).Value = Range(Cells(9, iCol), Cells(9, iCol)).Value
        xlSheetH.Range("N" & dernLigne).Value = Range("A" & iRow).Value
        xlSheetH.Range("O" & dernLigne).Value = Range("B" & iRow).Value
        xlSheetH.Range("P" & dernLigne).Value = Range("C" & iRow).Value
        xlSheetH.Range("Q" & dernLigne).Value = Range("D" & iRow).Value
        xlSheetH.Range("R" & dernLigne).Value = Range("E" & iRow).Value
        xlSheetH.Range("S" & dernLigne).Value = "ACTIF"

        ' ... et ainsi de suite aver les autres valeurs données

    ElseIf newVal = "Non concerné" Then

        ' Ici on recherche la ligne modifiée et on passe la valeur de la colonne S à Clos
        If dernLigne <= 33 Then Exit Sub
        tbl = xlSheetH.Range("M33:R" & dernLigne - 1).Value

        For i = 1 To UBound(tbl)

            trouve = True

            If tbl(i, 1) = Range(Cells(9, iCol), Cells(9, iCol)).Value Then

                For j = 2 To 5

                    If Not tbl(i, j) = Range(Cells(iRow, j - 1), Cells(iRow, j - 1)).Value Then
                        trouve = False
                        Exit For
                    End If

                Next

            Else: trouve = False
            End If

            If trouve = True Then
                xlSheetH.Range("S" & i + 32).Value = "CLOS"
                Exit For ' à enlever s'il peut y avoir des doublons dans les lignes
            End If

        Next

    End If

     Set xlSheetH = Nothing
    oldVal = newVal
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    On Error Resume Next
    oldVal = Target.Value

End Sub

Bonjour bonjour le forum !

J'ai essayé de travailler sur la macro que Geeib m'a proposé, mais avant tout j'ai essayé de la lancer.... sans succès.

C'est certainement une subtilité que je ne connais encore pas, mais au moment de la lancer Excel me demande quelle macro utiliser parmi les autres macros de mon outil qui n'ont strictement rien à voir avec celle-ci. Et effectivement, je n'ai pas de "nom" pour cette macro, elle commence directement par :

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim oldVal As String
    Dim iRow As Integer

J'ai pris la liberté de passer "Dim oldVal as String" après le Private Sub, parce-que ça me le mettait au dessus, et donc séparé par une ligne (quand c'est séparé, ça veut bien dire que ça fait partie d'une autre macro non ?)

Je pense réussir à avancer un peu toute seule, mais sans pouvoir lancer la macro je ne peux pas voir où elle coince...

Merci d'avance pour votre aide, et bonne journée à vous !

Tu dois copier la macro sur la feuille "Tab_gen_AE". Et oldVal doit être placé à l'extérieur car sa portée s'étend à toute la feuille.

C'est ce que j'ai fait, elle est au bon endroit, j'ai remis le "OldVal" plus haut, mais rien ne change...

Toujours au moment de lancer la macro ça me renvoie à mes deux autres macros, comme si celle-ci n'existe pas... J'ai même enlevé le "Private" des fois que ça y fasse quelque chose, mais rien du tout...

Je vous mets je fichier en pièce jointe, il n'y a toujours rien de confidentiel dedans...

20ae-3-0-copie.xlsm (61.92 Ko)

Le fichier que tu utilises n'est pas le même que celui de ton premier post. J'ai modifié la macro en conséquence.

48ae-3-0-copie.xlsm (63.16 Ko)

Merci ! Effectivement le fichier a été légèrement modifié mais ça ne résout pas entièrement mon problème...

J'ai toujours le même problème qui s'affiche (cf fichier joint), et même si la macro a fonctionné deux fois avant de me remettre ce message, je ne vois pas comment je pourrais créer un bouton pour lancer cette macro vu qu'elle n'est pas reconnue dans excel (toujours que deux macros disponibles dans le menu "macro")

Encore merci de m'aider, j'ai l'impression de m'être lancée dans quelque chose de trop compliqué pour moi... Si je n'arrive pas à comprendre et régler tout ça je trouverai une autre solution (manuelle). Je n'ai pas envie de vous faire perdre votre temps...

image erreur

Ce n'est pas une macro qui se lance manuellement. Elle s'exécute automatiquement à chaque modification sur la page "Tab_gen_AE".

Plus précisément elle résonne comme ça :

- A chaque fois que tu sélectionnes une cellule, son contenu est stockée dans la variable oldVal.

- A chaque fois que tu écrit dans une cellule, la routine Worksheet_Change compare la variable oldVal avec ce que tu viens d'écrire (newVal). Si tu viens d'écrire "concerné" et que oldVal était différent de "concerné" alors la ligne est copiée dans ton tableau.

Edit: pour préciser. Lorsque tu modifies une cellule sur ta feuille, la routine Worksheet_Change est automatiquement appelée avec en argument la cellule modifiée (la variable Target).

Evidemment si tu modifies plusieurs cellules en même temps ça ne marchera pas (il faudrait adapter le code).

Bonjour Mareelo,

je ne suis vraiment pas un expert donc je laisserai les experts te confirmer ça mais il semblerait que ta macro s'active au changement de feuille. si tu veux le lancer par un clic bouton ou par un autre procédé, je pense qu'il faut changer ce qu'il y a en haut de ta macro ( workseet et change)

a faire confirmer par des experts

Ah mais génial ! Je ne savais carrément pas que c'était possible de faire des mises à jour "en temps réel" comme sur Access ! Ce n'était pas vraiment ce que je pensais faire au départ, mais ça fonctionne tout aussi bien !

Je continue à bosser dessus et je reviens en cas de besoin

Merci encore !


En fait je ne serais pas l'utilisateur de cet outil (stage forever...) donc suivant ce que mon chef en dira, peut-être que je reviendrai justement pour changer ça !

Mais vraiment c'est bon à savoir ! Découverte excel du jour !

tant mieux si ça marche et que ça a pu t'aider, j'en serais même flatté car je ne pensais pas pouvoir aider qui que ce soit sur ce forum

Bonjour !

Bon, j'ai travaillé à dépiauter cette macro pour essayer de comprendre comment elle fonctionne, et j'ai quasiment tout compris (je relancerai ce sujet plus tard, une fois que la macro sera entièrement terminée, pour mettre plein de commentaires partout et pouvoir laisser mon chef en paix avec VBA)

Sinon, elle fonctionne parfaitement mais j'aurai besoin d'une modification (encore...).

En fait dans l'utilisation qui sera faite de l'outil, il y a un risque qu'on mette une ligne "Concerné" pour une agence, alors qu'en fait elle est "Non concernée". Du coup, cette manip fait entrer une ligne et la passe en "Clos", alors qu'en fait elle n'a rien à faire la... :-/

Et de plus (j'ai essayé des cas de figure envisageables), si on supprime une ligne parmi les centaines possibles (volontairement ou involontairement hein), il faut qu'on l'a retrouve dans le premier tableau, qu'on la repasse en "Non concerné" puis en "Concerné" pour qu'elle réapparaisse. Sachant que le but du tableau est de synthétiser des centaines d'infos, retrouver celle qui manque devient un peu compliqué...

Du coup je reviens à mon idée de base qui serait une macro "Bouton" qui incrémente et/ou modifie les lignes du tableau de hiérarchisation uniquement quand on est certain de nos "Concerné" ou "Non concerné".

J'ai essayé aujourd'hui de bricoler quelque chose, mais je ne maîtrise pas les codes pour comparer chaque ligne du tableau de hiérarchisation avec celles du premier tableau...

Si quelqu'un est toujours disponibles pour me donner un coup de pouce...

j'ai pas tout compris mais si ta question est de savoir comment rattacher cette macro qui s’exécute au changement d'onglet à un bouton? si oui à quel endroit voudrai tu mettre ton bouton et comment s'appellerait-il?

C'est en gros l'idée de ce que je voudrais faire... Un bouton sur l'onglet "Tab_gen_AE" qui me lance cette macro. Pour le nom je peux m'en occuper, tu peux mettre "test" en attendant.

Mais j'ai déjà essayé de la transformer en macro qui se lance par un bouton et ça ne fonctionne pas. A mon avis elle n'est pas complète... Dans mon idée (après je suis peut-être à côté..) il faut que la macro vérifie chaque ligne de mon tableau de hiérarchisation pour voir s'il y en a qui sont passées de "Concerné" à "Non concerné", et il faut aussi qu'elle ajoute de nouvelles lignes pour celles qui viennent seulement de passer à "Concerné" dans le premier onglet...

Et j'ai essayé de chercher des macros de ce genre mais j'ai encore du mal avec les If, Then, Else, If Not... Enfin je comprend chaque point si on les prends seuls mais ensemble j'ai plus de mal...

pour la modification de la macro en elle même je ne peut pas t'aider mais pour ce qui est de rajouter un bouton pour l'exécution de la macro voit le fichier joint

j'ai juste créer un nouveau bouton dans la page demandée et recopié le programme dans la nouvelle macro. vois si c'est ce que tu voulais.

14ae-3-2-essai.xlsm (59.35 Ko)

Créer des boutons je sais faire

Je dois partir du boulot la, je reviens demain et je m'y remet pour essayer de trouver la solution,

Merci de ton aide en tous cas !

bon bah désolé

pas compris ce que tu veux en fait, ni si je peux t'aider!!! je vais laisser les experts se saisir du dossier ils seront beaucoup plus efficaces que moi

La macro est appelée à chaque fois que vous modifiez une cellule sur la feuille "Tab_gen_AE" avec en paramètre la plage de cellules qui est modifiée (c'est la variable nommée Target dans le code). A partir de cette cellule on récupère les numéros de ligne et de colonne de la cellule modifié qui vont servir à récupérer les informations à copier.

Du coup la solution du bouton n'est pas viable.

2 solutions :

- Soit tu veux vraiment un bouton, dans ce cas son rôle sera d'actualiser la page 2. Autrement dit, à chaque clic sur le bouton tu efface les données de ta page 2 et tu regénère la page entière.

- Soit tu gardes la la solution actuelle et ajoute une action événementielle sur la page 2. L'idée serait " à chaque fois que je supprime une ligne sur la page, je cherche dans la feuille "Tab_gen_AE" la ligne que j'ai supprimé et je passe la colonne correspondante à 'non concerné'"

Rechercher des sujets similaires à "copier coller pas suivant criteres"