【问题标题】:Excel macro to replace missing data with averageExcel宏用平均值替换缺失数据
【发布时间】:2012-04-15 22:02:29
【问题描述】:

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

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

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

有没有什么说法:

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

然后循环使用该值替换空单元格?

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

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

谢谢。

【问题讨论】:

  • avg = Application.WorksheetFunction.Average(Range.Columns(1))
  • @TimWilliams 正如我之前所说,你确实剥夺了自己应得的答案
  • 谢谢蒂姆,我会试一试

标签: excel vba average


【解决方案1】:

这将选择一个范围,每列,用非空白单元格的平均值填充空白单元格。

它通过最大限度地减少对循环中单元格的访问来解决您的速度问题(在大约 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

【讨论】:

  • 谢谢,由于某种原因,当我在做 Application.WorkSheetFunction.Average 时它不起作用,但这是。我会弄清楚为什么会这样,但与此同时这是完美的!
【解决方案2】:

说,传递的范围是abc

notBlanks = abc.Rows.Count - WorksheetFunction.CountBlank(abc.Columns(i))
avg = WorksheetFunction.Sum(abc.Columns(i)) / notBlanks

【讨论】:

    【解决方案3】:

    您可以按照您的要求使用公式仅对空单元格进行操作
    (注意 - 此方法假定单元格是真正的空单元格,即不包含计算结果为“”等的公式)。

    此代码平均 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
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2012-05-03
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多