将平均值计算添加到下一个空白行 [英] Adding an Average Calculation to the next blank row
问题描述
我一直在努力寻找一种方法将平均值添加到列中的第一个空单元格(列中将有多个空单元格,因为它被分成几个组,但我希望只循环它,这样在填充第一个空格之后,它将对下一个空格执行相同的操作。我希望它是所示图像中C2:C6的平均值,但单元格范围和列数都是动态的。我试图让它找到下一个空行,然后在它上面取平均值,但显然我不擅长编程。第二个空格用于标准误差,但我希望编辑代码以使平均值应用于标准误差。此外,大部分代码来自StackExchange上的Ambie(Reference Link)
Example of the sheet I am working with
Sub MeanSEM01()
Dim nextrow As Long
nextrow = Cells(Rows.Count, "A").End(xlUp).Row + 1
Dim lastCol As Long, i As Long
Dim rng As Range
'Find the last column.
'Assumes the relevant column is the last one with data in row 5.
With Sheet1
lastCol = .Cells(nextrow - 1, .Columns.Count).End(xlToLeft).Column
End With
'Iterate the columns from 1 (ie "A") to the last.
For i = 1 To lastCol
With ActiveSheet
'Define the data range for this column.
'Assumes last cell from bottom of sheet is the end of data.
Set rng = .Range(.Cells(nextrow - 1, i), .Cells(.Rows.Count, i).End(xlUp))
'Write the average to the cell above.
.Cells(nextrow, i) = WorksheetFunction.Average(rng)
End With
Next
End Sub
我还检查了即时窗口,发现我的范围定义绝对是关闭的,这就是为什么它在平均步长上失败了。我尝试将工作表函数更改为公式范围(.Cells(nextrow,i))。公式==平均值(Rng)&q;,但我认为范围是我的问题。
推荐答案
我设计下面的代码是为了便于您理解,因为您很快就必须修改它。
Option Explicit
Sub MeanSEM01()
' 306
Dim Ws As Worksheet ' define the sheet to work on
Dim Rng As Range ' range of relevant column headers
Dim C As Long ' loop counter: columns of Rng
Set Ws = Worksheets("Sheet1") ' adapt the name to what you have
With Ws
' in row 1, start from column C to last used cell in row 1
' change to suit
Set Rng = .Range(.Cells(1, "C"), .Cells(1, .Columns.Count).End(xlToLeft))
End With
For C = 1 To Rng.Columns.Count
CalculateAvg Rng.Columns(C).Offset(1)
Next C
End Sub
Private Sub CalculateAvg(FirstDataCell As Range)
' 306
Dim Rng As Range ' Data range
Dim Target As Range ' Cell to write data to
Set Target = FirstDataCell.End(xlDown).Offset(1)
With FirstDataCell.Worksheet
Set Rng = .Range(FirstDataCell, FirstDataCell.End(xlDown))
Target.Value = WorksheetFunction.Average(Rng)
Target.Offset(1).Value = WorksheetFunction.StDev(Rng)
End With
End Sub
从Option Explicit
开始。你需要它,因为你认为你不需要它。
‘Sub MeanSEM01’不是一个好名字,因为它需要先验知识才能被理解。名字应该是描述性的,而不是谜语。此过程只会找出您有多少列。它通过查看第一行来实现这一点。然后,它只为每一列调用一次Sub CalculateAvg
。每次它通过该列的单元格,但从第1行(那将是第2行,对吗?)以Sub CalculateAvg
作为参数。Sub CalculateAvg
将其理解为取平均值的区域中的第一个单元格。
Sub CalculateAvg
使用第一个单元格查找要写入的单元格(Target
),该单元格是数字列下的第一个空单元格。
它以相同的方式计算要从中取平均值的范围,只是它使用最后使用的单元格而不是下一个空单元格。现在应用工作表函数来计算平均值和标准差,将第一个写入Target
,第二个写入Target
下面的单元格。
需要理解的重要一点是,工作表在Sub MeanSEM01
中定义。从工作表中取出FirstDataCell
。Sub CalculateAvg
从FirstDataCell
知道Target
的工作表。因此,只需在MeanSEM01
中更改选项卡名,即可将整个操作转移到另一个工作表。同样,可以在此处更改列:和此行CalculateAvg Rng.Columns(C).Offset(1)
中FirstDataCell
。
要运行代码,只需调用MeanSEM01
。您永远不需要调用Sub CalculateAvg
。仅供Sub MeanSEM01
使用,因此定义为Private
。
这篇关于将平均值计算添加到下一个空白行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!