我有2个工作表,Main和Return。我在Main中有值,在Return中有结果。我试图在包含索引值的数组中找到一个特定的位置(数据来自主表),例如10,20,40,50,60等...然后取上面的5个值和低于该指数的5个值,包括我正在搜索的索引值,并做一个平均值,将平均值返回到工作表上的一个单元格(到返回表),因此平均值为11。到目前为止,我已经设法使用以下方法将范围存储在数组中:
Public Sub myArray()
Dim myArr() As Variant
Dim R As Long
Dim C As Long
myArr = Range("C6:D1126")
For R = 1 To UBound(myArr, 1)
For C = 1 To UBound(myArr, 2)
Debug.Print myArr(R, C)
Next C
Next R
End Sub
在阵列中搜索/找到值并取平均值让我摸不着头脑......
请帮忙......谢谢。帮助处理数组中的代码或操作工作表本身的数据可以正常工作:)
示例文件 - > http://www.filedropper.com/indexes
答案 0 :(得分:1)
您可以使用此UDF:
Function avrg(indx, rng As Range)
Dim i, minI As Long, maxI As Long
i = Application.Match(indx, rng.Columns(2), 0)
If IsError(i) Then
avrg = CVErr(xlErrNA)
Exit Function
End If
With WorksheetFunction
minI = .Max(1, i - 5)
maxI = .Min(rng.Rows.Count, i + 5)
avrg = .Average(rng.Cells(1, 1).Offset(minI - 1).Resize(maxI - minI + 1))
End With
End Function
此UDF在Index
列(主工作表)中找到第一个值(例如10或20),其中上方有5个值,下方有5个值,并返回列Value
的相应值的平均值(Main片)。如果您需要从Index
列中获取平均值,请将rng.Cells(1, 1)
更改为rng.Cells(1, 2)
另请注意UDF中的这一行:
minI = .Max(1, i - 5)
maxI = .Min(rng.Rows.Count, i + 5)
如果我们不能取下面的5个值和5个值高于索引i
(例如,如果目标值的索引等于2),我们在第一种情况下将所有值从start开始,在第二种情况下所有值直到结束范围。
然后您可以从工作表中调用它:在工作表Dash
单元格C4
中输入此公式:=avrg(C3,Main!$C$6:$D$1126)
并将其拖过。
来自VBA:
Sub test()
Dim rng As Range
Dim rngInd As Range
Dim cell As Range
Set rng = ThisWorkbook.Worksheets("Main").Range("C6:D1126")
Set rngInd = ThisWorkbook.Worksheets("Dash").Range("C3:L3")
For Each cell In rngInd
cell.Offset(1).Value = avrg(cell.Value, rng)
Next cell
End Sub
如果未找到#N/A
值,则函数返回indx
。