Soucis avec copie vers une autre feuille

Bonjour à tous,

Je vous explique, j'ai un code qui copie certaines lignes, sélectionnées par filtre automatique, dans une autre feuille du classeur.

Cela fonctionne très bien, sauf lorsqu'il y a des données dans la colonne A des lignes filtrées.

Dans ce cas, si je fais fonctionner la macro plusieurs fois, elle me copie à chaque fois toutes les lignes qui répondent au critères du filtre automatique même si elles ont déjà été filtrées et copiées dans la nouvelle feuille.

Alors que lorsque aucune donnée n'est présente en colonne A, la macro ne copie pas les lignes déjà filtrées et copiées dans la nouvelle feuille.

Vous pensez que je peux trouver une solution avec une petite modification du code ?

      Sub MOBILETEST()
        ActiveSheet.Unprotect "6464"
        Dim LastLig As Long
        Dim cDest As Range
        Application.ScreenUpdating = False
        'cDest: La celllule de destination: première cellule vide de la colonne A de Mobiles
       With Worksheets("Mobiles")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
        End With
        With ActiveSheet
            'Enlève l'éventuel filtre automatique
           .AutoFilterMode = False
            'LastLig, ligne de la dernière cellule remplie de colonne D de la feuille active
           LastLig = .Cells(.Rows.Count, "D").End(xlUp).Row
            'On fait un filtre automatique sur la colonne D de la feuille active
           .Range("D2:D" & LastLig).AutoFilter Field:=1, Criteria1:=">11999999999"
            'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
           If .Range("A2:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                With .Range("A3:AO" & LastLig).SpecialCells(xlCellTypeVisible)
                    'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                   .Copy cDest
                   ActiveSheet.AutoFilterMode = False
                End With
            End If
         End With
        Application.ScreenUpdating = True
        ActiveSheet.Protect "6464", True, True, True
    End Sub

Merci d'avance pour votre soutien !

ps : je suis plus que novice en VBA et n'en ai même pas encore saisi toutes les bases, merci de votre indulgence..

Bonsoir,

Le texte de la macro ne permet pas de voir ce qui est filtré !

On voit seulement que tu filtres a-priori sur la colonne A.

Quoi que ce soit qui soit filtré, si tu actives la macro plusieurs fois, elle copiera à chaque fois ce qui est filtré, à la suite de ce qui a déjà été copié. Avec le même filtrage, tu devrais toujours copier la même chose si ta base n'est pas modifiée.

Cordialement.

Bonsoir et merci pour ton aide =)

Le filtre ne porte pas sur la colonne A mais sur la colonne D.

(j'avais oublié de modifier ce point dans la note du code, [que je l'utilise au départ pour une autre fonction] ).

Ce que je ne comprend pas, c'est pourquoi est ce que la macro copie a chaque fois ce qui est filtré, à la suite de ce qui a déjà été copié, lorsque des données sont présentent dans la colonne A.

Alors que lorsqu'il n'y a pas de données présentent dans la colonne A, la macro ne copie plus ce qui a déjà été copié lorsque je re-active la macro.

Et j'aimerais qu'elle ne les copie qu'une fois même s'il y a des données dans la colonne A ..

Aucun filtre ne porte sur cette colonne dans ce code pourtant, ou alors je passe a coté ?

Sans voir [bis], je maintiens intégralement ce que j'ai dit !

(Tu n'as pas l'air de bien savoir comment ça fonctionne...)

Autant pour moi ! Comme tu dis, je ne saisi pas tout..

Voici un fichier en pièce jointe, j'ai préparé le test sur la feuille "Janvier" et cela se copie dans la feuille "Mobiles" (j'ai supprimer les autres mois de l'année ainsi que toutes les autres feuilles pour alléger)

Désolé, j'aurai dû le partager plus tôt..

La macro cherche les lignes dont les données en colonne "D" commence par "120" et les copie dans la feuille "Mobiles".

