2016-12-01 94 views
0

據我所知,Excel平均函數不包括空白的單元格。不過,我這似乎正是我的代碼是這樣做的:我的平均功能是計數空白單元格爲0

Sub sumavg() 
    Dim rowCounter As Long 
    Dim colCounter As Long 

    Dim values() As Variant 

    Const START_COL As Long = 1 
    Const END_COL As Long = 6 

    Const OUTPUT_COL_START As Long = 20 

    With Worksheets("datasummary") 
    'Load the values into an array 
    values = .Range(.Cells(1, 1), .Cells(199, 18)).Value 
    For rowCounter = 1 To 40 
     ReDim rowresults(1 To 1, START_COL To END_COL) 
     For colCounter = START_COL To END_COL 
'find average of AOIentries values 
     rowresults(1, colCounter) = Application.WorksheetFunction.Average(values((5 * rowCounter - 2), colCounter), values((5 * rowCounter - 2), colCounter + 6), values((5 * rowCounter - 2), colCounter + 12)) 

     Next colCounter 
'print row of results 
     .Range(.Cells(5 * rowCounter - 2, OUTPUT_COL_START), .Cells(5 * rowCounter - 2, OUTPUT_COL_START + END_COL - START_COL)).Value = rowresults 

     For colCounter = START_COL To END_COL 
'find average of RT values 
     rowresults(1, colCounter) = Application.WorksheetFunction.Average(values((5 * rowCounter - 1), colCounter), values((5 * rowCounter - 1), colCounter + 6), values((5 * rowCounter - 1), colCounter + 12)) 

     Next colCounter 
'print row of results 
     .Range(.Cells(5 * rowCounter - 1, OUTPUT_COL_START), .Cells(5 * rowCounter - 1, OUTPUT_COL_START + END_COL - START_COL)).Value = rowresults 

    Next rowCounter 

    End With 
End Sub 

這裏是打印值,包括空白單元格的代碼:

For r = 1 To UBound(d, 1) 
     k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key 
     If d(r, 19) = 1 Then 
     dBT(k) = dBT(k) + IIf(d(r, COL_AOI) = "AOI Entry", 1, 0) 'get count 
     Else: dBT(k) = "" 
     End If 
    Next r 

    'populate array with appropriate counts for each row 
    For r = 1 To UBound(d, 1) 
     k = d(r, 1) & "|" & d(r, 2) 'create key 
     resBT(r, 1) = dBT(k)   'get the count 
    Next r 
Call createsummarytable 
Call PopSummaryAOI(dBT) 

dBT.RemoveAll 

    For r = 1 To UBound(d, 1) 
     k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key 
     dBT(k) = d(r, COL_RT) 
    Next r 

Here is a screenshot of the data the average function works on

至於我可以告訴(20 + 17)/ 2 =/= 12.33,而(20 + 17 + 0)/ 3 = 12.33,這個單元格完全是空白的,所以它不應該包含在平均值中。

回答

2

當你調用.Range(.Cells(1, 1), .Cells(199, 18)).Value,你最終的Variant數組。 WorksheetFunction.Average對待Range s和Variant排列不同於它對待Variant s。如果你給它一個參數個人Variant,它投下他們對Double秒,鑄造EmptyDouble的結果爲0如果你想讓它忽略空白單元格,你需要通過它RangeVariant()

Sub Example() 
    Dim test As Variant 
    test = Empty 'This is what you get from an EmptyCell.Value 
    Debug.Print CDbl(test) 'Prints 0. 
    Debug.Print WorksheetFunction.Average(test, 0, 10) 'Prints 3.33333333333333. 
    Range("A1").ClearContents 'Nothing in A1 now. 
    Debug.Print Range("A1").Value = Empty 'Prints True 
    Debug.Print WorksheetFunction.Average(Range("A1"), 0, 10) 'Prints 5 
End Sub 
+0

如果定義'test'作爲'Variant'陣列3層的元件(空,0,10),'WorksheetFunction.Average(測試)'返回圖5,所以'Average'行爲並不一致。 – BrakNicku

+0

@BrakNicku - OP傳遞單個的'Variant'值,而不是'Variant()'。更新。 – Comintern

+0

@ThomasInzina - LOL。改變了ping。 – Comintern