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:如果在范围内找不到值,请转到的主要内容,如果未能解决你的问题,请参考以下文章

我收到错误:在名称范围内找不到名称 - 在MVVMLight应用程序中从一个页面移动到另一个页面时

在范围内找不到“LocationsData”

在范围内找不到类型“配置”

将命名范围值分配给变量(Excel VBA) - 新手

在 SwiftUI 范围内找不到“实体”

在范围内找不到“ContentView”[关闭]