Excel 错误时显示单元格地址和消息框并退出宏,如果没有,则继续

Excel 错误时显示单元格地址和消息框并退出宏,如果没有,则继续,excel,vba,Excel,Vba,在退出宏之前,我想先检查我的范围中是否有#NA错误,然后显示包含错误的单元格地址。这就是我到目前为止所做的 现在,如果存在错误,我希望显示一个MsgBox警告用户错误,并停止程序的其余部分执行,如果没有错误,我希望它继续执行程序的其余部分 检查NA错误: For Each c In myRange If IsError(c) = True Then Debug.Print c.Address End If Next c MsgBox "Check for

在退出宏之前,我想先检查我的范围中是否有#NA错误,然后显示包含错误的单元格地址。这就是我到目前为止所做的

现在,如果存在错误,我希望显示一个
MsgBox
警告用户错误,并停止程序的其余部分执行,如果没有错误,我希望它继续执行程序的其余部分

检查NA错误:

For Each c In myRange

    If IsError(c) = True Then

        Debug.Print c.Address

    End If

Next c

MsgBox "Check for errors and run gain"

Exit Sub

'continuation of the program

我认为这会起作用:

Dim errorArray()
Dim i As Integer
Dim checkArray As Integer
Dim errorString As String

For Each c In myRange
    If IsError(c) = True Then
        ReDim Preserve errorArray(i)
        errorArray(i) = c.Address
        i = i + 1
    End If
Next c

On Error Resume Next
checkArray = UBound(errorArray)

If Err = 0 Then
    errorString = "An error(s) occured in following cell(s):" & Chr(10)
    For i = 0 To UBound(errorArray)
        errorString = errorString & errorArray(i) & Chr(10)
    Next

    MsgBox errorString

    Exit Sub

End If

Err.Clear
On Error GoTo 0

这将把错误的所有地址写在一个字符串中,并在代码运行后显示它们:

Sub TestMe()

    Dim myRange As Range
    Dim myCell As Range
    Dim errorList As String

    Set myRange = Worksheets(1).Range("A1:C10")

    For Each myCell In myRange
        If IsError(myCell) Then
            errorList = errorList & vbCrLf & myCell.Address
        End If
    Next

    If Len(errorList) > 0 Then
        MsgBox errorList
        Exit Sub
    End If

End Sub
循环后,检查
1Len(errorList)
,如果大于0,则显示
MsgBox
,并退出sub


根据我的评论,您也可以尝试使用
特殊单元格来避免任何迭代:

Sub test()

Dim rng As Range

With Sheet1 'Change according to your sheets CodeName

    'Setup your range to check for errors
    Set rng = .Range("A1:C4")

    'Check if any errors exist and act if they do
    If .Evaluate("SUM(IF(ISERROR(" & rng.Address & "),1))") > 0 Then
        MsgBox "Still errors in " & rng.SpecialCells(-4123, 16).Address(False, False)
        Exit Sub
    End If

End With

End Sub

如果您的单元格不是公式的结果,而是常量,请将
SpecialCells(-4123,16)
更改为
SpecialCells(2,16)

您不能在
调试后放入
MsgBox
并退出Sub
。在
中打印
如果
有条件?@Teamothy确定,如果可能的话,我还想显示包含错误的单元格列表:)使用特殊单元格而不是完整的循环检查数组是否初始化并获得错误,如果没有,被错误恢复下一步时的
捕获确实不是好代码。为了避免这种情况,请考虑<代码>如果没有Error数组,然后调试。打印“数组中没有元素”…<代码>。作为奖励,您的代码中根本不需要
On Error Resume Next
,您可以随意扔掉一些无用的行。对于这种检查数组是否为空的方法,我将给出一个巨大的
谢谢:)
,但它不能正常工作:(在vba工作的5年中,我找不到更好的解决方案来进行此检查,因为无法引发并捕获异常…享受-您可能只使用了一个
Not
。代码中有
Not Not
@neutronhammer-竖起大拇指:)