2013-05-04 52 views
0

我試圖從數據的一維範圍中選擇那些低於平均值的值。使用低於平均值的值填充數組並計算方差

此代碼是否正確?我想有一個與我怎麼把它們放入數組BelowAvg一個問題...

Function MoyBelow(data As Range) As Variant  
Dim i As Integer  
Dim N As Long  
Redim BelowAvg() As Variant  
Dim Varian As Double  
Dim Somcar() As Variant   

N=WorksheetFunction.Count(data)  
RendMoy=WorksheetFunction.Average(data)   

    For i=1 To N   
     If data.Cells(i).Value < RendMoy Then    
      BelowAvg(i).Value = data(i).Value   
    End If   
    NB = BelowAvg.Count     

     For j=1 To NB    
      SumSq= SumSq + (BelowAvg(i) - RendMoy)^2   
     Next j 
    Next i 


     Varian = SumSq/NB  

End Function 

回答

0

下面是返回雙打的數組,其中包含了低於平均水平的細胞在範圍內的功能:

Function GetBelowAverageValues(data As Range,RangeAverage As Double) As Double() 
Dim FilteredRangeValues As Variant 
Dim BelowAverageValuesCount As Long 
Dim BelowAverageValues() As Double 
Dim i As Long 

If data.Cells.Count = 1 Then 
    MsgBox "only one cell" 
    Exit Sub 
End If 
data.AutoFilter 1, "<" & RangeAverage 
FilteredRangeValues = data.SpecialCells(xlCellTypeVisible) 
BelowAverageValuesCount = UBound(FilteredRangeValues) 
ReDim BelowAverageValues(1 To BelowAverageValuesCount) 
For i = 1 To BelowAverageValuesCount 
    BelowAverageValues(i) = FilteredRangeValues(i, 1) 
Next i 
GetBelowAverageValues = BelowAverageValues 
data.AutoFilter 
End Function 

它使用AutoFilter函數和SpecialCells屬性來過濾和選擇相關的單元格。對於你的用途,你可以這樣稱呼它:

Sub Test() 
Dim DataRange as Range 
Dim RangeAverage As Double 
Dim BelowAverageValues() As Double 
Dim i as Long 
Dim Varian As Double 

Set DataRange = Selection 
RangeAverage = Application.WorksheetFunction.Average(DataRange) 
BelowAverageValues = GetBelowAverageValues(DataRange ,RangeAverage) 
    For i=1 To Ubound(BelowAverageValues)    
     SumSq= SumSq + (BelowAverageValues(i) - RendMoy)^2   
    Next i 
Varian = SumSq/NB 
End Sub 

這是主要測試,但可能有錯誤的地方。主要功能已經過測試和爲我工作。

+0

謝謝,它解決了我的問題! – seigna 2013-05-05 13:20:03

+0

我很高興能幫上忙。請接受它,因爲它回答了問題。 – 2013-05-05 14:32:19