2013-05-04 45 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