Amelioration d'une macro EXCEL

Résolu
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai creer une macro sur excel, permettant d'actualiser un onglet en fonction des donnees presentes sur 8 autres onglets, et ce afin d'avoir une vue generale.

Probleme, cette macro est TRES lente, plus de 25 secondes... je l'ai deja accelerer un peu en mettant les calculs en manuel et le screenupdate en False, mais ce n'est pas encore ça...

Ci dessous ladite macro, si qqun a une idee pour la rendre plus rapide...

Sub Actualisation()

Application.ScreenUpdating = False

TypeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual

Cells.Clear
With Sheets("Boeing")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 1)
End With
With Sheets("Airbus")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 3)
End With
With Sheets("ATR")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 5)
End With
With Sheets("CRJ")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 7)
End With
With Sheets("Fokker")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 9)
End With
With Sheets("Standard")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 11)
End With
With Sheets("Greene Tweed")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 13)
End With
With Sheets("Misc")
    .Cells(1, 1).Resize(.Cells.SpecialCells(xlCellTypeLastCell).Row, .Cells.SpecialCells(xlCellTypeLastCell).Column).Copy _
        Destination:=Cells(3, 15)
End With

Application.ScreenUpdating = True
Application.Calculation = TypeCalcul


End Sub


Merci d'avance
A voir également:

11 réponses

gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
bonjour

Tu peux remplacer :
.Cells.SpecialCells(xlCellTypeLastCell).Column

par 2 car de toute façon si tu copies plus de 2 colonnes elles sont écrasées ensuite mais tu ne vas pas mettre le turbo sauf si tes onglets sont mal saisis.
1
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Sous cette forme, dans un module, ça marche :
Sub Actualisation()
    With Sheets("Feuil1")
        Dim ligs As Long, cols As Long
        ligs = .Cells.SpecialCells(xlCellTypeLastCell).Row
        cols = .Cells.SpecialCells(xlCellTypeLastCell).Column
'ou 
        cols=2 'avec l'amélioration de gb
        ActiveSheet.Cells(3, 1).Resize(ligs, cols).Value = .Cells(1, 1).Resize(ligs, cols).Value
    End With
End Sub
Reste à voir si le gain est conséquent...

Mais en relisant ton post initial je trouve que 25s est vraiment énorme pour copier des données même s'il y en a beaucoup.
Il n'y a vraiment pas des formules qui seraient recalculées suite au copy ?
Et ton fichier est bien sur le disque dur et pas sur un disque réseau ?

eric
1
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   3
 
Merci pour le coup de main, on a gagné 5 secondes...

Y'aurait-il un moyen de simplifier l'operation, en sachant que l'onglet General avec la vue d'ensemble est le premier, et que je n'ai que 8 onglets ensuites, dans l'ordre ci dessus et avec les noms indiqués ci dessus (et ils sont bien saisis)?
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Bonsoir,

Si les plages que tu copies ont beaucoup de formules (et les sommeprod() sont très gourmands) il faudrait peut-être voir à améliorer celles-ci si c'est possible.
Par exemple un morceau de formule utilisé de nombreuses fois peut être mis dans un nom, ainsi il n'est évalué qu'une fois.
Ou bien utiliser un calcul intermédiaire dans une colonne masquée si il peut être repris dans plusieurs colonnes.
eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   3
 
Il ne s'agit pas de calculs, mais d'une base de donnees... des references et des designations en fait...
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Re,

Tu as une autre technique de copie qui serait plus rapide que .copy :
[A1:A10].Value = Worksheets("Feuil1").[A1:A10].Value

eric
0
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   3
 
Bonjour,

Eriic, j'ai essayé ta formule, mais ça ne marche pas...
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Bonjour tout le monde,
en me basant sur le principe d'Eric

suite d'appel de macros param^mtrées en n'utilisant pas resize ( dans ma p'tite t^te manipulation de cellule=lenteur, mais c'est pas gagné!) j'ai considéré qu'il y avait que 2 lignes dans la source par felmme, je n'ai pas déclaré les variables

Sub recopie_interne(wsh, lig_dep, col_dep)
With Sheets(wsh)
    col = .Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Column
    .Range(.Cells(lig_dep, col_dep), .Cells(lig_dep + 1, col_dep + col - 1)).Value = .Range(.Cells(1, 1), .Cells(2, col)).Value
End With
End Sub

Sub test()
recopie_interne "Feuil1", 3, 13
End Sub


curieux de voir ce que ca donne
0
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   3
 
Bonjour Michel_m

Cela ne marche pas non plus, runtime error 9, subscript out of range.
0
mantaTM Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   3
 
C'est bon eriic, celle ci marche tres bien, merci beaucoup !!!

De plus cela m'a permis de voir ou etait le probleme dans ma macro precedente... Le Cells.Clear du debut devait prendre enormement de temps, plus que la copie en elle meme...


Ceci etant dis, j'ai quan meme besoin de vider le contenu de certaines cellules, pour qu l'actualisation de la base de donnees se fasse proprement...

je n'arrive pas a faire effacer les cellules d'un champ seulement...

J'ai tenté

Range[A5;Z10000].Clear

mais raté, ça plante... une idée quelqu'un?? Merci d'avance!




edit : le fichier est bien sur le disque dur. Il n'y a pas de formules. J'ai 9 onglets, dont 8 sont copiés vers le premier. tous ont deux colonnes seulement, le plus petit a une 50aine de ligne, le plus grand presque 3000.
J'ai de plus une autre macro de recherche, une sorte de ctrl+F, mais qui n'est pas active lors de la macro copie.

edit again : c'est bon trouvé : Range("A5:Z10000").ClearContents

Merci a tous
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
.clear ???

.clearcontents plutôt
et tant qu'à faire avec une , et non un ;
Et si tu utilises la notation abrégée de range c'est à dire avec des [ ], range n'a rien à faire là
Donc soit:
range("A5:Z10000").clearcontents
ou:
[A5:Z10000].clearcontents
0