【问题标题】:Replace cells containing "#VALUE!" with average value of surrounding cells替换包含“#VALUE!”的单元格与周围细胞的平均值
【发布时间】:2015-03-10 13:47:17
【问题描述】:

我有一些数据列,其中一些单元格包含#VALUE!。当然很烦人,所以我想编写一个宏,将每个工作表中的这些#VALUE! 单元格替换为上下两个单元格的平均值。

例如。

    A               A
1   1               1
2   2               2
3  #VALUE!    ->    3
4   4               4
5   5               5

我尝试关注 this postthis post 并拥有以下代码,但作为初学者,我显然缺少一些东西,因为我收到“运行时错误 '13'”。

Sub Test()

Dim wks As Worksheet

For Each wks In ThisWorkbook.Worksheets

    With wks
        Dim Qty As Range

        For Each Qty In Range("A:ZZ").Cells

            If InStr(1, (Qty.Value), "#VALUE!") Then
            ActiveCell.FormulaR1C1 = "=AVERAGE(R[-2]C:R[-1]C,R[1]C:R[2]C)"
            Range("A:ZZ").Select

            End If
        Next
    End With
Next
End Sub

非常感谢任何帮助。

【问题讨论】:

  • #Value! 通常表示单元格中的公式错误。这些值是作为“VALUES”复制并粘贴到此列中还是单元格A3中有公式?
  • @xQbert - 啊,这对公式错误很有意义,谢谢。这些值被复制/粘贴为“VALUES”。

标签: excel vba


【解决方案1】:

考虑:

If InStr(1, (Qty.Text), "#VALUE!") Then

并且由于 Qty 是一个 Range,因此不要使用 ActiveCell; 代替:

Qty.FormulaR1C1 = "=AVERAGE(R[-2]C:R[-1]C,R[1]C:R[2]C)"

编辑#2:

这是一些工作代码:

Sub Test()
    Dim wks As Worksheet, Qty As Range

    For Each wks In ThisWorkbook.Worksheets
        With wks
            For Each Qty In Intersect(.UsedRange, .Range("A:ZZ").Cells)
                If InStr(1, (Qty.Text), "#VALUE!") Then
                    Qty.FormulaR1C1 = "=AVERAGE(R[-2]C:R[-1]C,R[1]C:R[2]C)"
                End If
            Next
        End With
    Next wks
End Sub

【讨论】:

  • 谢谢,我相信这已经解决了宏正在运行的问题。做一些测试然后会报告回来。
  • 宏已运行但未进行任何更改,单元格仍包含“#VALUE!”。
  • 我会删除字符串比较并直接检查该值是否为单元格错误。 If IsError(Qty.Value),然后可以通过 If Qty.Value = CVErr(xlErrValue 跟进,以便在必要时专门针对 #VALUE! 进行测试。请注意,如果由于某种原因单元格包含文本 #VALUE! is my favorite error! :-),字符串比较将失败
  • 非常感谢您的工作代码,这比我拥有的更好更整洁!
  • @Jean-FrançoisCorbett - 这是一个绝妙的提示,谢谢。我会尝试整合它,看看效果如何!
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多