accélérer ses macros

youki

XLDnaute Occasionnel
Bonjour,
j'ai une macro qui tourne bien mais, à mon gout, trop lente pour ce qu'elle produit.

Tout d'abord une question:

1- Comment nettoyer plusieur feuilles de classeur sans utiliser le :

Code:
sheets("feuillex").activate

Je suppute que les action "activates" ralentissent énormément les macros

2 - Sensiblement la même question. A partir du moment ou je fais un range("XX").select, il faut que quelque-part précédemment j'ai fait un sheet.activate. Comment faire autrement (malgré que je précise bien les sheets avant, exemple:

Code:
Sheets("stack").Range("I1:N3,B1:G3").Select



3- boucle for versus boucle while, y a t'il une différence notable de vitesse (dans certains languages, c'est le cas)

4- Toutes suggestions qui accélèreraient les macros sont les bienvenues.

D'avance merci
 

Caillou

XLDnaute Impliqué
Re : accélérer ses macros

Bonjour,

Voila ce que je connais :
- Désactiver l'affichage : Application.ScreenUpdating = False
- Eventuellement le recalcul auto : Application.Calculation = xlCalculationManual
- Privilégier les boucles For each
- Eviter les Select (si possible)

Caillou
 

Pierrot93

XLDnaute Barbatruc
Re : accélérer ses macros

Bonjour,

un exemple de copie d'une feuille à une autre sans "select" :

Code:
Sheets(1).Range("A1:A10").Copy Destination:=Sheets(2).Range("A1")

A noter tu peux remplacer les numéros d'index des feuilles par leurs noms :

Code:
Sheets("NomFeuille")

bon après midi
@+
 

youki

XLDnaute Occasionnel
Re : accélérer ses macros

par exemple comment faire mieux que ça?

Code:
Sheets("stack").Activate
    Sheets("stack").Range("I1:N3,B1:G3").Select
        With Selection
        .ClearContents
        End With
    derli = Sheets("Insertion").Range("A3000").End(xlUp).Row
    Sheets("Insertion").Activate
 
 If Sheets("Insertion").Range("j13").Value = "" Then
    MsgBox ("Mettre un nom de fichier: condition initiale obligatoire")
    Exit Sub
 Else

Sachant que pour le test de if par exemple si je n'active pas la page avant il créer une erreur.
 

Pierrot93

XLDnaute Barbatruc
Re : accélérer ses macros

Re,

peut être comme ceci :

Code:
Sheets("stack").Range("I1:N3,B1:G3").ClearContents

pour le test "if", devrait passer, à voir dans quelle condition il est utilisé et où il est placé... module de feuille ou module standard...

Edition : il faut un "end if" bien sur... tu donnes qu'une partie du code...
 

Caillou

XLDnaute Impliqué
Re : accélérer ses macros

Bonjour Pierrot,

Code:
  Sheets("stack").Range("I1:N3,B1:G3").ClearContents
  
  With Sheets("Insertion")
    derli = .Range("A3000").End(xlUp).Row
    If .Range("j13").Value = "" Then
      MsgBox ("Mettre un nom de fichier: condition initiale obligatoire")
      Exit Sub
    End If
  End With

Ce code fonctionne !

Caillou
 

youki

XLDnaute Occasionnel
Re : accélérer ses macros

Nickel caillou, nickel pierrot déja un grand merci

Pour faire des for each sur une feuille ou il n'ya qu'une zone de taille variable à parcourir. Il faut auparavant creer un nom à la zone?

Comment lui préciser que le for each s'applique uniquement à la zone?
 
Dernière édition:

Caillou

XLDnaute Impliqué
Re : accélérer ses macros

Re,

Que tu utilises un bloc With ou non, le traitement effectué par la macro est toujours de ton ressort. En aucun cas, Excel ne fait ce que tu ne lui demande pas (tout au plus, il fait pas ce que tu voudrais lui demandé!)

Pour en revenir au bloc With, il permet d'appliquer une série d'instruction à un objet.
Par exemple pour ton code, on peut écrire ceci :
Code:
  With Sheets("Insertion").Range("A1:z3000")
    .ClearContents
    With .Font
      .Name = "Arial"
      .Size = 10
      .Strikethrough = False
      .Superscript = False
      .Subscript = False
      .OutlineFont = False
      .Shadow = False
      .Underline = xlUnderlineStyleNone
      .ColorIndex = xlAutomatic
     End With
    .WrapText = False
    .Orientation = 0
    .AddIndent = False
    .ShrinkToFit = False
    .MergeCells = False
    .Borders.LineStyle = xlNone
    .Borders(xlDiagonalDown).LineStyle = xlNone
    .Borders(xlDiagonalUp).LineStyle = xlNone
    .Rows.AutoFit
  End With

Caillou
 

Statistiques des forums

Discussions
312 273
Messages
2 086 698
Membres
103 372
dernier inscrit
BibiCh