VBA 2016中的错误处理程序

时间:2016-01-07 19:34:21

标签: excel vba error-handling

我已阅读VBA中的多个Q& As错误处理但由于某种原因我的代码不起作用。我试图过滤特定的单词(变量名称“item”),如果过滤的范围没有单词,它必须跳过代码并跳转到错误处理程序(并转到下一个单词)。这必须持续到for完成。我的代码如下:

Sub Group_Button1_Click()

    Worksheets("Grouping_Name").Select
    Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    lastrow_grouping = Selection.Count + 1


Dim filterRange As Range
Dim copyRange As Range
Dim lastrow_To_be_grouped As Long

For grouping_counter = 2 To lastrow_grouping

'   on to_be_grouped sheet turn off any autofilters that are already set Sheets("To_be_grouped").AutoFilterMode = False
'   find the last row with data in column A of To_be_grouped sheet
lastrow_To_be_grouped = Sheets("To_be_grouped").Range("A" & Sheets("To_be_grouped").Rows.Count).End(xlUp).Row
'   the range that we are auto-filtering (all columns)
Set filterRange = Sheets("To_be_grouped").Range("A1:B" & lastrow_To_be_grouped)
 '   Copy filtered data (exclude header) in To_be_grouped sheet
Set copyRange = Sheets("To_be_grouped").Range("A2:B" & lastrow_To_be_grouped)

 '   Assign variable "item" which is the word to filter
Item = Sheets("Grouping_Name").Range("A" & grouping_counter).Value
 '   Filter column with variable item
filterRange.AutoFilter field:=2, Criteria1:="=*" & Item & "*", Operator:=xlAnd

 '   copy the visible cells to Final_Grouping sheet
 '   determine first row with no data in Final Grouping sheet and copy to sheet
On Error GoTo errorhandler
' This is where I need help, if there is no line with the filtered word the code must jump to errorhandler
If IsNumeric(copyRange.SpecialCells(xlCellTypeVisible).Count) = True Then
copyRange.SpecialCells(xlCellTypeVisible).Copy Sheets("Final_Grouping").Range("A" & item_counter_total)
'   delete the tables
Sheets("To_be_grouped").Range("$A$1:$B$" & lastrow_To_be_grouped).Offset(1, 0).SpecialCells _
(xlCellTypeVisible).EntireRow.Delete

' Count the number of rows added
item_counter = copyRange.SpecialCells(xlCellTypeVisible).Count / 2
'  ------------------------------------------

For group_table_counter = item_counter_total To item_counter_total + item_counter - 1 Step 1
   Sheets("Final_Grouping").Range("C" & group_table_counter).Value = Item
Next group_table_counter
 '  ------------------------------------------
item_counter_total = item_counter_total + item_counter
End If
errorhandler:
Next grouping_counter
End Sub

非常感谢任何帮助。谢谢

1 个答案:

答案 0 :(得分:0)

我无法确定您的代码正在做什么或者您要捕获的错误是什么,但您遇到的一个问题是您不能在错误处理程序中放置“Next grouping_counter”。

我认为您的误解是基于以下事实:如果您输入“On Error GoTo ErrorHandler”语句,ErrorHandler中的代码将在出错时运行。

但是当编译代码时,VBA正在尝试确定代码是否有意义,并且正在为您提供错误,即您的下一个语句没有For循环,因为,如果错误发生在您希望的位置to,你将在for循环中,程序不知道这一点。

正如评论中提到的sous2817,你可能不需要在这里进行错误处理,但是我将介绍这两种方法,以便你们更好地理解如何进行错误处理。

在这种情况下,您可以通过两种方式使用ErrorHandling,假设代码中出现错误:

1

For grouping_counter = 2 To lastrow_grouping
    'some code here

    On Error GoTo ErrorHandler
    'code that has error you are trying to handle
    'more code to run
NextGroupingCounter:  'label to jump to from error handler

Next grouping_counter


Exit Sub

ErrorHandler:

     GoTo NextGroupingCounter

End Sub

当然,如果你实际上不想对错误做任何事情,除了跳过剩下的代码。如果这是您想要的,那么只需将On Error Code更改为GoTo NextGroupingCOunter标签!

2

For grouping_counter = 2 To lastrow_grouping
    'some code here

    On Error GoTo NextGroupingCounter
    'code that has error you are trying to handle
    'more code to run
NextGroupingCounter:  'label to jump to from error handler

Next grouping_counter

当然,您甚至可能不需要错误处理

3

For grouping_counter = 2 To lastrow_grouping
    'some code here
    If [*insert text to check condition needed for no error*] Then
             'code to run if no error
    End If
    'If the condition needed for no error is false, this will just go to the next one.
Next grouping_counter

如果可能,首选备选方案3。如果您的代码中实际发生错误,则选项2将正常工作。如果您想捕获错误然后跳回到循环中,则选项3可以正常工作。

另外,请注意我将“Exit Sub”放在ErrorHandler上方。 ErrorHandler标签只是一个标签,因此如果程序运行到结束,它将运行ErrorHandler部分中的代码。 Exit Sub结束程序以避免这种情况。

另请注意,对于其他情况,您可以使用“On Error Resume Next”继续发生错误,或者甚至在错误处理程序中放入“Resume Next”以返回错误之后的行。这有点超出了问题的范围,但可能会添加一些有用的信息。