我有一系列数据,来自类型范围变量中保存的vba提示。我试图通过这个范围,并为每个空单元格,用它的平均值列替换它。
我可以很好地替换空单元格,但它可以获得我正在使用的每个列的平均值。有一个简单的方法吗?
我不想为每一列做一个循环,每一行循环,然后使用total / numberOfNonEmptyCells计算它,因为这需要相当长的时间(而且我显然在这里做错了,因为我&# 39;得到错误的价值)...但我确定它不是唯一或正确的方法。
有什么方法可以说:
对于每个列
从范围中获取第i列 获取该列的平均值 把它放在一个数组中。
然后有一个循环用这个值替换空单元格?
或者,或者更好的方法是将公式放入空单元格中= AVERAGE(Column from Range)
AVERAGE(Range.Columns,1)
尝试了这个并且它没有用,因为它类型为Column我相信哪个平均值不会合作。
最简单的方法我将标记为答案。它需要使用一个宏,而不是仅仅手动放入公式,因为它适用于大量纸张上的大量数据。
感谢。
答案 0 :(得分:2)
这将是每列选定的范围,填充空白单元格,非空白单元格的平均值。
它通过最大限度地减少对循环中单元格的访问来解决您的速度问题(在大约5,000,000个单元格上测试,花了大约10秒)(在更复杂的代码中可能会进一步改进)
保留所有公式
Sub FillInAverage()
Dim rng As Range
Dim col As Range
Dim a As Variant
Dim dat As Variant
Dim i As Long
Set rng = Selection
For Each col In rng.Columns
a = Application.WorksheetFunction.Average(col)
dat = col.Formula
For i = 1 To UBound(dat, 1)
If Len(dat(i, 1)) = 0 Then
dat(i, 1) = a
End If
Next
col.Formula = dat
Next
End Sub
答案 1 :(得分:0)
说,传递的范围是abc
notBlanks = abc.Rows.Count - WorksheetFunction.CountBlank(abc.Columns(i))
avg = WorksheetFunction.Sum(abc.Columns(i)) / notBlanks
答案 2 :(得分:0)
您可以使用公式按照您的要求单独处理空单元格 (注意 - 此方法假设单元格确实为空,即不包含评估为“”等的公式。
此代码平均A1:A10000中的所有非空白数字单元格,然后填充A1:A10000中的空白。那么B1:B10000等等
Sub FillBlanks()
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Range("A1:D10000")
On Error Resume Next
For Each rng2 In rng1.Columns
rng2.SpecialCells(xlCellTypeBlanks).Value = Application.WorksheetFunction.Average(rng2.Columns(1))
Next
End Sub