我正在根据第 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