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

Dudu2

XLDnaute Barbatruc
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
 

Pièces jointes

  • VBA Problème Copy.xlsm
    19.8 KB · Affichages: 16
Dernière édition:
Solution
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+

Dudu2

XLDnaute Barbatruc
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+
 

Pièces jointes

  • VBA Problème Copy (1).xlsm
    19.5 KB · Affichages: 5

Dudu2

XLDnaute Barbatruc
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 Barbatruc
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.
 

Pièces jointes

  • VBA Problème Copy avec filtres.xlsm
    40.4 KB · Affichages: 13
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.
 

Pièces jointes

  • VBA Problème Copy (2).xlsm
    20.1 KB · Affichages: 22

Dudu2

XLDnaute Barbatruc
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é.
 

Discussions similaires

Réponses
2
Affichages
99

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof