我已阅读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
非常感谢任何帮助。谢谢
答案 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”以返回错误之后的行。这有点超出了问题的范围,但可能会添加一些有用的信息。