2013-06-18 5 views
1

J'essaie de créer une macro qui itère sur toutes les cellules utilisées dans une feuille de calcul et renvoie la moyenne. L'objectif final est d'obtenir la valeur moyenne des nombres dans chaque feuille de calcul et de produire un graphique linéaire avec les moyennes.Excel VBA- Moyenne de toutes les cellules numériques dans une feuille de calcul

J'ai de la difficulté à comprendre comment procéder. Ma stratégie en ce moment (qui est probablement sous-optimale) implique a) de trouver la première rangée avec des données numériques; b) trouver la première colonne avec des données numériques; c) trouver la dernière rangée avec des données numériques; d) trouver la dernière colonne avec des données numériques; d) créer une plage sur ces cellules; e) la moyenne de la gamme

Voici mon code actuel

Sub AverageAllNumbers() 
    Dim fRow As Long 
    Dim fColumn As Long 
    Dim lRow As Long 
    Dim lColumn As Long 
    Dim dblAverage As Long 
    Dim averageRange As Range 

    fRow = Cells.Find(What:=Number, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row 
    fColumn = Cells.Find(What:=Number, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column 
    lRow = Cells.Find(What:=Number, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    lColumn = Cells.Find(What:=Number, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

    averageRange = Range(Cells(fRow, fColumn), Cells(lRow, lColumn)) 

    dblAverage = Application.WorksheetFunction.Average(averageRange) 
    MsgBox dblAverage 

End Sub 

Presque rien works-- « lColumn » produit 16384 et Frow et fColumn produit 1, ce qui est même pas une cellule utilisée dans ma feuille de calcul.

Que se passe-t-il?

+1

Vous réalisez que vous pouvez voir la moyenne dans la barre d'état? – pnuts

+3

@pnuts déjà mentionné dans une réponse supprimée. Une alternative simple peut-être juste 'Msgbox application.average (cells)' qui je pense ne s'applique qu'à la gamme utilisée. –

+2

pourquoi ne pas utiliser '= average (a: xfd)' ou 'application.worksheetfunction.average (a: xfd)' –

Répondre

3

Avez-vous essayé d'utiliser la propriété Worksheet.UsedRange?

Sub AverageAll() 
    Dim average As Double 
    Dim averageRange As Range 

    ' Set averageRange to UsedRange; no need to find it ourselves. 
    Set averageRange = ActiveSheet.UsedRange 

    average = Application.WorksheetFunction.average(averageRange) 
    MsgBox average 
End Sub 

Cela a fonctionné pour moi dans un cas de test, quoique trivial.

2

devrait être un one-liner:

Sub SheetAverage() 
    MsgBox Application.WorksheetFunction.Average(ActiveSheet.UsedRange) 
End Sub 
Questions connexes