IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Transfert de lignes d'une feuille à une autre selon un critère


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Par défaut Transfert de lignes d'une feuille à une autre selon un critère
    Bonjour

    Après deux jours de galère, je me décide à venir sur le site car j'ai bon espoir qu'une bonne âme acceptera de me filer un coup de mains ! En effet, complètement autodidacte sur le sujet et n'ayant pas fait de macro depuis 3 ans, je m'y remet et c'est compliqué pour moi ! J'ai parcouru le forum en amont de mon message et j'ai vu des post sur ce sujet et j'ai bien essayé d'adapter le code à mon besoin mais soit ça ne fait pas complètement ce que je veux, soit ça bug !
    Je sais que pour un expert VBA ce sera de la rigolade mais moi j'en chie ! Ca m'intéresse et j'ai envie de comprendre et d'avancer dans mon cheminement mais seule c'est pas évident ! Besoin d'expertise pour comprendre où le bas blesse !

    Voilà, j'ai un fichier Excel avec plusieurs feuilles, dont deux sur lesquelles je souhaite agir.
    La 1ère se nomme "Plan documentaire", la seconde se nomme "Archives". Les deux comportent un tableau de même structure.
    Je souhaite simplement créer une macro que j'affecterai à un bouton pour permettre aux utilisateurs d'archiver dans le tableau de l'onglet "Archives" toutes les lignes présentant le critère "Archivé" en colonne I du tableau de l'onglet "Plan documentaire". Les lignes ainsi copiées dans l'onglet "Archives" devront être supprimées du tableau de l'onglet "Plan documentaire".
    Avec un message box indiquant si c'est possible le nombre de lignes archivées.

    Idéalement j'aimerai avoir la possibilité d'un deuxième bouton macro sur la feuille "Archives" pour restaurer une ligne particulière (archivée par erreur par exemple) vers le tableau d'origine sur la feuille "Plan documentaire" !

    Mes difficultés aujourd'hui avec les différents codes testés
    - soit ça ne colle pas les lignes au bon endroit (en dessous de mon tableau existant et pas dedans.
    - soit ne copie que la ligne de titre mais pas les lignes contenant le critère "Archivés"
    - soit copie bien mais affiche l'erreur VALEUR car les lignes copiées comportent des formules
    - soit il ne supprime pas les lignes dans l'onglet source

    Bref, je me sens nulle en écrivant tout cela !

    Voici le dernier bout de code utilisé et le fichier en pièce jointe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub Transfert()
    Dim LastLig As Long
    Dim cDest As Range
     
    Application.ScreenUpdating = False
    With ThisWorkbook
        'cDest: La celllule de destination: première cellule vide de la colonne A de Archives
        With .Worksheets("Archives")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
        End With
        With .Worksheets("Plan documentaire")
            'Enlève l'éventuel filtre automatique
            .AutoFilterMode = False
            'LastLig, ligne de la dernière cellule remplie de colonne A de Plan documentaire
            LastLig = .Cells(.Rows.Count, "I").End(xlUp).Row
            'On fait un filtre automatique sur la colonne I de Plan documentaire avec comme critère "Archivé"
            .Range("I11:I" & LastLig).AutoFilter field:=1, Criteria1:="Archivé"
            'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
            If .Range("A1:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                With .Range("A1:A" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                    'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                    .Copy cDest
                    'on supprime toutes les lignes visibles (sauf la ligne des titres)
                    .Delete
                End With
            End If
            'on vide notre variable cDest
            Set cDest = Nothing
            'On enlève le filtre automatique
            .AutoFilterMode = False
        End With
    End With
    End Sub
    Copie de FO_Référentiel Documentation_20220523_v3.xlsm

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour marinekali

    Les lignes ainsi copiées dans l'onglet "Archives" devront être supprimées du tableau de l'onglet "Plan documentaire".
    Avec un message box indiquant si c'est possible le nombre de lignes archivées.
    Tu n'étais pas bien loin et je t'ai rajouté le message.

    Idéalement j'aimerai avoir la possibilité d'un deuxième bouton macro sur la feuille "Archives" pour restaurer une ligne particulière
    Je te propose un code avec un double clic sur la ligne à restaurer ce qui évite tout problème de sélection : à toi de voir si cela te convient.
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Par défaut
    Bonjour anasecu

    Mille merci pour le temps que tu m'as consacré.

    Alors :
    - la macro transfert () bug à delete et ne supprime pas les lignes de l'onglet plan après archivage, le filtre reste actif (voir capture)
    - les lignes bien archivées malgré tout dans l'onglet "Archives" se positionnent en dessous du tableau (Mis sous forme de tableau) et non à l'intérieur (voir capture)

    Quant à la macro qui permet de restaurer une ligne, elle fonctionne sauf que :
    - Elle place les lignes restaurées tout à la fin du tableau (bien dans le tb cette fois), j'aurai voulu qu'elles se positionnent plutôt en dessous de la première ligne non vide du tableau.
    - La solution du double-clic me fait un peu peur car si un utilisateur double-clic par erreur, la ligne sera automatiquement restaurée dans l'onglet "Plan"
    - cela risque d'être long aussi s'il y a plusieurs lignes à restaurer en même temps, il va falloir faire autant de double-clic qu'il y a de lignes à restaurer.
    Je me dis que cela pourrait sans doute convenir s'il était possible de valider en amont, la demande de restauration par un msgbox et en sélection unitaire ou multilignes selon le nbre de lignes à restaurer.

    Je ne sais pas si c'est possible, j'imagine que oui mais comment ? Telle est la question ?
    En tout cas, c'est super de trouver des gens tels que vous. Merci beaucoup de l'aide que vous m'avez apporté encore une fois.

    Nom : bug_delete.PNG
Affichages : 1377
Taille : 47,6 KoNom : lignes_non_supprimees_apres_filtre_onglet_plan.PNG
Affichages : 1371
Taille : 35,1 KoNom : ligne_ss_tb.PNG
Affichages : 1357
Taille : 38,5 KoNom : lignes_restaurees_en_dessous_tb.PNG
Affichages : 1354
Taille : 60,9 Ko

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour marinekali

    - la macro transfert () bug à delete et ne supprime pas les lignes de l'onglet plan après archivage, le filtre reste actif (voir capture)
    Curieux ton bug sur delete qui vient peut-être de la version 365 que je n'ai pas car sur 3 autres versions il n'y est pas.

    - les lignes bien archivées malgré tout dans l'onglet "Archives" se positionnent en dessous du tableau (Mis sous forme de tableau) et non à l'intérieur (voir capture)
    Bien entendu car dans ton classeur il n'y a pas de tableau : il faut une ligne en plus du titre pour avoir un tableau

    - Elle place les lignes restaurées tout à la fin du tableau (bien dans le tb cette fois), j'aurai voulu qu'elles se positionnent plutôt en dessous de la première ligne non vide du tableau.
    Dans un tableau structuré avec formules il n'y a pas de ligne vide : la première cellule "état" vide ?

    - La solution du double-clic me fait un peu peur car si un utilisateur double-clic par erreur, la ligne sera automatiquement restaurée dans l'onglet "Plan"
    - cela risque d'être long aussi s'il y a plusieurs lignes à restaurer en même temps, il va falloir faire autant de double-clic qu'il y a de lignes à restaurer.
    Je me dis que cela pourrait sans doute convenir s'il était possible de valider en amont, la demande de restauration par un msgbox et en sélection unitaire ou multilignes selon le nbre de lignes à restaurer.
    autant de double-clic qu'il y a de lignes à restaurer c'est vrai mais même avec l'usine à gaz que tu imagines (attention l'on en manque ) tu espères utiliser quoi pour sélectionner les lignes à restaurer ?

    à part cliquer sur chaque ligne à restaurer avec un doigt sur ctrl et l'appui sur un bouton pour lancer une macro complexe pour faire au plus simple : dis moi le temps que tu vas gagner et le nombre d'erreur de restaures que tu vas éviter .

    Comme tu utilises les tableaux structurés autant aller jusqu'au bout et les utiliser aussi dans les macros.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Option Explicit
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim lig As Long
        If Target.Rows.CountLarge = 1 Then
                ' tableau de restauration
            With ThisWorkbook.Worksheets("Plan documentaire").ListObjects("Tableau1")
                ' double clic sur tableau à restaurer ?
                If Not Intersect(Target, Range("Tableau2")) Is Nothing And Cells(Target.Row, "I").Value = "Archivé" Then
                    lig = 1
                    ' recherche première ligne avec état vide
                    While .DataBodyRange.Item(lig, 9).Value <> ""
                        lig = lig + 1
                    Wend
                    ' ajout ligne
                    .ListRows.Add lig
                    ' copie ligne
                    Rows(Target.Row).Copy Destination:=.DataBodyRange.Item(lig, 1)
                    ' suppression archive
                    Rows(Target.Row).Delete
                End If
            End With
            Cancel = True
        End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Option Explicit
    Sub Transfert()
    Dim lig As Long
    Dim nba As Long
    Dim wa As Worksheet
    Dim wp As Worksheet
        'On affecte les feuilles concernées
        Set wa = ThisWorkbook.Worksheets("Archives")
        Set wp = ThisWorkbook.Worksheets("Plan documentaire")
        'On fait un filtre automatique sur la colonne I de Plan documentaire avec comme critère "Archivé"
        wp.ListObjects("Tableau1").Range.AutoFilter Field:=9, Criteria1:="Archivé"
        'On compte les sélections du tableau
        On Error Resume Next
        nba = wp.ListObjects("Tableau1").DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count
        On Error GoTo 0: Err.Clear
        'Si au moins une ligne résultat du filtre
        If nba > 1 Then
            With wp.ListObjects("Tableau1").DataBodyRange.SpecialCells(xlCellTypeVisible).Rows
                    ' On crée les lignes à insérer dans le tableau
                For lig = 1 To nba
                    wa.ListObjects("Tableau2").ListRows.Add (1)
                Next lig
                    'On copie toutes les lignes visibles vers Archives
                .Copy wa.ListObjects("Tableau2").DataBodyRange.Item(1, 1)
                    'et on supprime toutes les lignes visibles
                .Rows.EntireRow.Delete
            End With
        End If
        'On enlève le filtre automatique
        wp.ListObjects("Tableau1").Range.AutoFilter Field:=9
        MsgBox nba & " lignes archivées"
        Set wa = Nothing
        Set wp = Nothing
    End Sub
    C'est ce que je te propose dans le nouveau code du classeur joint : à toi de voir s'il te convient.

    Bon test et bonne soirée
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2017, 10h11
  2. [XL-2010] Transfert de lignes d'une feuille à l'autre - VBA
    Par Paul_DRU dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/04/2017, 09h08
  3. [Toutes versions] Vba: Copier des lignes sur une autre feuille
    Par yassxavi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/02/2015, 12h48
  4. Transfert de lignes sur une autre feuille
    Par rakel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/04/2010, 19h52
  5. [VBA-E]Effacer ligne si une autre ligne est identique
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/08/2006, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo