在数组中存储平均值

时间:2018-01-31 15:00:09

标签: arrays excel vba excel-vba average

我正在寻找一种方法来创建一个数组,在该数组中找到E,F,G和H列的平均值,然后将平均值存储在数组中。唯一的问题是每个列中的行数量因我将运行此数组的每个文件而异(尽管所有列都具有相同的行数)所以我压力它将是一个动态数组,我也想要平均从第二行开始,因为我在第一行有标题。如果有人知道如何做到这一点,我会非常感激帮助,因为我完全糊涂了。

3 个答案:

答案 0 :(得分:3)

据我所知,空单元格不计算在内。所以没有必要定义lastrow。试试这个:

Sub AvToArray()
    Dim rng As Range
    Dim col As Range
    Dim arrAv()
    Dim i As Long

    Set rng = Range("E:H")
    ReDim arrAv(rng.Columns.Count)

    For Each col In rng.Columns
        arrAv(i) = WorksheetFunction.Average(col)
        i = i + 1
    Next col

End Sub

答案 1 :(得分:0)

您可以将WorksheetFunction方法用于Average()

根据我对你的问题的理解,你希望平均值存储在一个数组中,所以在这里你去..

Public Function lastRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1)
    With ws
        lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
    End With
End Function

Sub test()

    Dim ws As Worksheet, aveArr(4) As Double
    Set ws = ThisWorkbook.Worksheets(1)

    'You said that you wanted to store the values to be inside an array...
    With WorksheetFunction
        aveArr(0) = .Average(ws.Range("E2:E" & lastRow(ws, "E")))
        aveArr(1) = .Average(ws.Range("F2:E" & lastRow(ws, "F")))
        aveArr(2) = .Average(ws.Range("G2:E" & lastRow(ws, "G")))
        aveArr(3) = .Average(ws.Range("H2:E" & lastRow(ws, "H")))
    End With

    MsgBox aveArr(0) & vbNewLine & _
            aveArr(1) & vbNewLine & _
            aveArr(2) & vbNewLine & _
            aveArr(3)

End Sub

答案 2 :(得分:0)

我的(非常相似)解决方案发布在这里:

Sub AverageArray()

Dim myarray As Variant, sht As Worksheet, lastrow As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells(sht.Rows.Count, "E").End(xlUp).Row 'or F, G, H, etc.

myarray = Array(Application.Average(Range("E2:E" & lastrow)), _
                Application.Average(Range("F2:F" & lastrow)), _
                Application.Average(Range("G2:G" & lastrow)), _
                Application.Average(Range("H2:H" & lastrow)))

Debug.Print myarray(0)
Debug.Print myarray(1)
Debug.Print myarray(2)
Debug.Print myarray(3)
End Sub