réponse de ASH vous obtenez ce que vous voulez, mais ce sera beaucoup plus rapide ...
Il est plus rapide pour 3 raisons:
lecture de personne les cellules sont lentes. Il est plus rapide de charger toutes les cellules dans un tableau Variant, puis de travailler avec le tableau.
L'écriture de cellules individuelles est lente. Il est plus rapide de réduire le nombre de fois que nous écrivons dans les cellules, donc je charge les résultats dans des tableaux 1x6 et les insère aux emplacements cibles.
L'utilisation Application.Average
est une syntaxe héritée d'Excel 95. Il est plus rapide d'utiliser Application.WorksheetFunction.Average
, et vous obtenez IntelliSense et un résultat fortement typé gratuitement.
NB. Vous pourriez probablement éviter d'utiliser la fonction Average
(et eek un peu plus de performance) et calculer le résultat en mémoire, car cela est une simple moyenne avec seulement trois entrées, de sorte que vous pouvez utiliser:
'Calculate the average ourselves
rowresults(1, colCounter) = (values((5 * rowCounter - 2), colCounter) + values((5 * rowCounter - 2), colCounter + 6) + values((5 * rowCounter - 2), colCounter + 12))/3
code:
Sub sumavg()
Dim rowCounter As Long
Dim colCounter As Long
Dim values() As Variant
Const START_COL As Long = 1
Const END_COL As Long = 6
Const OUTPUT_COL_START As Long = 20
With Worksheets("Sheet1")
'Load the values into an array - reading them this way is much faster than cell-by-cell
values = .Range(.Cells(1, 1), .Cells(150, 18)).Value
For rowCounter = 1 To 30
ReDim rowresults(1 To 1, START_COL To END_COL)
For colCounter = START_COL To END_COL
'Use Application.WorksheetFunction.Average to get Intellisense and a strongly typed Double result
rowresults(1, colCounter) = Application.WorksheetFunction.Average(values((5 * rowCounter - 2), colCounter), values((5 * rowCounter - 2), colCounter + 6), values((5 * rowCounter - 2), colCounter + 12))
Next colCounter
'Write the entire row of results at once - 6 times faster than writing individual cells
.Range(.Cells(5 * rowCounter - 2, OUTPUT_COL_START), .Cells(5 * rowCounter - 2, OUTPUT_COL_START + END_COL - START_COL)).Value = rowresults
Next rowCounter
End With
End Sub
Votre solution me donne une erreur d'exécution disant incapable d'obtenir la propriété moyenne de la fonction de feuille de calcul. – shecodes
Pouvez-vous me lier le classeur? –
[link] (http://www.filedropper.com/fulltest_1) Atm J'ai des problèmes pour imprimer les valeurs AOIentries. Je l'ai fait travailler plus tôt aujourd'hui, mais ça ne fonctionne pas maintenant. Je ne sais pas si ça va poser un problème pour vous, mais si c'est le cas, supprimez l'instruction If où la clé dict est définie dans le module 4. – shecodes