2017-01-06 78 views
-1

如何从VBA中的Errorhandler返回for循环?从VBA中的errorhandler返回for循环

for x = 1 to 1000 
    On error goto errorhandler 
    Sheets("Sheet1").Cells(x, "B") = x * Sheets("Sheet1").Cells(x, "A").Value 
continue: 
Next 

Exit sub 

Errorhandler: 
    Sheets("Sheet1").Cells(x,"B") = "Error occured" 
    Resume continue 

这是行不通的。我希望如果在for循环中发生错误,它会在单元格中写入“Error occured”,然后继续循环。怎么做?

+0

你是什么意思“这不起作用”?当我在Excel 2010中测试时,它肯定会达到您期望的效果。 –

+0

这真的不难在Google上找到! – CallumDA

+0

对不起,我在for循环中键入了错误的数字,但现在它工作。谢谢你的回答! – Coldcode

回答

2
On Error GoTo Errorhandler 'put once, outside loop 
    For x = 1 To 1000 
    'use value2 if you dont work with date/time 
     Sheets("Sheet1").Cells(x, "B").Value2 = x * Sheets("Sheet1").Cells(x, "A").Value2 
    Next 

    Exit Sub 

Errorhandler: 
    Sheets("Sheet1").Cells(x, "B").Value2 = "Error occured" 
    Resume Next '<< Answer to original question. The Resume to continue label should also work 
1

你的代码的工作,当我测试它,所以我不知道你遇到什么具体的问题,但是你可以考虑重构代码,避免GoTo报表,这将提高其可读性:

Sub foo() 
Dim x As Long 
Dim val 

For x = 1 To 1000 
    On Error Resume Next 
    val = x * Sheets("Sheet1").Cells(x, "A").Value 
    If Err.Number <> 0 Then 
     Sheets("Sheet1").Cells(x, "B") = "Error occured" 
    Else: 
     Sheets("Sheet1").Cells(x, "B") = val 
    End If 
    On Error GoTo 0 
Next 


End Sub 
+0

我想在选择一个内联错误处理程序(这里显示)和一个独立于正常代码的执行之间的文体选择,对我而言,这是基于我期望出现错误的频率。如果我经常遇到错误,我会使用联机。如果我几乎从不发生错误,我会使用一个单独的块。 – CodeJockey

+1

@CodeJockey当然,我确实使用了两种类型的处理,但作为一般规则,我认为任何可以避免代码意大利面的方法都是可取的,有时这甚至意味着要为此操作创建子例程/函数,以便错误发生并完全在被调用的过程中处理。 –