2017-03-01 176 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