Excel宏用平均值替换丢失的数据

时间:2012-04-15 22:02:29

标签: excel vba average

我有一系列数据,来自类型范围变量中保存的vba提示。我试图通过这个范围,并为每个空单元格,用它的平均值列替换它。

我可以很好地替换空单元格,但它可以获得我正在使用的每个列的平均值。有一个简单的方法吗?

我不想为每一列做一个循环,每一行循环,然后使用total / numberOfNonEmptyCells计算它,因为这需要相当长的时间(而且我显然在这里做错了,因为我&# 39;得到错误的价值)...但我确定它不是唯一或正确的方法。

有什么方法可以说:

  

对于每个列
  从范围中获取第i列   获取该列的平均值   把它放在一个数组中。

然后有一个循环用这个值替换空单元格?

或者,或者更好的方法是将公式放入空单元格中 = AVERAGE(Column from Range)
我使用AVERAGE(Range.Columns,1)尝试了这个并且它没有用,因为它类型为Column我相信哪个平均值不会合作。

最简单的方法我将标记为答案。它需要使用一个宏,而不是仅仅手动放入公式,因为它适用于大量纸张上的大量数据。

感谢。

3 个答案:

答案 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