Fichier obèse après Copy/Paste

Bonjour,

Aussi brillant que je peux l'être, j'ai récupéré un bout de code pour procéder à un copy/paste des valeurs d'une feuille vers d'autres feuilles en fonction des valeurs disponibles dans le filtre.

Ma feuille SOURCE contient des centaines de lignes avec à la première colonne le nom de la direction (ex: Nord, Sud, Est, Ouest)

Le code me permet de créer une feuille par direction avec les données respectives pour cette direction. Je me retrouve donc avec 4 feuilles supplémentaires dans mon fichier.

Tout fonctionne bien sauf que, la macro à le même effet que le service militaire pour Elvis Presley, il passe de 3Mo à l'origine et se retrouve faire 80Mo après traitement par la macro

Si quelqu'un peut me pointer la source du problème que j'imagine est une plage trop importante. Merci

En sachant que la plage à copier dans la feuille source va de la colonne A à AH et pour un maximum 20000 lignes

** J'ajouterai un fichier un peu plus tard, il faut que je supprime pas mal de données et d'éléments d'identification avant de le faire *****

Voici le code que j'utilise:

Public Sub FilterThenCopy()
   Dim ws, newWS, currentWS As Worksheet
   targetCol = 1   'definition de la colonne sur laquelle appliquer l'Autofilter
   Dim objDict As Variant
   Set objDict = CreateObject("Scripting.Dictionary")
   Set currentWS = ActiveSheet
   'Add unique value in targetCol to the dictionary
   Application.DisplayAlerts = False
   For r = 2 To Cells(Rows.Count, targetCol).End(xlUp).Row
     If Not objDict.exists(Cells(r, targetCol).Value) Then
       objDict.Add Cells(r, targetCol).Value, Cells(r, targetCol).Value
     End If
   Next r

  If currentWS.AutoFilterMode = True Then
     currentWS.UsedRange.AutoFilter
  End If
  currentWS.UsedRange.AutoFilter
  For Each k In objDict.Keys
    currentWS.UsedRange.AutoFilter field:=1, Criteria1:=objDict.Item(k)
   'Supprimer worksheet si worksheet avec le nom de item(k) existe déjà
    For Each ws In ActiveWorkbook.Worksheets
      If wsExists(objDict.Item(k)) Then
        Sheets(objDict.Item(k)).Delete
      End If
    Next ws
   'Créer une nouvelle page portant le nom de l'item item(k)
    Set newWS = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
    newWS.Name = objDict.Item(k)
   'Copier le contenu filtré vers la nouvelle feuille
    currentWS.Cells.Copy
    newWS.Range("A1").Select
    Sheets(objDict.Item(k)).Paste
  Next k
  currentWS.Activate
  currentWS.AutoFilterMode = False
  Application.DisplayAlerts = True
End Sub

Bonsoir,

remplacer :

    currentWS.Cells.Copy
    newWS.Range("A1").Select
    Sheets(objDict.Item(k)).Past

par

currentWS.SpecialCells(xlCellTypeVisible).Copy newWS.Range("A1")

Merci.

Ça semble faire planter l'exécution avec un message d'erreur de compilation

Membre de méthode ou de données introuvable sur .specialCells

Je vais regarder ça à tête reposée et je vous reviens avec des nouvelles

Merci

exact car petit oubli …. Ceci sera mieux :

currentWS.Cells.SpecialCells(xlCellTypeVisible).Copy newWS.Range("A1")

Merci

Cette fois-ci la macro tourne correctement mais j'ai toujours mon problème d'obésité post traitement.

Obésité dans le sens aérophagie parce que la taille ducfichier semble provenir des lignes vides créées par la copie dans chacune des nouvelles feuilles.

J'ai fait dans chacune d'elles un F5>Cellules...>Cellules vides et suppression et après Enregistrement, le fichier retrouve son poids normal.

Sans ça et comme illustré ci-dessous chaque feuille comprend plus de 1 millions de lignes.

2018 09 13 forumxl

sans objet

bonjour

salut au passage thev

pourquoi copier/coller ?

c'est par principe une mauvaise gestion de données

il vaut mieux faire, selon ton BUT :

  • un filtre
  • un TCD
  • une extraction par Power Query (à télécharger gratuit, il est inclus dans les Excel plus récents)
  • une analyse par Power BI Desktop gratuit

quel est le BUT de ton travail avec Excel ?

Bonjour,

Moi, il y une chose qui me gêne : L'utilisation de UsedRange.

La plage doit être définie.

Cdlt.

Bonjour Jean-Eric,

Je ne vois pas ce qui gêne avec l'utilisation de UsedRange. Cela définit la plage utilisée.

L'intérêt pour moi de préciser la plage à laquelle s'applique les filtres est pour des cas non standards :

1- le cas où la cellule A1 n'est pas utilisée., ce qui permet de savoir à quoi correspond Field1, Field2, ...

2- le cas où il s'agit d'une plage plus restreinte que celle utilisée.

Bonjour à tous et merci pour vos réponses.

À la question

quel est le BUT de ton travail avec Excel ?

L'objectif de ce traitement et d'utiliser un fichier maître alimenté par des TCD. La feuille principale de ce fichier est un mixe du résultat d'un TCD avec des formules appliquées sur chacune des colonnes. Ce fichier est mis à jour sur une base régulière après extraction de données de systèmes Web.

L'objectif final est de produire un fichier (valeurs seulement) par valeur existante dans le filtre de la colonne A. Ce fichier doit être déposé dans un répertoire réseau pour devinez quoi ? Et oui, devenir la source de TCD pour d'autres fichiers Excel.

C'est une usine à gaz je sais mais, j'arrive dans ce m.... et je dois patcher pour que minimalement ça marche le temps de revoir le processus

re à tous

à court terme, courage

dans quelques temps, tu auras un fichier de données extrait du web (format csv si possible, mieux que xls(x) )

et un ou des fichiers avec des TCD qui lisent les données quasi directement dans ce fichier.

(Power Query est le roi)

bon travail

Merci, j'ai bien hâte de me passer de tout ça !

Rechercher des sujets similaires à "fichier obese copy paste"