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

我在做什么。 通过使用macros,我可以添加一行到表。 该macros被devise为覆盖最后一行中的值,并通过使用循环删除值“_DNU”。 在工作表的最后添加一个新行,并且(通过循环)空单元格将填充“_DNU”。

我使用循环通过删除强制来减lessmacros的pipe理
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))) ),在这个公式之后的“_DNU”,我的循环停在#value!(错误2015)。

我想做什么 以简单而有效的方式使用VBAerror handling(On Error,IsError等)。 error handling应检测到范围内有错误,并应通过跳过受影响的单元来恢复循环。

我到目前为止所尝试的,我已经玩过“On Error”和“IsError”。 在错误教我使用“goto”,这是有用的error handling。 我相信一个解决scheme是可能的,但是需要一些时间来构build。 IsError有点困难。 我不知道在循环中如何实现它,以便跳过受影响的单元格并继续循环。

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

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

问候,西蒙

你的问题是.Value属性返回一个Variant。 如果您的单元格包含评估为错误的公式,则variables将是XlCVError常量( https://msdn.microsoft.com/zh-cn/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 

    顺便说一下,你可以testing你的具体错误是这样的:

     If IsError(c.Value2) Then If c.Value2 = CVErr(xlErrValue) Then ... End If 
  3. 您可以识别.Value的变体types,并跳过不是String单元格:

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