2017-07-24 61 views
0

我想写一个代码,查看一组数据并选择日期范围内的集合,并找到它的平均值。问题是我的函数返回整数而不是小数。我试图将我的函数数据类型更改为single,double和long,并且这些都不起作用。日期列表是在A列,和我想的平均数值列B.我的代码:功能返回整数,而不是小数

Function MONTHLYAVERAGE(OneDate As Date, TwoDate As Date) As Double 

Dim TwoDate_Row As Long 

Dim i, j As Integer 
LookupColumn = "A" 
Dim EndRange As Long 

EndRange = Range("A1", Range("A1").End(xlDown)).Rows.Count 


    For i = 1 To EndRange 
     If Range(LookupColumn & i).Value = TwoDate Then TwoDate_Row = i 
    Next i 


    For j = TwoDate_Row To 1 Step -1 
     If Range(LookupColumn & j).Value = OneDate Then OneDate_Row = j 
    Next j 

     Dim MyDateRange As Range 

      LookupColumn2 = "B" 

      Set MyDateRange = Range(LookupColumn2 & OneDate_Row & ":" & LookupColumn2 & TwoDate_Row) 

     MONTHLYAVERAGE = Format(Application.WorksheetFunction.Average(MyDateRange), Standard) 

End Function 
+3

'Format(Application.WorksheetFunction.Average(MyDateRange),Standard)' - 什么是'Standard'? –

+0

这里有两件事你可以创建一个messagebox并提供下面的结果 MONTHLYAVERAGE = Format(Application.WorksheetFunction.Average(MyDateRange),Standard),同样用“0.00”代替标准 –

+1

[请参考这个关于'Format'的第二个参数的文章。](https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/format-function-visual-basic-for-applications) –

回答

2

要重写代码,你可以使用FIND让你后的行号。

Public Function MonthlyAverage(StartDate As Date, EndDate As Date, Optional ColOffSet As Long = 1) As Double 

    Dim rFirstCell As Range, rLastCell As Range 

    With ThisWorkbook.Worksheets("Sheet1").Columns(1) 
     'Find first instance of StartDate. 
     Set rFirstCell = .Find(StartDate, , , , xlByRows, xlNext) 
     If Not rFirstCell Is Nothing Then 
      'Find last instance of EndDate. 
      Set rLastCell = .Find(EndDate, , , , xlByRows, xlPrevious) 
      'Both dates have been found, so we can calculate the average. 
      If Not rLastCell Is Nothing Then 
       MonthlyAverage = WorksheetFunction.Average(rFirstCell.Resize(rLastCell.Row - rFirstCell.Row + 1).Offset(, 1)) 
      End If 
     End If 
    End With 

End Function 

可以调用代码:

Sub Test() 

    Dim TheAnswer As Double 
    TheAnswer = MonthlyAverage(CDate("01/02/2017"), CDate("01/03/2017")) 

    MsgBox TheAnswer 

End Sub 

如果您至少声明TheAnswer作为双它给了,对我来说,结果的84.1034482758621,如果我宣布它作为一个长时间的回报84

现在,这样做没有VBA的另一种方式:
如果你的日期在A列,和你的数字是B列
细胞E2输入所需的开始日期和所需的结束日期在细胞E3和使用这个公式:
=AVERAGE(INDEX($B:$B,MATCH($E$2,$A:$A,0)):INDEX($B:$B,MATCH($E$3,$A:$A,0)+COUNTIF($A:$A,$E$3)-1))

如果只有唯一的约会,你可以删除+COUNTIF($A:$A,$E$3)-1)部分。

相关问题