我是excel VBA的新手,我想计算每个包含数据的列的平均值
但是列数可以根据用户复制和粘贴多少列数据而改变。
这是我到目前为止所拥有的:
rAmCharts
但这似乎只计算B列中数据的平均值。我想计算每个有数据的列的平均值,并将该值放入没有任何数据的第一行中。
答案 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)