Excel VBA出现错误,无法正常工作
我使用On Error GoTo捕捉函数Linterp中的错误,该函数包含一个单元格和两个范围。有时,Linterp会抛出一个错误,在这种情况下,我只想将单元格设置为5。但是,在其他情况下,当Linterp没有抛出错误并正确返回预期的数字(例如3.25或类似的数字)时,函数仍会转到“案例1”,并将单元格设置回5 此外,尽管我在错误转到后插入了一个Exit Sub,但我认为在我的特定情况下我不能这样做,因为我希望函数在每个单元格中不断迭代,即使其中一个单元格在第一次尝试时正确执行了LinterpExcel 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
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
继续与发生错误的行相同,例如,如果您计划更改某些值,直到不再出现错误。