2016-03-09 186 views
0

我正在尋找一種在二維數組內優雅平均的方法。我的代碼適用於小範圍的元素,但我需要一些可用於大量元素的內容。陣列中的平均值

這是我對少數元素的代碼。此代碼將在同一行上平均3個元素並將結果返回給結果數組。我如何重寫這50個元素?正如你所想象的,這種方法對於大量的元素不適用。

For i = 1 To UBound(TMP) 
       results(i, 1) = ((TMP(i, 13) + TMP(i, 14) + TMP(i, 15))/3) 
    Next i 

回答

0

您將所需的值移動到1D數組中,然後使用application.Average()函數。例如:

Dim rwarr() As Double 

For i = 1 To UBound(TMP, 1) 
    ReDim rwarr(1 To UBound(TMP, 2)) As Double 
    For j = 1 To UBound(TMP, 2) 
     rwarr(j) = TMP(i, j) 
    Next j 
    results(i, 1) = Application.Average(rwarr) 
Next i 
0

下面是可以採取多個列的平均值的2-d陣列的每一行中的功能。

Public Function AverageRowsIn2DArray(Arr As Variant, LBoundCol As Integer, UBoundCol As Integer) As Variant 
    Dim iNumValues As Integer 
    iNumValues = UBoundCol - LBoundCol + 1 
    If iNumValues < 1 Then GoTo ErrHandler 
    On Error GoTo ErrHandler 
    Dim retArr As Variant 
    Dim inArr As Variant 
    If TypeName(Arr) = "Range" Then 
     inArr = Arr.Value 
    Else 
     inArr = Arr 
    End If 

    ReDim retArr(1 To UBound(inArr), 1 To 1) 

    Dim i As Integer, j As Integer 
    Dim dSum As Double 

    For i = 1 To UBound(inArr) 
     dSum = 0 
     For j = LBoundCol To UBoundCol 
      dSum = dSum + inArr(i, j) 
     Next j 
     retArr(i, 1) = dSum/iNumValues 
    Next i 

    AverageRowsIn2DArray = retArr 
    Exit Function 

ErrHandler: 
    AverageRowsIn2DArray = 0 
End Function 

在特定情況下,你會想打電話

Dim results() as Double 
results = AverageRowsIn2DArray(TMP, 13, 15) 
+0

感謝您的幫助斯科特! – centurion79b

0

感謝功能斯科特。我做了一些修改,將輸入限制在一行中。它的工作很棒!謝謝。下面是修改的功能:

Public Function AverageRowsIn2DArray(Arr As Variant, Nrow As Integer, LBoundCol As Integer, UBoundCol As Integer) As Variant 
    Dim iNumValues As Integer 
    iNumValues = UBoundCol - LBoundCol + 1 
    If iNumValues < 1 Then GoTo ErrHandler 
    On Error GoTo ErrHandler 
    Dim retArr As Integer 
    Dim inArr As Variant 
    If TypeName(Arr) = "Range" Then 
     inArr = Arr.Value 
    Else 
     inArr = Arr 
    End If 

    Dim i As Integer, j As Integer 
    Dim dSum As Double 


    For i = LBoundCol To UBoundCol 
     dSum = dSum + inArr(Nrow, i) 
    Next i 
    retArr = dSum/iNumValues 


    AverageRowsIn2DArray = retArr 
    Erase inArr 
    retArr = 0 
    Exit Function 

ErrHandler: 
    AverageRowsIn2DArray = 0 
End Function 

現在我的電話是,

results(i, 4) = AverageRowsIn2DArray(TMP, i, 13, 15) 
0

假設你已經在第一等級小於30K的元素,使用WorksheetFunction objectINDEX function剝離一行來處理AVERAGE自。

Sub avgVals() 
    Dim tmp As Variant, results As Variant, a As Long 

    With Worksheets("Sheet2") 
     With .Cells(1, 1).CurrentRegion 
      With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0) 
       tmp = .Cells.Value2 
      End With 

      ReDim results(LBound(tmp, 1) To UBound(tmp, 1), 1 To 1) 
      For a = LBound(tmp, 1) To UBound(tmp, 1) 
       results(a, 1) = Application.Average(Application.Index(tmp, a, 0)) 
      Next a 

      With .Resize(.Rows.Count - 1, 1).Offset(1, .Columns.Count) 
       .Cells.Resize(UBound(results, 1), UBound(results, 2)) = results 
      End With 

     End With 


    End With 
End Sub 

使用Excel Application object方便INDEX切片數組與衆不同的是不是最快的方法,並最終有limiations但它可以提供實現你AVERAGE結果小批量的有利方法。