检测范围内的错误(#Value!),跳过受影响的单元格并恢复循环

时间:2017-05-15 10:14:16

标签: excel vba excel-vba loops

我在做什么。通过使用宏我可以在工作表中添加一行。该宏旨在覆盖最后一行中的值,并通过使用循环删除值" _DNU"。在工作表的末尾添加一个新行,并且(通过使用循环)将使用" _DNU"填充空单元格。

我通过删除强制执行来使用循环来减少宏的管理 Cell(lastrow + X, X) = value

请参阅代码我如何尝试实现此目的:

If ActiveSheet.Name <> "Activities" Then
MsgBox "Wrong sheet, you are in: " & ActiveSheet.Name
Exit Sub

ElseIf wsActivities.Range("A4").Value = "1" Then

lastrow = wsActivities.Range("A" & Rows.Count).End(xlUp).Offset(-1, 0).Row

Cells(lastrow + 1, 2) = MyDate
Cells(lastrow + 1, 4) = DefType
Cells(lastrow + 1, 5) = DefStatusActivities
Cells(lastrow + 1, 6) = DefIssue
Cells(lastrow + 1, 11) = DefImpact
Cells(lastrow + 1, 12) = DefPrio

'**One of the loops in question**
Dim c As Range
         For Each c In Range(BlackRange).Cells
        If c.Value = "_DNU" Then c.Value = ""
    Next c

Range(CopyRowActivities).Copy
wsActivities.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteAll)
Application.CutCopyMode = False

Lastnumber = wsActivities.Range("A" & Rows.Count).End(xlUp).Value
wsActivities.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Lastnumber + 1
Cells(lastrow + 2, 2) = SheetEnd

Dim d As Range

    For Each d In Range(BlackRange).Offset(1, 0).Cells
        If d.Value = "" Then d.Value = "_DNU"
    Next d
ActiveCell.Offset(1, 0).Select

问题。我的工作表中有公式(例如=IF(ISBLANK(Y36);"-";(IF(B36="Stop";"-";((Y36-B36)/7)))),如果有&#34; _DNU&#34;在这个公式之后,我的循环停在#value上! (错误2015)。

我想做什么。以简单有效的方式使用VBA错误处理(On Error,IsError等)。错误处理应检测范围内是否存在错误,并应通过跳过受影响的单元来恢复循环。

到目前为止我尝试了什么 我玩过&#34; On Error&#34;和#34; IsError&#34;。 On Error通过使用&#34; goto&#34;告诉我一些关于错误处理的事情,这是有用的。我相信这个解决方案是可行的,但构建需要一些时间。 IsError有点困难。我不知道在循环中实现它的位置(以及如何),以便它跳过受影响的单元格并继续循环。

其他问题 当然,使用IsError调整我的公式也是一个合理的选择。所以我想知道,调整公式或采取VBA路线更好吗?

如果有任何问题,请告诉我。

此致 西蒙

1 个答案:

答案 0 :(得分:1)

您的问题是.Value属性返回Variant。如果您的单元格包含评估为错误的公式,则该变体将为XlCVError常量(https://msdn.microsoft.com/en-us/library/bb211091(v=office.12).aspx)。

有多种方法可以解决您的问题。最明显的三个:

  1. 如果您只是想跳过包含Formula的任何单元格,从而无需检查公式错误,那么您的循环可能是:

    For Each c In Sheet1.UsedRange
        If Not c.HasFormula Then
            If c.Value2 = "_DNU" Then c.Value = Empty
        End If
    Next
    
  2. 如果要跳过公式计算错误(任何错误)的任何单元格,那么您的代码就是这样:

    For Each c In Sheet1.UsedRange
        If Not IsError(c.Value2) Then
            If c.Value2 = "_DNU" Then c.Value = Empty
        End If
    Next
    

    顺便说一句,你可以测试你的具体错误:

    If IsError(c.Value2) Then
        If c.Value2 = CVErr(xlErrValue) Then ...
    End If
    
  3. 您可以识别.Value的变体类型,并跳过任何非String的单元格:

    For Each c In Sheet1.UsedRange
        If VarType(c.Value2) = vbString Then
            If c.Value2 = "_DNU" Then c.Value = Empty
        End If
    Next