【发布时间】:2018-01-31 15:00:09
【问题描述】:
我正在寻找一种方法来创建一个数组,它可以在其中找到 E、F、G 和 H 列的平均值,然后将平均值存储在一个数组中。唯一的问题是每列中的行数因每个文件而异,我将在其上运行此数组(尽管所有列的行数相同),所以我强调它将是一个动态数组,我也想要平均从第二行开始,因为我在第一行有标题。如果有人知道如何做到这一点,我将非常感激帮助,因为我完全糊涂了。
【问题讨论】:
我正在寻找一种方法来创建一个数组,它可以在其中找到 E、F、G 和 H 列的平均值,然后将平均值存储在一个数组中。唯一的问题是每列中的行数因每个文件而异,我将在其上运行此数组(尽管所有列的行数相同),所以我强调它将是一个动态数组,我也想要平均从第二行开始,因为我在第一行有标题。如果有人知道如何做到这一点,我将非常感激帮助,因为我完全糊涂了。
【问题讨论】:
据我所知,空单元格不算数。所以没有必要定义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
【讨论】:
您可以对Average() 使用WorksheetFunction 方法。
根据我从您的问题中了解到的情况,您希望将平均值存储在一个数组中,所以就这样吧..
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
【讨论】:
我的(非常相似的)解决方案与此处发布的其他解决方案:
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
【讨论】: