VBA : accélérer macro / court-circuiter une fonction

dionys0s

XLDnaute Impliqué
Bonjour le forum

j'ai la boucle suivante qui me permet de remplir diverses lignes et colonnes d'un tableau
J'ai fait le test sur 70 lignes, et ça prend plus de 30 secondes... certes mon PC rame mais pas à ce point.

Donc j'aimerais savoir s'il est possible d'accélérer ça, ou si je suis obligé de mettre une fonction.
Par exemple on peut se pas utiliser les fonctions GAUCHE, DROITE, TROUVE, etc en utilisant directement Left, Right, Find, InStr etc. dans le VBE. Est-ce possible avec COUNTA, AVERAGE etc. ? Voici mon code.

Code:
For Each Cellule In Sheets(61).Range(Range("A2"), Range("A2").End(xlDown))

    Cellule.Offset(0, 4).FormulaR1C1 = "=IFERROR(COUNTA(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Notes),"""")"
    Cellule.Offset(0, 4) = Cellule.Offset(0, 4)

    Cellule.Offset(0, 5).FormulaR1C1 = "=IFERROR(COUNTA(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Minutes)-RC5,"""")"
    Cellule.Offset(0, 5) = Cellule.Offset(0, 5)

    Cellule.Offset(0, 6).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Minutes),"""")"
    Cellule.Offset(0, 6) = Cellule.Offset(0, 6)

    Cellule.Offset(0, 7).FormulaR1C1 = "=IFERROR(AVERAGE(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Notes),"""")"
    Cellule.Offset(0, 7) = Cellule.Offset(0, 7)

    Cellule.Offset(0, 8).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Jaunes),"""")"
    Cellule.Offset(0, 8) = Cellule.Offset(0, 8)

    Cellule.Offset(0, 9).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Rouges),"""")"
    Cellule.Offset(0, 9) = Cellule.Offset(0, 9)

    Cellule.Offset(0, 10).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Buts),"""")"
    Cellule.Offset(0, 10) = Cellule.Offset(0, 10)

    Cellule.Offset(0, 11).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Passes),"""")"
    Cellule.Offset(0, 11) = Cellule.Offset(0, 11)

Next Cellule

Pour info, les codes de type
" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Notes
renvoient une plage nommée dans mon gestionnaire de formule. Toutes mes plages sont nommées dynamiquement.

J'espère être assez précis.

D'avance merci pour votre aide

dionys0s
 

pierrejean

XLDnaute Barbatruc
Re : VBA : accélérer macro / court-circuiter une fonction

Bonjour dionys0s

Teste deja comme ceci
Sinon poste un petit fichier sans données confidentielles pour traitement Vba

Code:
For Each Cellule In Sheets(61).Range(Range("A2"), Range("A2").End(xlDown))
   Application.Calculation = xlCalculationManual
    Cellule.Offset(0, 4).FormulaR1C1 = "=IFERROR(COUNTA(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Notes),"""")"
    Cellule.Offset(0, 4) = Cellule.Offset(0, 4)
    Cellule.Offset(0, 5).FormulaR1C1 = "=IFERROR(COUNTA(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Minutes)-RC5,"""")"
    Cellule.Offset(0, 5) = Cellule.Offset(0, 5)
    Cellule.Offset(0, 6).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Minutes),"""")"
    Cellule.Offset(0, 6) = Cellule.Offset(0, 6)
    Cellule.Offset(0, 7).FormulaR1C1 = "=IFERROR(AVERAGE(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Notes),"""")"
    Cellule.Offset(0, 7) = Cellule.Offset(0, 7)
    Cellule.Offset(0, 8).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Jaunes),"""")"
    Cellule.Offset(0, 8) = Cellule.Offset(0, 8)
    Cellule.Offset(0, 9).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Rouges),"""")"
    Cellule.Offset(0, 9) = Cellule.Offset(0, 9)
    Cellule.Offset(0, 10).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Buts),"""")"
    Cellule.Offset(0, 10) = Cellule.Offset(0, 10)
    Cellule.Offset(0, 11).FormulaR1C1 = "=IFERROR(SUM(" & Cellule.Offset(0, 3) & "_Joueur_" & Cellule & "_" & Cellule.Offset(0, 1) & "_Passes),"""")"
    Cellule.Offset(0, 11) = Cellule.Offset(0, 11)
  Application.Calculation = xlCalculationAutomatic
Next Cellule
 

dionys0s

XLDnaute Impliqué
Re : VBA : accélérer macro / court-circuiter une fonction

Bonjour Pierre Jean

merci pour ta réponse.

il n'y a rien de confidentiel dans mon fichier, j'essaie de faire un fichier sur la ligue 1, statistiques de joueurs et tout et tout.
Le PJ est un peu lourde, et il y a pas mal de code. Mais la voici tout de même.

L'onglet concerné est l'onglet "Joueurs", et le nom de la macro dans lequel se trouve mon code est "Actualiser_Joueurs" dans le module "Procedure".

Merci beaucoup :)
 

Pièces jointes

  • Ligue 1 - 2011-2012.zip
    816.6 KB · Affichages: 34

dionys0s

XLDnaute Impliqué
Re : VBA : accélérer macro / court-circuiter une fonction

Re le forum :cool:

Pierre Jean j'ai essayé ta première proposition et je ne remarque pas de changement.

J'espère que tu t'en sors avec mon fichier. Si tu as besoin d'éclaircissements je suis à ta disposition

D'avance merci :)
dionys0s
 

dionys0s

XLDnaute Impliqué
Re : VBA : accélérer macro / court-circuiter une fonction

Re,

ma foi c'est déjà plus rapide !! 2 fois j'ai l'impression. Merci beaucoup !!
Mes fonctions étaient tout de même un peu lourdes non ? A cause de la taille des plages peut-être.

Qu'avez-vous pensé de la conception du fichier (soyez franc. Le padawan que je suis n'a pas peur de la critique)

Merci beaucoup encore

dionys0s
 

pierrejean

XLDnaute Barbatruc
Re : VBA : accélérer macro / court-circuiter une fonction

Re
Je ne l'aurais pas monté comme ceci (je pratique très peu les plages nommées) et c'est surement pour cela que l'amelioration apportée est faible
Mais je ne porte aucun jugement , n'etant qu'un petit amateur plutot besogneux
 

Discussions similaires

Réponses
12
Affichages
660
Réponses
0
Affichages
129
Réponses
7
Affichages
311

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 690
dernier inscrit
souleymaane