【问题标题】:Having problems with averaging unspecified range of columns对未指定的列范围进行平均时遇到问题
【发布时间】:2019-07-08 14:56:44
【问题描述】:

我正在尝试将一列中的所有行与多列(数量不确定)进行平均。我知道我可以编写一个代码来一次完成每一列,但我希望找到一种方法来缩短代码长度。

到目前为止,我已经设法平均一列 (B),但似乎无法自动填充到最后一列,这可能会改变长度。我也试过做一个 if 语句,比如“如果上面一行有一个值,那么做平均”,但我不太擅长使用 VBA,所以真的不知道该怎么做。 我需要帮助对所有包含值的列进行与下面代码中所示相同的平均。我的值特别从第 5 行开始,一直下降到一个未指定的范围。

Dim rng1 As Range
Dim rng2 As Range
Dim myavg As Range

Set rng1 = Range("B5")
Set rng2 = Range("B5").End(xlDown)
Set myavg = Range("B5").End(xlDown).Offset(1, 0)

myavg = "=Average(" & rng1.Address & ":" & rng2.Address & ")"

【问题讨论】:

  • 小注:一般建议从底部开始使用End(xlUp),而不是从顶部开始使用End(xlDown)——如果数据的最底部单元格是B5,那么这样就可以了一直到 B1048576。
  • 感谢您的评论。我确实尝试过,并最终将我行中最后一个单元格的所有数据平均下来,一直到数千行,因为我不擅长编写 VBA。因此,我放弃了,改为这样写。
  • 试试Set rng2 = Range("B5").EntireColumn.Cells(Rows.Count,1).End(xlUp) - 这将从列的底部开始,然后向上移动,直到它到达数据或工作表的顶部。然后你可以使用Set myavg = rng2.Offset(1,0) 来获取下一个单元格
  • 谢谢。那行得通。您是否还知道我如何在接下来的几列中轻松地执行相同的公式?现在我希望平均所有列中的行,直到我到达 S(但如上所述,此列范围可能会改变)。
  • @Jesse 您可以使用Do While rng1.Value <> "" 并在每个循环中将rng1 偏移一列。

标签: excel vba average


【解决方案1】:

你可以使用Do While如下:

Dim rng1 As Range
Dim rng2 As Range
Dim myavg As Range

Set rng1 = Range("B5")

Do While rng1.Value <> ""
    Set rng2 = Cells(Rows.count, rng1.Column).End(xlUp) ' using @Chronocidal's suggestion above
    Set myavg = rng2.Offset(1, 0)

    myavg.Formula = "=Average(" & rng1.Address & ":" & rng2.Address & ")"

    Set rng1 = rng1.Offset(0, 1)
Loop

【讨论】:

  • 你们太棒了。那效果很好!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2018-01-02
  • 2018-09-13
相关资源
最近更新 更多