【问题标题】:Dynamic range calculations macro动态范围计算宏
【发布时间】:2016-02-01 02:37:09
【问题描述】:

我有一个由 12 张组成的 Excel 文档。
每张工作表都包含大量数据,范围从 A 列到 X 列,并且行中的范围可变。
我正在尝试为每张纸计算每列的平均值和标准误差。最好在摘要表上提供输出。

我的思考过程:

  1. 我设法让最后一行下的每个单元格计算平均值。
  2. 当我尝试对标准误差执行相同操作时,问题是步骤 1) 中计算的平均值包含在计算中。
  3. 毕竟,在单独的“摘要”选项卡中显示这些计算的结果似乎更方便。

这是我尝试过的代码,它适用于在列中最后一个值的正下方生成平均值。

Sub ColumnAverageFormula()

For i = 3 To 24
    Columns(Columns(i).Address).Select
    Cells(1, ActiveCell.Column).End(xlDown).Offset(1, 0).Formula = "=Average(" & Cells(1, ActiveCell.Column).Address(0, 0) & ":" & Cells(1, ActiveCell.Column).End(xlDown).Address(0, 0) & ")"
    Next i
For j = 3 To 24
    Columns(Columns(j).Address).Select
    Cells(1, ActiveCell.Column).End(xlDown).Offset(1, 0).Formula = "=stdev.p(" & Cells(1, ActiveCell.Column).Address(0, 0) & ":" & Cells(1, ActiveCell.Column).End(xlDown).Address(0, 0) & ")"
    Next j
End Sub

Tl;dr:我想编写代码来计算我的 Excel 文件中每个工作表的每一列的平均值和标准误差,结果应该在“摘要”工作表上生成。

【问题讨论】:

  • 你能举一个简单的例子来说明那个摘要表的样子吗?它只是有一堆数字,还是对公式应用于哪一列的一些引用?
  • 如果您的数据正确Table,您将省去很多麻烦。
  • 大家好,感谢您的快速回复。这是一个示例文件。我现在给列添加了标题,如果它变得更难,可以将其删除。 filedropper.com/example_8">file</a>提前致谢!

标签: vba excel average standard-error


【解决方案1】:

您插入的公式引用了从第 1 行开始的范围。通常,像您描述的数据集在第一行有某种基于文本的列标题标签。如果是这种情况,您可能希望从第 2 行开始,而不是从第 1 行开始。以下内容从第 1 行开始。

Sub ColumnAverageFormula()
    Dim c As Long, sr As Long

    With Worksheets("Sheet1")
        sr = .Cells(Rows.Count, 3).End(xlUp).Row
        For c = 3 To 24
            .Cells(sr + 1, c).Formula = "=average(" & .Range(.Cells(1, c), .Cells(sr, c)).Address(0, 0) & ")"
            .Cells(sr + 2, c).Formula = "=stdev.p(" & .Range(.Cells(1, c), .Cells(sr, c)).Address(0, 0) & ")"
        Next c
    End With
End Sub


'as an alternate, you might consider putting all of the formulas in at once
Sub ColumnAverageFormula()
    Dim c As Long, sr As Long

    With Worksheets("Sheet1")
        sr = .Cells(Rows.Count, 3).End(xlUp).Row
        .Cells(sr + 1, 3).Resize(1, 22).Formula = "=average(" & Range(.Cells(1, 3), .Cells(sr, 3)).Address(0, 0) & ")"
        .Cells(sr + 2, 3).Resize(1, 22).Formula = "=stdev.p(" & Range(.Cells(1, 3), .Cells(sr, 3)).Address(0, 0) & ")"
    End With
End Sub

如果您想从第 2 行开始,请将 .Range(.Cells(1, c), ... 更改为 .Range(.Cells(2, c), ...

【讨论】:

  • 嗨 Jeeped,这已经很棒了。我已经尝试了代码并且它有效!你知道我如何为所有工作表循环并将结果复制到摘要页面吗?非常感谢您的回复!
  • 不客气。至于您的后续行动,这应该是一个新问题,以免它变成Russian Doll question。开始做一些事情(有很多例子),如果遇到麻烦,可以提出一个新问题。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多