Excel VBA-计算具有动态列数的数据平均值

时间:2019-06-09 18:00:20

标签: excel vba

我是excel VBA的新手,我想计算每个包含数据的列的平均值

但是列数可以根据用户复制和粘贴多少列数据而改变。

这是我到目前为止所拥有的:

rAmCharts

但这似乎只计算B列中数据的平均值。我想计算每个有数据的列的平均值,并将该值放入没有任何数据的第一行中。

2 个答案:

答案 0 :(得分:0)

对于VBA新手来说,这是一个很大的努力,您的代码只需要进行一些调整。

首先,一行:

lastcol = Range("B5", Range("B5").End(xlToLeft)).Columns.Count + 1

基本上会找到范围“ B5”(最可能是“ A5”)的左端,因此lastcol将始终等于3。

第二行:

Range(ActiveCell, ActiveCell.Offset(0, i)).Value = ...

定义从ActiveCell开始到该单元格的偏移值结束的范围。换句话说,根据i的值,您将在该范围内有多个单元格,但是ActiveCell将始终是该范围内的第一个单元格。假设您的输出值是double而不是数组,那么您的代码会将该值写入范围内的每个单元格。因此,您以前的计算总是会被覆盖。

还要注意的一点是,您应该始终使用图纸对象限定范围。在您的代码中,存在处理错误工作表的风险。我还会避免使用ActiveCell属性,因为一个错误的选择可能会弄乱整个工作表。

使用F8逐步执行代码是值得的,因为您可以看到分配给变量的值。我还喜欢在测试期间选择我的范围,以查看正在识别哪些单元格。也许您可以在未来的开发中采用这些做法。

总而言之,您的代码可能看起来像这样:

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(5, .Columns.Count).End(xlToLeft).Column
End With

'Iterate the columns from 1 (ie "A") to the last.
For i = 1 To lastCol
    With Sheet1
        'Define the data range for this column.
        'Assumes last cell from bottom of sheet is the end of data.
        Set rng = .Range(.Cells(5, i), .Cells(.Rows.Count, i).End(xlUp))
        'Write the average to the cell above.
        .Cells(4, i) = WorksheetFunction.Average(rng)
    End With
Next

答案 1 :(得分:-1)

好吧,首先,您可以为每个循环使用a来遍历单元格以及可以使用usedRange属性获得的旧单元格。

usedRange

For Each

我将Microsoft文档链接到它们,结合使用它们,您应该能够导航到包含内容的每个单元格。