VBA Copier base de Données Filtrée vers Nouveau classeur

MJ13

XLDnaute Barbatruc
Bonjour à tous

J'ai des bases de données où je fais des extractions. Mais c'est galère de copier le tableau filtré et la mise en forme sur un autre classeur car cela peut s'avérer long et souvent, j'ai un problème de mémoire et je dois tout arrêter et recommencer :(.

Connaissez vous un code qui permettrait de copier une feuille de mon classeur filtré vers un nouveau classeur en copiant la mise en forme, c'est à dire en respectant la taille de mes cellules de mon fichier d'origine et en copiant en valeur et en format? Ouf :eek:

Merci d'avance :).
 

youky(BJ)

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonjour Michel,
Le classeur de destination doit être ouvert
Click avec le bouton droit de la souris à copier et ...Déplacer ou copier
Coche Créer une copie et indique le fichier de destination
et ensuite fait ton filtre ; fait tout cela avec l'enregistreur de macro
On te donnera les indications pour supprimer les lignes filtrées cela doit être facile.
Bruno
 

MJ13

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonjour Bruno

Merci pour ta réponse :).

Je vois un peu ce dont tu me parles, mais je t'assure que sur des grosses bases de données, ce n'est pas si simple à faire et j'ai toujours eu des problèmes de ce type. Alors ce que je demande est faisaible, je le sais , et cela pourrait être utile au plus grand nombre :eek:.

Mais comment faire ? Merci d'avance :).
 

youky(BJ)

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Re,
J'ai fais ce petit fichier avec les explications à l'interieur.
Le filtre et la suppression des lignes masquées restent à voir.
On peut améliorer la macro en demandant de choisir le fichier de destination ou l'onglet à copier.
Et que fait le filtre???
Bruno
 

Pièces jointes

  • MaCopie.xls
    33 KB · Affichages: 190

youky(BJ)

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonsoir,
Je viens de créer un fichier qui te permets de choisir le workbook et la sheet (Source à copier)
Ceci avec boite de dialogue et Listes.
On peut choisir également le fichier de destination
Enfin il suffit de cliquer sur le bouton "Copier Déplacer l'Onglet" et cela se fait tout seul.
L'onglet est copié après le dernier onglet du fichier destination.
Ce fichier peut intéresser certains demandeurs
Pour les filtres, il me faut en savoir plus de ta part pour réaliser la macro.
Bonsoir Michel
Bruno
 

Pièces jointes

  • ClasseurMJ13.xlsm
    49 KB · Affichages: 139
  • ClasseurMJ13.xlsm
    49 KB · Affichages: 136
  • ClasseurMJ13.xlsm
    49 KB · Affichages: 147

youky(BJ)

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonjour à ceux qui passent ici,
Je viens de faire une modif sur le fichier car j'avais oublié que l'on pouvait coller sur "Nouveau Classeur"
Bruno
 

Pièces jointes

  • ClasseurMJ13.xlsm
    53 KB · Affichages: 177
  • ClasseurMJ13.xlsm
    53 KB · Affichages: 187
  • ClasseurMJ13.xlsm
    53 KB · Affichages: 231

MJ13

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonjour Bruno


Merci pour ce fichier qui est super :).

Bon, je me suis dit qu'il fallait faire simple.

Donc voici en gros, ce que j'ai fait. Ce code permet de copier rapidement une feuille en valeur, format et commentaire. J'ai pas utilisé les tableaux (que je ne maîtrise toujours pas :eek:).

Sinon, j'ai pas mis Option Explicit et pas déclaré toutes mes variables.

Voici ce que j'obtiens en temps de traitement pour un fichier d'environ 276 000 lignes sur 5 colonnes.

Nombre de lignes
Temps de traitement (sec)
Option Explicit ?
276000
41
Sans tout déclarer
276000
41
En déclarant tout
Filtre 85000 valeurs
18
Sans tout déclarer
Filtre 85000 valeurs
18
En déclarant tout


Et le temps pour copier un classeur avec la première et la dernière cellule de remplie est de 147 secondes avec un fichier de 2.7 Mo au final :eek:.


Code:
 Sub Copie_Structure_Feuille_Valeur_Format_Commentaire()
