【问题标题】:Average rows of variable length VBA可变长度 VBA 的平均行数
【发布时间】:2012-07-13 01:58:07
【问题描述】:

我正在尝试获取一个简单的 VBA 代码作为宏的一部分,该宏将在 B 列中放置每行值的平均值。 我有生成时间序列的代码,并在每个模拟中填充一列,这样每一列都是从 C 列开始的时间序列。 模拟的数量各不相同,所以我只需要对每个时间点(即所有模拟中的每一行)的值进行平均,同时调整运行的模拟数量(填充的列)。然后,我希望它生成所有时间序列的单个图表,突出显示计算的平均值。 如果您能提供帮助,非常感谢!

例如,这里的代码从 sheet1 中获取时间步长的值并将其放入 columnA sheet2 中。我希望宏现在将平均值放在 B 列下方的适当行中:

Sheets("Sheet1").Select
Range("E5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Sheet2").Select
Cells(1, 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

【问题讨论】:

  • 您可以使用平均公式。示例 =AVERAGE(C1:AA1)。 AVERAGE 将获取范围内每个具有值的单元格的平均值。因此,如果您引用 10 个单元格,但只有 2 个有值,它将提供 2 个的平均值。
  • 我同意 Daniel 的观点 - 为什么不直接使用内置的 AVERAGE 函数。您可以添加电子表格的屏幕打印吗?
  • 感谢 cmets。我想将此功能合并为自动生成这些时间序列的宏的一部分。由于我不知道会有多少列(可能是数百列),并且我可能不得不多次重复模拟,因此需要将其合并为该宏的一部分。我已经更新了问题并更详细地说明了你要求。

标签: excel sum row average vba


【解决方案1】:

试试这个

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = Sheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        .Range("B2:B" & lRow).Formula = _
        "=IF(ISERROR(AVERAGE(C2:E2)),"""",AVERAGE(C2:E2))"
    End With
End Sub

跟进

试试这个

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long, lCol As Long
    Dim ColNm As String

    Set ws = Sheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        lCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
        ColNm = Split(.Cells(, lCol).Address, "$")(1)

        .Range("B2:B" & lRow).Formula = "=IF(ISERROR(AVERAGE(C2:" _
                                        & ColNm & _
                                        "2)),"""",AVERAGE(C2:" & _
                                        ColNm & "2))"
    End With
End Sub

【讨论】:

  • 谢谢你,悉达多。效果很好。请查看其他评论。
  • 我想提一件事。我的代码不包含错误处理,它假定 Col C 以后总会有数据。
  • 感谢您的帮助。因为我计划运行数千个时间序列,所以 C 列之后总会有数据。**** 我想知道您是否有代码可以自动检测工作表上的数据范围以绘制图表?即用合适的东西替换以下代码的范围部分?我看到你在之前的帖子中给出了类似的建议,但我无法适应我的。 Sub Graph() ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SetSourceData Source:=Range("Sheet2!$A$1:$E$101") End Sub
  • Range("Sheet2!$A$1:$E$101") 更改为Range("Sheet2!$A$1:$" & ColNm & "$" & lRow) 我已经在上面的代码中向您展示了如何计算ColNmlRow
  • 太棒了。效果很好。我很感激你。非常感谢。
【解决方案2】:

尽管这段代码会有很多不同的变体,但试试这个:

Sub AddAvgFormula()

With Sheets("Sheet2")
        .Range("B2").FormulaR1C1 = "=AVERAGE(RC[1]:RC[3])"
        .Range("B2").Copy
        .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row).PasteSpecial Excel.xlPasteFormulas
End With

End Sub

在您当前代码的末尾End Sub 之前添加:

Call AddAvgFormula

这是原始代码的变体:

Sub AddAvgFormula()

With Sheets("Sheet2")
        .Range("B2") = "=AVERAGE(C2:E2)"
        .Range("B2").Copy
        .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row).PasteSpecial Excel.xlPasteFormulas
End With

End Sub

另一个更短但可能不那么直观的变体:

Sub AddAvgFormula()

With Sheets("Sheet2")
        .Range("B2:B" & .Cells(Excel.Rows.Count, 1).End(Excel.xlUp).Row) = "=AVERAGE(C2:E2)"
End With

End Sub

【讨论】:

  • 大家好。非常感谢。在计算所示示例的平均值时,这两种贡献都非常有效。但是,列数会有所不同,因此需要根据模拟生成的重复次数从列 C 到“x”计算平均值。我很难让它识别有多少列需要平均,然后才能很好地计算你的代码。对生成图表的任何帮助也将是一个很大的好处;)!非常感谢您对此的帮助。再次感谢!
  • 每行的 x 会有所不同吗?还是 x 对于工作表中的每一行都相同?也许尝试将最后一个变体 E2 更改为 Z2...只要其他行为空,那么 AVERAGE 函数将忽略它们。
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多