我在做什么。通过使用宏我可以在工作表中添加一行。该宏旨在覆盖最后一行中的值,并通过使用循环删除值" _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路线更好吗?
如果有任何问题,请告诉我。
此致 西蒙
答案 0 :(得分:1)
您的问题是.Value
属性返回Variant。如果您的单元格包含评估为错误的公式,则该变体将为XlCVError
常量(https://msdn.microsoft.com/en-us/library/bb211091(v=office.12).aspx)。
有多种方法可以解决您的问题。最明显的三个:
如果您只是想跳过包含Formula
的任何单元格,从而无需检查公式错误,那么您的循环可能是:
For Each c In Sheet1.UsedRange
If Not c.HasFormula Then
If c.Value2 = "_DNU" Then c.Value = Empty
End If
Next
如果要跳过公式计算错误(任何错误)的任何单元格,那么您的代码就是这样:
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
您可以识别.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