Excel VBA操纵数组数据

时间:2014-02-24 20:42:45

标签: excel excel-vba vba

我有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

1 个答案:

答案 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