1

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

我可以很好地替换空单元格,但它得到了我正在努力的每一列的平均值。有没有简单的方法?

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

有没有什么说法:

For Each Column
Get column i from the range
获取该列的平均值。
把它放在一个数组中。

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

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

最简单的方法我将标记为答案。它需要使用宏,而不仅仅是手动输入公式,因为它适用于很多工作表上的大量数据。

谢谢。

4

3 回答 3

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
于 2012-04-16T00:27:22.110 回答
0

说,传递的范围是 abc

notBlanks = abc.Rows.Count - WorksheetFunction.CountBlank(abc.Columns(i))
avg = WorksheetFunction.Sum(abc.Columns(i)) / notBlanks
于 2012-04-16T08:19:41.193 回答
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
于 2012-04-16T10:28:51.860 回答