2016-11-22 2 views
1

Here is a screenshot of my data:utilisation (r, c) le format pour la formule moyenne avec des cellules non contiguës

Voici mon code:

Sub sumavg() 

With Worksheets(datasummary) 
Dim i As Long 
Dim j As Long 
j = 20 

    For i = 1 To 30 
     For j = 20 To 25 
     Cells(5 * i - 2, j).Value = Average(A(5 * i - 2), G(5 * i - 2), M(5 * i - 2)) 
     Next j 
    Next i 

End With 
End Sub 

Je me bats avec la syntaxe de la formule moyenne. C'est ma première tentative d'utilisation de formules en macro. Si possible, je voudrais utiliser le format (r, c) pour les adresses de cellules, mais je n'ai pas encore trouvé quelque chose comme ça. Je veux faire la moyenne des valeurs dans chaque 6e cellule de la rangée 3 et l'imprimer en T3. Ce processus doit être bouclé 6 fois pour chaque bloc et pour 40 blocs. À l'heure actuelle, ce code renvoie une erreur «sous-fonction ou fonction non définie» et met en surbrillance les identificateurs de colonne dans la formule moyenne.

Répondre

2
Sub sumavg() 
    Dim i As Long, j As Long 
    With Worksheets("datasummary") 
     For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 5 
      For j = 1 To 5 
       .Rows(i + 2).Range("T1:Y2").Value = "=IFERROR(AVERAGE(RC[-19],RC[-13],RC[-7]),""N/A"")" 
      Next 
     Next 

    End With 
End Sub 
+0

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

+0

Pouvez-vous me lier le classeur? –

+0

[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

1
Sub sumavg() 
    Dim i As Long, j As Long 
    With Worksheets("Sheet1") ' <~~ double-quotes 
    For i = 1 To 30 
     For j = 20 To 25 
     .Cells(5 * i - 3, j).Value = Application.Average(_ 
     Application.Union(_ 
      .Range("A" & (5 * i - 3)), .Range("G" & (5 * i - 3)), .Range("M" & (5 * i - 3)) _ 
     )) 
     Next j 
    Next i 

    End With 
End Sub 
+0

Votre suggestion fonctionne. Maintenant, cependant, je dois changer les références de colonne à une formule qui change en fonction de j, c'est pourquoi je veux utiliser le format (r, c). donc ce serait quelque chose comme '.Range ((5 * i - 2), (j - 19)), .Range ((5 * i - 2), (j - 13)), .Range ((5 * i - 2), (j - 7)) _)) ' – shecodes

+0

@shecodes à utiliser (r, c) vous pouvez simplement remplacer' .Range ("...") 'par' .Cells (r, c) ' . –

+0

Ça marche, merci. – shecodes

1

réponse de ASH vous obtenez ce que vous voulez, mais ce sera beaucoup plus rapide ...

Il est plus rapide pour 3 raisons:

  1. 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.

  2. 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.

  3. 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 
+0

Merci ThunderFrame Jetez un oeil à la réponse de Thomas Inzina - il a réussi à anticiper que je veux aussi effectuer la même tâche de calcul de la moyenne sur les lignes en dessous de celles sur lesquelles je travaille actuellement.J'ai essayé votre solution et ça fonctionne bien, alors maintenant J'ai essayé de copier-coller la boucle 'For colCounter', en changeant tous les cas de' rowCounter - 2' en 'rowCounter - 1'. Ce qui doit être modifié, car il lance une erreur sur la ligne d'impression juste avant' Next rowCounter' Si vous pouvez me dire ceci, je marquerai cette réponse comme étant acceptée – shecodes

+0

Je ne l'ai jamais corrigé. – shecodes