使用(r,c)格式来计算具有非连续单元格的平均公式

以下是我的数据的屏幕截图:

这是我的代码:

Sub sumavg() With Worksheets(datasummary) Dim i As Long Dim j As Long j = 20 For i = 1 To 30 For j = 20 To 25 Cells(5 * i - 2, j).Value = Average(A(5 * i - 2), G(5 * i - 2), M(5 * i - 2)) Next j Next i End With End Sub 

我正在努力处理AVERAGE公式的语法。 这是我第一次尝试在macros中使用公式。 如果可能的话,我想使用单元格地址的(r, c)格式,但目前还没有find类似的东西。 我想在第3行的每个第6个单元格中取平均值,然后打印到T3。 这个过程需要循环6次,每个块和40个块。 此刻此代码正在返回一个“子或函数未定义”错误,并突出显示平均公式中的列标识符。

 Sub sumavg() Dim i As Long, j As Long With Worksheets("datasummary") For i = 1 To .Range("A" & .Rows.Count).End(xlUp).Row Step 5 For j = 1 To 5 .Rows(i + 2).Range("T1:Y2").Value = "=IFERROR(AVERAGE(RC[-19],RC[-13],RC[-7]),""N/A"")" Next Next End With End Sub 
 Sub sumavg() Dim i As Long, j As Long With Worksheets("Sheet1") ' <~~ double-quotes For i = 1 To 30 For j = 20 To 25 .Cells(5 * i - 3, j).Value = Application.Average( _ Application.Union( _ .Range("A" & (5 * i - 3)), .Range("G" & (5 * i - 3)), .Range("M" & (5 * i - 3)) _ )) Next j Next i End With End Sub 

ASH的答案会给你你想要的东西,但这将会快得多…

这有三个原因更快:

  1. 从个别细胞读取是缓慢的。 将所有单元格加载到Variant数组中,然后使用该数组会更快。

  2. 编写单个单元很慢。 将写入单元格的次数最小化的速度会更快,所以我将结果加载到1×6的数组中并将它们插入目标位置。

  3. 使用Application.Average是来自Excel 95的传统语法。使用Application.WorksheetFunction.Average会更快,您可以获得Intellisense和强types结果。

NB。 你可以避免使用Average函数(并且提高一点性能)并计算内存中的结果,因为这只是一个简单的平均值,只有3个input,所以你可以使用:

  'Calculate the average ourselves rowresults(1, colCounter) = (values((5 * rowCounter - 2), colCounter) + values((5 * rowCounter - 2), colCounter + 6) + values((5 * rowCounter - 2), colCounter + 12)) / 3 

码:

 Sub sumavg() Dim rowCounter As Long Dim colCounter As Long Dim values() As Variant Const START_COL As Long = 1 Const END_COL As Long = 6 Const OUTPUT_COL_START As Long = 20 With Worksheets("Sheet1") 'Load the values into an array - reading them this way is much faster than cell-by-cell values = .Range(.Cells(1, 1), .Cells(150, 18)).Value For rowCounter = 1 To 30 ReDim rowresults(1 To 1, START_COL To END_COL) For colCounter = START_COL To END_COL 'Use Application.WorksheetFunction.Average to get Intellisense and a strongly typed Double result rowresults(1, colCounter) = Application.WorksheetFunction.Average(values((5 * rowCounter - 2), colCounter), values((5 * rowCounter - 2), colCounter + 6), values((5 * rowCounter - 2), colCounter + 12)) Next colCounter 'Write the entire row of results at once - 6 times faster than writing individual cells .Range(.Cells(5 * rowCounter - 2, OUTPUT_COL_START), .Cells(5 * rowCounter - 2, OUTPUT_COL_START + END_COL - START_COL)).Value = rowresults Next rowCounter End With End Sub