'Dim t1 As Long, NomFAct As String, DerCelSel As Variant, DerCelAdr As Variant, NBcol As Long, NBLig As Long, cell As Range, i As Long
    Dim LargCol(1048576), HautLig(1048576)    ', DercelLig As Long, DerCelCol As Long, Ilig As Long, ICOl As Long
    t1 = Timer
    Application.ScreenUpdating = False
    NomFAct = ActiveSheet.Name

    DerCelSel = ActiveCell.SpecialCells(xlLastCell).Select
    DerCelAdr = ActiveCell.Address: DerCelCol = ActiveCell.Column: DercelLig = ActiveCell.Row
    NBcol = 0
    For ICOl = 1 To DerCelCol
        If Cells(1, ICOl).ColumnWidth <> 0 Then NBcol = NBcol + 1: LargCol(NBcol) = Cells(1, ICOl).ColumnWidth
    Next
    
    
    NBLig = 0
    For Ilig = 1 To DercelLig
        If Rows(Ilig & ":" & Ilig).RowHeight <> 0 Then NBLig = NBLig + 1: HautLig(NBLig) = ActiveSheet.Rows(Ilig & ":" & Ilig).RowHeight
    Next
    'Stop
    ' A voir pour traitement de type Tableau
    'For Each cell In ActiveSheet.Range(Cells(1, 1), Cells(DercelLig, DerCelCol))
        'Traitement tableau
    'Next
    Sheets.Add
    For i = 1 To NBcol
        Cells(1, i).ColumnWidth = LargCol(i)
    Next
    For i = 1 To NBLig
        Rows(i & ":" & i).RowHeight = HautLig(i)
    Next
    ActiveSheet.Next.Select
    Range("A1").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    ActiveSheet.Previous.Select
    Range("A1").Select
    
    'Mettre pour chaque cellule la valeur et le format et le commentaire
    'Posibilité de mettre la formule avec xlPasteFormulas mais commenter xlPasteValues
    'Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
     SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                                                    :=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                           SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _
                           SkipBlanks:=False, Transpose:=False
        If Len(NomFAct) < 27 Then ActiveSheet.Name = "CV " & NomFAct Else ActiveSheet.Name = "CV " & Mid(NomFAct, 1, 14) & Right(NomFAct, 14)
    Application.ScreenUpdating = True

    MsgBox Timer - t1
End Sub
 
Dernière édition:

youky(BJ)

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Salut bien,
Apparemment tu copies l'intégralité de la page en plusieurs étapes.
Je pense qu'il est beaucoup plus rapide de copier la page entière comme je l'ai proposé.
Seul inconvénient si des formules se rapportent à d'autres onglets de ce classeur
(quoique on peux repasser sur ces formules et écrire en dur).
Maintenant si tu souhaites conserver ta macro je suggère ceci....
pour la largeur et hauteur de cellules
Code:
Sheets.Add
 For i = 1 To NBcol
   Columns(i).ColumnWidth = Sheets(NomFAct).Columns(i).ColumnWidth
 Next
 For i = 1 To NBLig
   Rows(i).RowHeight = Sheets(NomFAct).Rows(i).RowHeight
 Next

PS : je serais curieux de savoir le temps de copie avec mon fichier
(A voir pour renommer l'onglet)

Bruno
 

MJ13

XLDnaute Barbatruc
Re : VBA Copier base de Données Filtrée vers Nouveau classeur

Bonjour Bruno

Merci pour ta réponse. Avec ton code, je n'ai pas vraiment vu de différence.

Mon code en #8 est assez intéressant car il permet de copier une feuille, un TCD, un tableau (au sens des nouvelles versions) tel qu'il est, c'est à dire filtré ou non en supprimant tout nom qu'il peut contenir et qui peut être handicapant et ralentir l'ouverture du fichier. Par exemple j'avais un tableau avec extraction ODBC qui si il était filtré (sur 276 000 lignes) entraînait un ralentissemnt et même un plantage d'excel. En appliquant ma macro , j'ai fait des extractions avec un fchier de 20 Mo qui s'ouvre très facilement même avec des filtres :).
 

Discussions similaires

Réponses
45
Affichages
1 K

Statistiques des forums

Discussions
312 250
Messages
2 086 612
Membres
103 260
dernier inscrit
NHOURRA