Formule "moyenne", avec variable. VBA

Résolu
Lloris -  
 Utilisateur anonyme -
Bonjour,

J'ai enregistré une macro calculant la moyenne de plusieurs cellules.
voici le code obtenu
ActiveCell.FormulaR1C1 = "=AVERAGE(R[1]C[-6]:R[138]C[-4])"

..

Le problème est que le 138 est variable..
j'ai donc testé ceci :
Dim W As Integer
Range("A2", [A2].End(xlDown)).Select
W = Selection.Count
Range("AB1").Activate
ActiveCell.FormulaR1C1 = "=AVERAGE(R[1]C[-6]:R[W]C[-4])"


Et ça me renvoi un message d'erreur :
Erreur d'execution '1004' :
Erreur définie par l'application ou par l'objet

cela vient donc de la variable W, mais je suis obligé de mettre une variable car le nombre de lignes n'est pas toujours le même.

Sauriez-vous comment faire ?

Merci d'avance

3 réponses

  1. Utilisateur anonyme
     
    Tu peux essayer cela :

    (ça fait la moyenne de toutes les valeurs de ta premières colonnes, jusqu'à la première case vide)

    Dim derline5 As Byte
    derline5 = Range("A1").End(xlDown).Row
    
    Dim somme As Integer
    Dim moyenne As Integer
    Dim r As Byte
    
    somme = 0
    For r = 1 To derline5
    
    somme = somme + Cells(r, 1).Value
    Next
    
    moyenne = somme / (derline5)
    Cells(derline5 + 1, 1).Value = moyenne
    
    
    Next
    
    1
    1. Lloris
       
      Je te remercie de m'apporter ton aide,

      je viens de tester le code que tu m'as passé, mais il ne fonctionne pas.
      à la ligne :
      somme = somme + Cells(r, 1).Value
      ,
      ça me dit "Imcompatibilité de type "..
      0
    2. LLoris
       
      Je viens de trouver la solution..
      Au lieu d'utiliser les "Cells", je prefère utiliser les "Range".
      Ensuite, j'ai remplacé les variables "Bytes" par des "Integer", mais surtout, j'ai défini "somme" non plus comme un "Integer", mais comme "Long" (les valeurs étant très importantes, la valeur de somme dépassait les capacités d'un simple Integer.
      Pour finir, le "derline5" renvoi le numéro de la ligne, mais la ligne 1 est une ligne de titre, j'ai donc modifier la formule de la moyenne en : moyenne = somme / (derline5 - 1)

      Voila mon code
      Dim derline5 As Integer
      derline5 = Range("AB2").End(xlDown).Row
      
      Dim somme As Long
      Dim moyenne As Integer
      Dim r As Integer
      
      
      somme = 0
      For r = 2 To derline5
      somme = somme + Range("AB" & r).Value
      Next r
      
      moyenne = somme / (derline5 - 1)
      'Cells(derline5 + 1, 1).Value = moyenne
      Else: l = 0
      End If
      


      Je te remercie de m'avoir mis sur la bonne voie, sans ton aide je n'aurais pas trouvé..c'est surtout le "Range("..").End(xlDown).Row" auquel je n'avais pas pensé, et qui me sera surement très utile par la suite.
      =D bonne journée.
      0
  2. LLoris
     
    Voila ce que j'ai trouvé au final

    Dim derline5 As Integer
    derline5 = Range("AB2").End(xlDown).Row
    
    Dim somme As Long
    Dim moyenne As Integer
    Dim r As Integer
    
    somme = 0
    For r = 2 To derline5
    somme = somme + Range("AB" & r).Value
    Next r
    
    moyenne = somme / (derline5 - 1)
    'Cells(derline5 + 1, 1).Value = moyenne
    Else: l = 0
    End If
    
    0
  3. Utilisateur anonyme
     
    De rien, je me fais beaucoup aidé, je ne suis pas un pro non plus, donc si je peux rendre service en retour !
    Effectivement, la déclaration des types dépend du nombre de valeurs. Moi je l'avais fait pour un code où j'avais maxi une dizaine de valeurs, donc ça fonctionne bien.
    Je ne sais pas trop pour Cells et Range par contre, chez moi ça marche...

    Enfin bon, du moment que tu y sois arrivé !

    A plus
    0