将平均值计算添加到下一个空白行 [英] Adding an Average Calculation to the next blank row

查看:20
本文介绍了将平均值计算添加到下一个空白行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力寻找一种方法将平均值添加到列中的第一个空单元格(列中将有多个空单元格,因为它被分成几个组,但我希望只循环它,这样在填充第一个空格之后,它将对下一个空格执行相同的操作。我希望它是所示图像中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中定义。从工作表中取出FirstDataCellSub CalculateAvgFirstDataCell知道Target的工作表。因此,只需在MeanSEM01中更改选项卡名,即可将整个操作转移到另一个工作表。同样,可以在此处更改列:和此行CalculateAvg Rng.Columns(C).Offset(1)FirstDataCell

要运行代码,只需调用MeanSEM01。您永远不需要调用Sub CalculateAvg。仅供Sub MeanSEM01使用,因此定义为Private

这篇关于将平均值计算添加到下一个空白行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