尝试使用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