Excel VBA出现错误,无法正常工作

Excel VBA出现错误,无法正常工作,excel,vba,error-handling,goto,Excel,Vba,Error Handling,Goto,我使用On Error GoTo捕捉函数Linterp中的错误,该函数包含一个单元格和两个范围。有时,Linterp会抛出一个错误,在这种情况下,我只想将单元格设置为5。但是,在其他情况下,当Linterp没有抛出错误并正确返回预期的数字(例如3.25或类似的数字)时,函数仍会转到“案例1”,并将单元格设置回5 此外,尽管我在错误转到后插入了一个Exit Sub,但我认为在我的特定情况下我不能这样做,因为我希望函数在每个单元格中不断迭代,即使其中一个单元格在第一次尝试时正确执行了Linterp

我使用On Error GoTo捕捉函数Linterp中的错误,该函数包含一个单元格和两个范围。有时,Linterp会抛出一个错误,在这种情况下,我只想将单元格设置为5。但是,在其他情况下,当Linterp没有抛出错误并正确返回预期的数字(例如3.25或类似的数字)时,函数仍会转到“案例1”,并将单元格设置回5

此外,尽管我在错误转到后插入了一个Exit Sub,但我认为在我的特定情况下我不能这样做,因为我希望函数在每个单元格中不断迭代,即使其中一个单元格在第一次尝试时正确执行了Linterp

Sub Linterp_Test_1()
    For Each cell In Selection
        Set cell_index = Cells(3, "I")
        Set cell_xs = Range(Cells(cell.Row, "K"), Cells(cell.Row, "O"))
        Set cell_ys = Range(Cells(cell.Row, "D"), Cells(cell.Row, "H"))
        
        On Error GoTo Case1
        cell.Value = Linterp(cell_index, cell_xs, cell_ys)
        Resume Next
        
Case1:
        cell.Value = 5
        Resume Next
        
    Next cell
End Sub
错误处理 对于你的情况,我更喜欢第一种解决方案

Option Explicit

Sub Linterp_Test_1()
    
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    On Error Resume Next
    
    For Each cell In Selection
        
        Set cell_index = Cells(3, "I")
        Set cell_xs = Range(Cells(cell.Row, "K"), Cells(cell.Row, "O"))
        Set cell_ys = Range(Cells(cell.Row, "D"), Cells(cell.Row, "H"))
        
        cell.Value = Linterp(cell_index, cell_xs, cell_ys)
        If Err.Number <> 0 Then
            cell.Value = 5
            Err.Clear
        End If
    
    Next cell
    
    On Error GoTo 0
    
End Sub


Sub Linterp_Test_2()
    
    If TypeName(Selection) <> "Range" Then Exit Sub

    For Each cell In Selection
        
        Set cell_index = Cells(3, "I")
        Set cell_xs = Range(Cells(cell.Row, "K"), Cells(cell.Row, "O"))
        Set cell_ys = Range(Cells(cell.Row, "D"), Cells(cell.Row, "H"))
        
        On Error Resume Next
        cell.Value = Linterp(cell_index, cell_xs, cell_ys)
        If Err.Number <> 0 Then cell.Value = 5
        On Error GoTo 0
    
    Next cell
    
End Sub
选项显式
子测试1()
如果TypeName(选择)“Range”,则退出Sub
出错时继续下一步
对于选择中的每个单元格
设置单元索引=单元(3,“I”)
设置cell_xs=范围(Cells(cell.Row,“K”)、Cells(cell.Row,“O”))
设置cell_ys=范围(Cells(cell.Row,“D”)、Cells(cell.Row,“H”))
cell.Value=Linterp(cell_索引、cell_xs、cell_ys)
如果错误号为0,则
单元格值=5
呃,明白了
如果结束
下一个细胞
错误转到0
端接头
子测试2()
如果TypeName(选择)“Range”,则退出Sub
对于选择中的每个单元格
设置单元索引=单元(3,“I”)
设置cell_xs=范围(Cells(cell.Row,“K”)、Cells(cell.Row,“O”))
设置cell_ys=范围(Cells(cell.Row,“D”)、Cells(cell.Row,“H”))
出错时继续下一步
cell.Value=Linterp(cell_索引、cell_xs、cell_ys)
如果错误号为0,则单元格值=5
错误转到0
下一个细胞
端接头

发生错误时,您需要清除错误。您可能还希望看到您不需要使用
转到案例1
。检查下一步错误恢复时的
如何与
一起使用
如果错误号为0,则在该帖子中使用
,如果您可以发布
Linterp
函数的代码就好了,因为使用范围不是很有效。我更喜欢第二个。第一种方法也会抑制其他不推荐的错误…@SiddharthRout:Thx。效率呢?实际上有区别吗?如果不是,那么你是绝对正确的。在这种情况下,我愿意牺牲效率,而不是忽略其他错误:)老实说,如果效率成为一个大问题,那么我将使用数组执行操作,然后一次写回工作表:)谢谢@vbasic208–选项1工作得很好。我很高兴你喜欢,但是小心点,悉达多知道他在说什么。我介绍了这两种解决方案,因为我最近才完全了解错误处理。缺失的部分是:1。为什么我需要
errr.Clear
On Error转到0
时安全地处理它?要在出错时保持
,请继续下一步
始终处于“活动”状态。(
On Error Goto 0
“如果关闭则关闭”。2.(与您的案例无关)关于
Resume
Resume Next
的秘密,其中
Resume
继续与发生错误的行相同,例如,如果您计划更改某些值,直到不再出现错误。