Tu peux activer plusieurs fois la macro (via son bouton dédié) et elle ne copiera qu'une seule fois les données.

Par contre, si tu rempli la colonne A d'une des lignes qui comporte une donnée commençant par "120" en colonne "D" et que tu active la macro, tu va voir que dans ce cas elle copie plusieurs fois les données.

Tu peux activer plusieurs fois la macro (via son bouton dédié) et elle ne copiera qu'une seule fois les données.

Non ! elle les copie à chaque fois, seulement comme tu cherches à quel endroit coller sur la feuille Mobiles dans la colonne A, tant que celle-ci est vide, elle les colle toujours au même endroit.

Si tu appliques cette procédure à partir d'une autre feuille, elle te remplacera de la même façon les données précédentes par de nouvelles...

C'est cela qui me semble être le problème de ton code, et non l'inverse que tu soulevais, car qu'elle copie plusieurs fois la même chose si tu actionnes plusieurs fois la même commande, normal ! à toi de savoir ce que tu fais et ne pas copier plusieurs fois ! Par contre qu'elle risque de t'effacer des données antérieures en les remplaçant par d'autres de façon impromptue, c'est un vrai problème !

Il n'y a que 2 colonnes en l'état de ta base sur lesquelles on peut tester le dimensionnement de façon valide, la B et la D. Je ne saurais trop te conseiller de modifier le test sur la colonne A au profit de B ou D.

Cordialement.

Ah oui merci, je commence a y voir un peu plus clair..

Cependant je n'ai pas trop compris ton conseil :

Il n'y a que 2 colonnes en l'état de ta base sur lesquelles on peut tester le dimensionnement de façon valide, la B et la D. Je ne saurais trop te conseiller de modifier le test sur la colonne A au profit de B ou D.

Car il n'y a pas de filtrage sur la colonne A ...

J'ai tout de même essayé de remplacer la colonne A par la B ou D dans le code pour la feuille "Mobiles", mais cela ne fonctionne évidemment pas.

Je n'ai décidément pas compris le conseil de modifier le test sur la colonne A au profit de la B ou D

Mais au vue de l'éclaircissement que tu m'as apporté, je pense que la fonction désirée ne sera pas possible en modifiant ce code, il faudrait le revoir complètement, c'est bien ca ?

C'est cette ligne qui est à modifier :

     With Worksheets("Mobiles")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
     End With

Il faut que tu la modifies ainsi :

Set cDest = .Cells(.Rows.Count, "B").End(xlUp)(2, 0)

(N'oublie pas le (2, 0) au lieu de (2))

Je teste de suite et reviens vers toi =)

Edit :

Cela ne change pas, le résultat reste malheureusement le même..

d'ailleurs c'est bien la modification que j'avais testé sauf que je n'avais pas mis le 0 et dans ce cas là ca ne faisait que décaler le résultat de la copie/

Cela ne change pas, le résultat reste malheureusement le même.

Si tu entends par là que si tu actionnes 2 fois la macro, tu as 2 fois l'inscription, heureusement !!!

L'anomalie était que tu ne l'aies pas autant de fois que tu l'actionnes ! Car cela signifiait que cela effaçait tes données antérieures, effacement nécessairement non voulu.

Si cet effacement est volontaire, c'est à dire si à chaque fois tu veux effacer et remplacer ce qui existait précédemment, il faut le faire autrement : effacer systématiquement l'existant avec une commande dédiée, et coller systématiquement à partir de A2 et non de la première ligne vide !

Cordialement.

Désolé de revenir si tard, j'ai eu des soucis avec ma connexion..

Effacer et remplacer à chaque fois aurait été une solution, si je travaillais sur une seule feuille.. Mais ici c'est le résultats de plusieurs feuilles qui se retrouve dans la feuille "mobiles", du coup ca n'irait pas.

Mais je te remercie pour tes éclaircissement !

Justement alors, tu confirmes la nécessité de la modification que j'ai proposé.

Cordialement.

Rechercher des sujets similaires à "soucis copie feuille"