2014-02-24 103 views
0

我有2個工作表,Main和Return。 Main中的值和Return中的結果。我試圖在包含索引值的數組中找到一個特定位置(數據來自主表),例如10,20,40,50,60等......然後取上面的5個值和低於這個指數的5個值,包括我正在搜​​索的指數值,並做一個平均值,將平均值返回到表格上的單元格返回表),因此平均做出11個值。到目前爲止,我已成功使用存儲陣列中的範圍:在數組中值和平均Excel VBA處理陣列數據

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

您可以使用此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(主表)的對應值的平均值。如果你需要的平均數值從Index列,在這行UDF改變rng.Cells(1, 1)rng.Cells(1, 2)

還要注意:

minI = .Max(1, i - 5) 
maxI = .Min(rng.Rows.Count, i + 5) 

,如果我們不能採取上述指標i低於5個值和5個值(例如,如果目標值的索引等於2),我們將第一種情況下的所有值從開始和第二種情況中取所有值直到範圍的結尾。

然後,您可以從工作表中調用它:在工作表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值未找到。

+1

絕對的天才。非常感謝。它完美的作品。 – Fwafa