[Excel] macro à optimiser

ajor

Habitué
Bonjour,
J'ai créé une macro qui, à partir d'un fichier excel (qui pèse 2,3Mo), me créé deux nouveaux fichier avec un certain nombre de manips effectuées (filtres, tris, comparaisons, etc)
Mes deux fichiers finaux font 3,8Mo et 270 Mo
Or ils ont autant d'informations, donc il y a clairement une erreur sur le deuxième. Il est anormalement volumineux.
Savez-vous d'où ça peut venir?
J'ai mis des tests à l'intérieur de mon code, afin de voir à quel endroit le fichier augmente bizarrement de taille, et ça se passe dans ce code :

Code:
Sheets("GENERAL").Select
    Selection.AutoFilter
    Columns("D:D").Select
    Selection.AutoFilter
    ActiveSheet.Range("$D:$D").AutoFilter Field:=1, Criteria1:="Bordeaux"
    Cells.Select
    Selection.Copy
    Sheets("BORDEAUX").Select
    Cells.Select
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste
    Columns("A:A").Select
    Application.CutCopyMode = False
    ActiveWorkbook.Worksheets("BORDEAUX").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("BORDEAUX").Sort.SortFields.Add Key:=Range( _
        "A2:A2160"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("BORDEAUX").Sort
        .SetRange Range("A1:R2160")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Merci beaucoup si quelqu'un peut jeter un coup d'oeil...
 

tantal_fr

Grand Maître
Bonjour,

Ton code contient trop de .Select, essaye de faire la même chose sans, tu y gagnera en optimisation.
 

ajor

Habitué
Merci Tantal pour ta réponse, mais je ne vois pas en quoi les Select font augmenter le poids du fichier?
Tout ces Select servent à quelque chose et je ne peux pas les supprimer
De plus sur mon deuxième fichier qui fonctionne bien, il y a autant de Select.
Il doit y avoir un problème autour de la fonction Paste Special mais je ne vois toujours pas... J'utilise le collage spécial qui garde les largeurs de colonne.
 

tantal_fr

Grand Maître
C'est juste d'ordre général, normalement il ne doit pas y avoir de select dans un code VBA :no:
Je ne sais pas si le fait de faire sans les Select te permettra de réduire le poids de tes fichier, ton code sera simplement plus facile à lire.

Par ex :
Code:
Sheets("GENERAL").Select
    Selection.AutoFilter
    Columns("D:D").Select
    Selection.AutoFilter
    ActiveSheet.Range("$D:$D").AutoFilter Field:=1, Criteria1:="Bordeaux"
par
Code:
Sheets("GENERAL").Range("$D:$D").AutoFilter Field:=1, Criteria1:="Bordeaux"
ou


De même as-tu besoin, absolument de faire un collage spécial, sinon :
Code:
 Selection.Copy
    Sheets("BORDEAUX").Select
    Cells.Select
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste
    Columns("A:A").Select
    Application.CutCopyMode = False
par
Code:
 Cells.Copy Destination:=Sheets("BORDEAUX").Range("A1")
 

ajor

Habitué
merci pour ton aide.
J'ai testé, mais cela ne colle pas mes infos dans l'onglet BORDEAUX
Il ne manque pas la fonction Paste?
 

tantal_fr

Grand Maître
Peut-être rajouter "Sheets("GENERAL")." avant .sheets ex :
Code:
Sub test()

    Sheets("GENERAL").Range("$D:$D").AutoFilter Field:=1, Criteria1:="Bordeaux"
    Sheets("GENERAL").Cells.Copy Destination:=Sheets("BORDEAUX").Range("A1")
    
    ActiveWorkbook.Worksheets("BORDEAUX").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("BORDEAUX").Sort.SortFields.Add Key:=Range( _
        "A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("BORDEAUX").Sort
        .SetRange Range("A:R")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub
 

ajor

Habitué
Je viens de tester tes formules.
La première (sur le tri Bordeaux) fonctionne bien.
Par contre la deuxième ne fonctionne pas.

Je ne suis pas forcément attaché à un collage spécial. En fait, il faudrait juste un collage qui permet de copier les cellules, et les styles (largeurs de colonne, polices, etc).
 

tantal_fr

Grand Maître
Salut,

Tu dis que ça ne fonctionne pas, peux-tu détailler ? As-tu un message d'erreur ? Qu'est ce qui se passe (ou ne se passe pas) ?
 

tantal_fr

Grand Maître
Tu peux éventuellement essayer de rajouter CurrentRegion :
Code:
Sheets("GENERAL").Cells.CurrentRegion.Copy Destination:=Sheets("BORDEAUX").Range("A1")

Sur le petit exemple que j'ai essayer de reproduire, ça marche™.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 163
Messages
6 718 586
Membres
1 586 453
Dernier membre
liloual37
Partager cette page
Haut