2017-03-01 41 views
2

次のコードを使用してシート1〜31をループ処理し、シート内のセル(「E1」)の値(「RunFilter_2」)フィルタリングされた範囲をコピーし、シート内の次の空の行( "RunFilter_2")にコピーします。Excel VBA:範囲内に値が見つからない場合

シートの値が見つからない場合のコードエラー( "RunFilter_2")。アクティブシートの列18の範囲( "E1")。

Range( "RunFilter_2")Range( "E1")。値が列Range( "R:R")にあるかどうかをチェックする範囲チェックを追加しました。

しかし、次の場合はどうすればいいですか?

For I = 1 To WS_Count 
    If rngFound Is Nothing Then goto NextIPlace 
    your code 
NextIPlace: 
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 

答えて

3

置き、いくつかのラベルを:

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` 

EDITを必要とせずに、それを簡素化することができますが...いくらかもっと

Gotoステートメントを使用することは、一般的にプログラミングの悪い習慣と考えられますが、この特定の状況ではそうではありません。これは、C言語および派生言語に存在する文の欠如に対する回避策として使用されています。

2

あなたがGoTo MARKER

+0

ありがとうございます...マーカーを使用すると完全に機能します! – SMORF

5

を追加If rngFound Is Nothing Then後にそうNext I

MARKER: 
Next I 

前にマーカーを追加する必要がありますが、このようにそれを行うことができますこのように、それは良いVBAではありませんGoToを使用する練習。コード全体を変更する必要があります。 Check more here。コードが完成したら、https://codereview.stackexchange.com/に投稿してください。良いアイデアが得られます。 Next I

+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

関連する問題