VBA 中的错误处理

VBA 中的错误处理

我正在根据第 16 列中的值在 VBA 中创建 2 个数组。但是,列中的某些值是错误值 (#N/A)。我想根据某些条件检查列的值。如果有错误,我希望循环移动到下一次迭代,并且 i 的值增加。

我尝试通过编写以下代码来实现这一点。问题是它正在处理列的第一个错误值,但在任何后续错误值上都卡住了。例如,如果第一个错误值出现在行号 50 上,第二个错误值出现在行号 60 上,则程序无法处理该错误,并会在行号 60 处停止。

我对 VBA 编码甚至编码都还很陌生。我认为这个问题源于 VBA 处理错误和存储错误的方式。我试图在网上寻找一些线索,但找不到。如果您能提供问题的解释以澄清概念并提供代码建议,我将不胜感激。

On Error GoTo caller:
for i = 1 To Worksheets("Sheet1").UsedRange.Rows.Count
If Cells(i, 16).Value = "SP" Then
   arr1(j) = Cells(i, 12).Value
   arr2(j) = Cells(i + 1, 12).Value
   j = j + 1
   ReDim Preserve arr1(j)
   ReDim Preserve arr2(j)
End If
caller:
Next

答案1

我不知道为什么只在第二个错误值上失败。不过,我创建了一个示例表并遇到了同样的问题,所以这不仅仅是你的设置。这里有一个替代方案,它只跳过导致错误的行。我已经在同一个示例表上测试过了,它可以正常工作。

Dim isSP As Boolean
For i = 1 To Worksheets("Sheet1").UsedRange.Rows.Count
    isSP = False
    On Error Resume Next
        isSP = (Cells(i, 16).Value = "SP")
    On Error GoTo 0
    If isSP Then
       arr1(j) = Cells(i, 12).Value
       arr2(j) = Cells(i + 1, 12).Value
       j = j + 1
       ReDim Preserve arr1(j)
       ReDim Preserve arr2(j)
    End If
Next

答案2

在尝试新方法的过程中,我自己偶然发现了一种有效的方法。

On Error GoTo caller:
for i = 1 To Worksheets("Sheet1").UsedRange.Rows.Count
If Cells(i, 16).Value = "SP" Then
arr1(j) = Cells(i, 12).Value
arr2(j) = Cells(i + 1, 12).Value
j = j + 1
ReDim Preserve arr1(j)
ReDim Preserve arr2(j)
End If
res1:
Next
exit sub

caller:
resume res1

end sub

答案3

我建议更多类似以下内容:

Dim objCell As Range, intX as Integer, arr1() as Variant, arr2() as Variant
Redim arr1(0):Redim arr2(0)

For Each objCell In Intersect( _
    Worksheets("Sheet1").UsedRange, _
    Worksheets("Sheet1").Columns(16).Cells)

    If Not(WorksheetFunction.IsNA(objCell.Value)) Then

    ' your process
    If objCell.Value="SP" then
        intX=UBound(arr1)
        If intX = 0 then
            if arr1(intX)=0 then intX=-1
        End If
        intX=intX+1
        Redim Preserve arr1(intX)
        Redim Preserve arr2(intX)
        arr1(intX)=objCell.Value
        arr2(intX)=objCell.Offset(0,-4).Value
    End If


    End If
Next objCell

相关内容