尝试使用Err.Clear使用On Error GoTo <label>

我在excel的几个实例上使用循环。 我正在使用几台PC和实例来查看我的数据,因此每个实例都会抓取下一个可用的文件。 如果多个实例打开相同的文件(csv格式),VBA将会出错。 我想error handling标签只是去循环中的下一个文件。 不过,我只能得到这个error handling一次。 第二次它不处理错误。 如果代码的另一部分导致error handling失败,我将完整的代码留在下面。

Sub RunRoutine() CloseOtherWorkbook Application.StatusBar = False manualcalc Calculate ListAllFile Calculate Sheets("RUN").Select Set wBRun = ActiveWorkbook Workbooks.Open Filename:=Range("FO_CalcName_Range").Value, ReadOnly:=True Set wBCalc = ActiveWorkbook wBRun.Activate For Each C In ActiveSheet.Range("FILE_RANGE_RUN").Cells Err.Clear On Error GoTo Error_handler: wBRun.Activate Sheets("RUN").Select C.Select ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Activate If ActiveCell.Value = False Then Application.ScreenUpdating = True Application.StatusBar = False Application.StatusBar = "Run Routine" & " - " & C Application.ScreenUpdating = False Range("Date_Range").Value = C ActiveSheet.Calculate FO_RawName = Range("FO_RawName_Range").Value Workbooks.Open FO_RawName, ReadOnly:=True 'this is where the code fails Set wBRaw = ActiveWorkbook wBRaw.Activate Columns("A:dn").Select Selection.Copy wBCalc.Activate Sheets("CALC").Select Columns("A:dn").Select ActiveSheet.Paste Application.CutCopyMode = False ResizeRows wBRaw.Activate Application.CutCopyMode = False ActiveWorkbook.Close False wBRun.Activate RunallSheets Else 'do nothing End If Error_handler: Next Application.ScreenUpdating = True wBCalc.Activate ActiveWorkbook.Close False Application.StatusBar = False Application.ScreenUpdating = True wBRun.Activate manualcalc ThisWorkbook.Save Application.OnTime Now + TimeValue("00:10:00"), "RunRoutine" 

结束小组

可能要避免GOTO,即使在处理错误时也是如此

最好的做法是有意识地处理错误,即抓住他们,当你期待他们,并妥善处理

这意味着在debugging代码时,必须保持代码的可用性

例如捕捉可能的工作簿打开exception,您可能需要:

  • 有一个特定的function打开工作簿并返回:

    • 如果成功则返回True ,同时打开工作簿的对象引用

    • 假如不是的话

    比如说

     Function OpenWorkbook(wbName As String, wb As Workbook) As Boolean On Error Resume Next Set wb = Workbooks.Open(wbName, ReadOnly:=True) OpenWorkbook = Not wb Is Nothing End Function 
  • 像下面这样使用它

      ... your code ActiveSheet.Calculate If OpenWorkbook(Range("FO_RawName_Range").Value, wBRaw) Then Columns("A:dn").Select '<--| this will select columns "A:DN" in wBRaw active sheet Selection.Copy wBCalc.Activate Sheets("CALC").Select Columns("A:dn").Select ActiveSheet.Paste Application.CutCopyMode = False ResizeRows wBRaw.Activate Application.CutCopyMode = False ActiveWorkbook.Close False wBRun.Activate RunallSheets End If 

最后,您也可能希望避免Activate / Active... / Select / Selection并使用完全限定的范围参考来提高代码性能(在工作簿/工作表之间切换非常耗时),而不是放松对范围的控制

这不是使用On Error Goto的正确方法。

你必须像这样使用它:

 Sub test() On Error GoTo Error_handler 'your code NextItem: Next Application.ScreenUpdating = True wBCalc.Activate ActiveWorkbook.Close False Application.StatusBar = False Application.ScreenUpdating = True wBRun.Activate manualcalc ThisWorkbook.Save Application.OnTime Now + TimeValue("00:10:00"), "RunRoutine" Exit Sub Error_handler: Resume NextItem End Sub 

处理多个错误的最终代码:

 Sub RunRoutine() CloseOtherWorkbook Application.StatusBar = False manualcalc Calculate ListAllFile Calculate Sheets("RUN").Select Set wBRun = ActiveWorkbook Workbooks.Open Filename:=Range("FO_CalcName_Range").Value, ReadOnly:=True Set wBCalc = ActiveWorkbook wBRun.Activate For Each C In ActiveSheet.Range("FILE_RANGE_RUN").Cells On Error GoTo Error_handler: wBRun.Activate Sheets("RUN").Select C.Select ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Activate If ActiveCell.Value = False Then Application.ScreenUpdating = True Application.StatusBar = False Application.StatusBar = "Run Routine" & " - " & C Application.ScreenUpdating = False Range("Date_Range").Value = C ActiveSheet.Calculate FO_RawName = Range("FO_RawName_Range").Value Workbooks.Open FO_RawName, ReadOnly:=True Set wBRaw = ActiveWorkbook wBRaw.Activate Columns("A:dn").Select Selection.Copy wBCalc.Activate Sheets("CALC").Select Columns("A:dn").Select ActiveSheet.Paste Application.CutCopyMode = False ResizeRows wBRaw.Activate Application.CutCopyMode = False ActiveWorkbook.Close False wBRun.Activate RunallSheets Else 'do nothing End If LabelA: Next Application.ScreenUpdating = True wBCalc.Activate ActiveWorkbook.Close False Application.StatusBar = False Application.ScreenUpdating = True wBRun.Activate manualcalc ThisWorkbook.Save Application.OnTime Now + TimeValue("00:10:00"), "RunRoutine" Exit Sub Error_handler: Resume LabelA: End Sub