2017-03-01 178 views
2

我正在使用以下代码循环遍历表1-31,并通过表单(“RunFilter_2”)中的单元格(“E1”)中的值筛选每个工作表和然后复制过滤的范围并复制到工作表中的下一个空行(“RunFilter_2”)。Excel VBA:如果在范围中找不到值,请转至

代码错误,当它找不到工作表(“RunFilter_2”)的值。范围(“E1”)在活动工作表的第18列。因此,我添加了一个范围检查,检查是否在列Range(“R:R”)中找到工作表(“RunFilter_2”)。Range(“E1”)。Value。

但是,如何移动到下一个我如果rng找不到任何东西?

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 

回答

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语句的解决方法。

2

你应该添加添加GoTo MARKER

+0

谢谢所有...使用标记完美的作品! – SMORF

5

Next I

MARKER: 
Next I 
If rngFound Is Nothing Then

所以标记你可以这样说:

For I = 1 To WS_Count 
    If rngFound Is Nothing Then goto NextIPlace 
    your code 
NextIPlace: 
Next I 

但是,你应该重新考虑写作像这样,它不是一个好的VBA练习使用GoTo。整个代码应该改变。 Check more here。一旦你的代码工作,随时提交https://codereview.stackexchange.com/,他们会给你很好的想法。

+1

嗨Vityata,我同意一般情况下'Goto'语句的使用不是一个好的编程习惯,但不是在这个特定的情况下。其他语言通常有声明来打破或继续循环(即C系列中的“继续”)。 VBA没有这个选项有时很繁琐,而使用这种解决方法可能会使代码更具可读性。只是我谦逊的意见:) –

+1

@ A.S.H,我比我会同意使用'GoTo'更频繁。是的,VBA需要一种方法来打破循环。 – Vityata

3

这里没有必要使用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。您帖子中的代码有点混乱,我没有花时间去完整剖析。

+1

我正要与GoTo谈论意大利面条程序!我正要做同样的建议,但是我会添加一个布尔值来避免在OP的结构上做更多的事情! ;) – R3uK