Résolu XL 2016 VBA Copier des cellules d'une feuille à une autre

Dudu2

XLDnaute Accro
Bonjour,

Ce problème apparemment simple est devenu bloquant pour moi.

Il s'agit principalement de copier un Range dans lequel il y a des données filtrées (masquées par le filtre), donc une ou des lignes filtrées. Et secondairement où il y a une ou des colonnes masquées.

Le comportement d'Excel est surprenant:
- Si une ou des lignes sont filtrées, le .Copy ne prend pas les lignes filtrées. Ok !
- Si pas lignes filtrées et des colonnes masquées, le .Copy prend les colonnes masquées.
- Par contre si des lignes sont filtrées et des colonnes masquées, le .Copy ne prend pas les colonnes masquées.

Je voudrais copier tout le Range, ligne(s) filtrée(s) ou pas, colonne(s) masquée(s) ou pas.
Merci par avance
 
Ce fil a été résolu! Aller à la solution…

Fichiers joints

Dernière édition:

youky(BJ)

XLDnaute Barbatruc
Bonjour Dudu,
ceci fonctionne et c'est simple
Feuil3 est le codeName et non le nom donné à l'onglet
Sub a()
Feuil3.[A2:D4].Value = Feuil1.[A2:D4].Value
End Sub

Bruno
Edit: Quelle galère ces émoticônes
 

Dudu2

XLDnaute Accro
J'ai bien un système de suppression / restoration des filtres que je peux utiliser pour protéger le .Copy mais j'aurais voulu faire autrement. Après avoir visité des forums divers, je crois qu'il n'y a aucune option possible sinon copier tous les éléments de formats cellule par cellule ce qui est complexe et laborieux.
 

job75

XLDnaute Barbatruc
Bonjour Dudu2, Bruno, François,

Copier-coller chaque cellule est très simple mais prendra du temps :
VB:
Sub Copier()
Dim c As Range
With Feuil3 'CodeName de la feuille de destination
    .Cells.Delete 'RAZ
    For Each c In Feuil1.[A1].CurrentRegion
        c.Copy .Range(c.Address)
    Next
    .Activate
End With
End Sub
A+
 
Ce message a été identifié comme étant une solution!

Fichiers joints

job75

XLDnaute Barbatruc
Pour tester j'ai copié le tableau A2: D4 sur "seulement" 3000 lignes.

La macro s'exécute chez moi en 58 secondes (46 s avec Application.ScreenUpdating = False).
 

Dudu2

XLDnaute Accro
Bonjour job75,

Merci pour ta proposition.
Je me suis demandé si CurrentRegion ou les Codename avaient quelque chose à voir mais non, car c'est le principe de copie de cellule par cellule que tu utilises qui fait que ça fonctionne.

Effectivement, cela s'applique à de petits Range. Mais ça marche bien.
Je trouve assez dommage que VBA n'ait pas une option SpecialCells(xlAllCells) par exemple pour référencer toutes les cellules à copier puisqu'il y a une option SpecialCells(xlCellTypeVisible).

VB:
Sub Copier()
    Dim c As Range

    With ThisWorkbook.Worksheets(2)
        .Range("A2:D4").ClearContents
        
        For Each c In ThisWorkbook.Worksheets(1).Range("A2:D4").Cells
            c.Copy .Range(c.Address)
        Next
        .Activate
    End With
End Sub
 

Dudu2

XLDnaute Accro
Dans ce classeur, j'ai résumé les 4 options de .Copy:
- Range.Copy (ne fonctionne pas).
- Cellule par cellule (fonctionne, mais préférablement pour de "petits" Range).
- Range.Copy protégé par suppression / restoration des filtres (fonctionne).
- Range.Copy à partir d'une feuille source copiée dans un classeur temporaire et débarrassée de ses filtres (fonctionne).

Merci encore à tous les contributeurs.
 

Fichiers joints

Dernière édition:

job75

XLDnaute Barbatruc
Il y a bien mieux, voyez ce fichier (2) et la macro :
VB:
Sub Copier()
Dim F As Worksheet
Application.ScreenUpdating = False
Set F = Feuil3 'CodeName de la feuille de destination
F.Cells.Delete 'RAZ
Feuil1.Copy 'document auxiliaire
With ActiveSheet
    .AutoFilterMode = False 'retire le filtre automatique
    .Columns.Hidden = False 'affiche toutes les colonnes
    .[A1].CurrentRegion.Copy F.[A1] 'copier-coller
    .Parent.Close False 'ferme le document auxiliaire
End With
F.Activate
End Sub
Testée sur 60 000 lignes la macro s'exécute chez moi en 0,6 seconde.
 

Fichiers joints

Dudu2

XLDnaute Accro
C'est une solution intéressante.
Feuil1.Copy créé un nouveau classeur.
Pourquoi tu ne passes pas par une feuille temporaire dans le même classeur ?
 
Dernière édition:

Dudu2

XLDnaute Accro
J'ai modifié le fichier du message #9 pour inclure cette solution et amélioré au passage la suppression / restoration des filtres en la rendant multi-feuilles.
 

Dudu2

XLDnaute Accro
Dans la solution de suppression temporaire du filtrage, il y a un bug dans le code que j'avais récupéré sur Internet lorsque l'Operator du filtre = 7.

J'ai corrigé / amélioré et en ai profité pour intégrer dans un Module_GestionDesFiltres des fonctions qui me sont utiles (et pourraient l'être pour d'autres), car les filtres sous Excel, c'est pas de la tarte !
Ils impactent les .Copy, les .Delete, les tris en VBA et sans doute plus. Donc il faut vraiement s'en méfier.

D'autant que, comme indiqué, créer un filtre (manuellement ou pas) sur une colonne ne le créé par sur la colonne. Excel bidouille son Range de filtrage qui semble être limité au UsedRange de la feuille (?).
En manipant, on arrive facilement à une situation où une valeur ajoutée dans le colonne n'est pas vue pas le filtre car hors du Range en question. Les fonctions du Module_GestionDesFiltres donnent des options pour gérer ça.

Toujours dans le fichier du message #9 modifié.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas