Excel VBA:如果在范围内找不到值,请转到
Posted
技术标签:
【中文标题】Excel VBA:如果在范围内找不到值,请转到【英文标题】:Excel VBA: If value not found in range, go to 【发布时间】:2017-03-01 13:44:37 【问题描述】:我正在使用以下代码循环遍历工作表 1-31,按工作表(“RunFilter_2”)中单元格(“E1”)中的值过滤每个工作表,然后复制过滤后的范围并复制到下一个空行在工作表中(“RunFilter_2”)。
当在活动工作表的第 18 列中找不到 sheet("RunFilter_2").Range("E1") 的值时,代码会出错。
所以我添加了一个范围检查,检查是否在列 Range("R:R") 中找到 sheet("RunFilter_2").Range("E1").Value。
但是,如果 rngFound Is Nothing,我该如何转到 Next I?
Sub RunFilter2()
Rows("5:5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp
Range("A1").Select
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = wb.sheets("01")
Dim WS_Count As Integer
Dim I As Integer
WS_Count = ActiveWorkbook.Worksheets.Count - 3
For I = 1 To WS_Count
Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Rows.Count
sheets(I).Select
Columns("A:U").Select
Dim rng As Range
Dim rngFound As Range
Set rng = Range("R:R")
Set rngFound = rng.Find(sheets("RunFilter_2").Range("E1").Value)
If rngFound Is Nothing Then
'----------------------------------
' How do I code ... GO TO Next I
'----------------------------------
Else:
Selection.AutoFilter
ActiveSheet.Range("$A$1:$U" & LastRow).AutoFilter Field:=18, Criteria1:=sheets("RunFilter_2").Range("E1").Value
Range("A1").Offset(1, 0).Select
Rows(ActiveCell.Row).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
sheets("RunFilter_2").Select
If Range("A4").Value = "" Then
Range("A4").Select
Else
Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
End If
ActiveSheet.Paste
ws.Select
Application.CutCopyMode = False
Selection.AutoFilter
Range("A1").Select
sheets("RunFilter_2").Select
Next I
End Sub
【问题讨论】:
【参考方案1】:你可以这样做:
For I = 1 To WS_Count
If rngFound Is Nothing Then goto NextIPlace
your code
NextIPlace:
Next I
但是你应该重新考虑这样写,使用GoTo
不是一个好的VBA实践。应该更改整个代码。 Check more here。一旦您的代码有效,请随时通过https://codereview.stackexchange.com/ 提交,他们会给您很好的想法。
【讨论】:
您好 Vityata,我同意通常使用Goto
语句不是一个好的编程习惯,但在这种特定情况下不是。其他语言通常具有中断或继续循环的语句(即 C 系列中的 continue
)。没有此选项的 VBA 有时会很乏味,使用此解决方法可能会使代码更具可读性。只是我的拙见:)
@A.S.H,我使用GoTo
的频率超出了我的预期。是的,VBA 需要一种打破循环的方法。【参考方案2】:
这里不需要使用GoTo
。实现这一点的简单方法如下:
For I = 1 To WS_Count
' do stuff
If Not rngFound is Nothing
'execute desired action
End If
' do more stuff
Next i
如果需要,您还可以将do more stuff
放在第一个 if 块中。您帖子中的代码有点乱,我没有花时间完全剖析。
【讨论】:
我正要谈论 GoTo 的意大利面条程序!我正打算做同样的建议,但我会添加一个布尔值以避免doing more stuff
关于 OP 的结构! ;)
你也可以将其编码为 rngfound IsNot Nothing,这可能会或可能不会更清楚一点......【参考方案3】:
在Next I
之前放置一些标签:
NextI:
Next I
那么你可以这样做:
If rngFound Is Nothing Then
Goto NextI
Else
....
或者,您可以在不需要 else 语句的情况下简化它
If rngFound Is Nothing Then Goto NextI
.... ' Proceed without the need for `Else` and `End If`
编辑.. 更多
虽然使用Goto
语句通常被认为是不好的编程习惯,但在这种特定情况下并非如此。它只是作为 C 和派生语言中缺少 continue
语句的一种解决方法。
【讨论】:
【参考方案4】:你应该在Next I
之前添加一个标记
MARKER:
Next I
所以在If rngFound Is Nothing Then
之后添加GoTo MARKER
【讨论】:
以上是关于Excel VBA:如果在范围内找不到值,请转到的主要内容,如果未能解决你的问题,请参考以下文章