• ベストアンサー

ExitでIFステートメントを抜けたい

Sub test() Dim n As Byte, i As Byte For i = 0 To 5   If n = 0 Then    n = n + 1   Else    Exit For '(1)ここから   End If i = i + 1 '(2)ここへ来たい(IFステートメントだけ抜けたい) Next i End Sub のように(1)から(2)へ行きたいのですが このコードを実行すると Forステートメントを抜けてしまい、マクロが終了してしまいます。 「Exit If」にするとエラーになってしまいます。 Exitを使用してIFステートメントだけ抜け、 Forステートメントに戻るにはどうすればいいでしょうか? ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • okdeath
  • ベストアンサー率28% (13/46)
回答No.5

こんにちわ。 VBAを使わないので書き方のルールがよくわからないのでエラーがでるかもしれませんが、i=i+1の場所がよくないんじゃないでしょーか? nが0の時だけiに2を足したい。 nが0以外のときはiに1を足したい。 このようにしたいと考えているのではないでしょーか? ↓こんな感じに変えたらどうでしょう?(素人なんで変だったらごめんなさい。) Sub test() Dim n As Byte, i As Byte ←よくわからないのでそのまま^^; For i = 0 To 5   If n = 0 Then    n = n + 1 i = i + 1 ←ここに入れたらどーでしょー?(elseは不要っぽい)   End If Next i End Sub あとは書き方分かる方おねがいします。

nifufu2
質問者

お礼

ありがとうございます。

その他の回答 (5)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.6

If ~ End If は、ループじゃないので、Elseで何もしなければ、そのまま(2)に行きますよ。 ちなみに、Exit For で Forステートメント(Forループ)を抜けるのは、当たり前ですね。そういう命令なので。

nifufu2
質問者

お礼

If ~ End Ifはループじゃないんですね。 ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

>Dim n As Byte, i As Byte バイト型のこと http://www.sdls.jp/~barista/tech/vba/g0.html に初心者は使わないと。 これを使えるレベルなら、本質問など、出ないだろう。 ーー コードだけ書くのでなく、何がやりたいのか「文章で」書くべき。書かないから、回答者から推測的な回答が出ているように思う。 それにエクセルの処理に絡んだ問題を抱えているのではないか。 そうであればセルとの関連で質問を書くべき。 例 Sub test01() Dim i, j As Integer For i = 1 To 10 For j = 1 To 5 'MsgBox i & "-" & j & Worksheets("Sheet4").Cells(i, j) If Worksheets("Sheet4").Cells(i, j) <> "" And Worksheets("Sheet4").Cells(i, j) = 0 Then Worksheets("Sheet4").Cells(i, j) = 1 Exit For End If Next j Next i End Sub ーーー 例データ A1:F5 結果元は1のところは0、-は空白セル。 1 ー ー 0 ー ー ー ー ー ー ー ー 1 ー ー ー ー ー ー ー ー ー 1 0 ー ーーーーー 最悪、Gotoステートメントも使うぐらいの融通性を持ったら。 -- >i = i + 1 Forループの中でカウンタ変数をいじくるのは、追跡をややこしくする。 ーー Nが0ならば、Nを1にするでよいのでは。 n = n + 1なんて書かず。 ーー nが0出なければこの処理をやめる、のだから If n=0 then n=1

nifufu2
質問者

お礼

バイト型は使わないほうがいいのですね。 勉強になりました。 ありがとうございます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

一般的にFor~Nextのなかで i を加工することはあまりしません。それは後からわかりにくくなるからです。 (例外的に強制的にFor~Nextを抜けるために i に大きな値をセットすることはありますが、VBAではExit For文があるので必要性は薄いです) 質問文を単純に書き直すと以下になりますが、正直なところ何をしたいのかよく分からないので、これで良いか自信はありません。 Sub test() Dim n , i As Integer For i = 0 To 5 Step 2   If n = 0 Then    n = n + 1   End If Next i End Sub

nifufu2
質問者

お礼

ありがとうございます。

noname#96023
noname#96023
回答No.2

forの条件は例なのでしょうか? 2回目のループでは必ずnが0じゃないので そもそもforは不要なんですが

nifufu2
質問者

お礼

一度見直してみます。

  • KDASH-XP
  • ベストアンサー率46% (63/136)
回答No.1

上述の場合Else文が不要になるのではないでしょうか? 分岐処理の条件を記述するのがIf文ですので、抜けるのではなく、始めから入らない、が正解です。

nifufu2
質問者

お礼

あれ? 確かにそうですね。 ちょっとコードを見直してみます。

関連するQ&A

  • IFステートメントの使い方 どちらでもないならば

    「出金も入金も0じゃないならば」としたい場合、どのようなifステートメントを作ればいいでしょう? Sub test() Dim 出金 As Currency Dim 入金 As Currency 出金 = 0 入金 = 0 '(1) If Not (出金 = 0) And Not (入金 = 0) Then MsgBox "出金0入金0ではありません" End If '(2) If (出金 = 0) And (入金 = 0) Then Else MsgBox "出金0入金0ではありません" End If End Sub (1)だとうまくいきません。 (2)のように Elseを使って対応するしかないのでしょうか? (2)でいけますが、今後の勉強の為にelseを使わずに、「どちらでもないならば」の方法を教えてください。

  • For~Nextステートメント  途中で止めるには

    For~Nextステートメント で、変数が5なら止めたいのですがIFを使わない方法があったと思うのですが、 忘れてしまいました。 今は、 +++++++++++++++++++++++++++++ Sub test() Dim i As Long For i = 2 To 10 If i = 5 Then Stop End If Next End Sub +++++++++++++++++++++++++++++ としていますが、 If i = 5 Then Stop End If じゃなくても、一つのメソッドで出来た気がするのですが、 わかる方いらっしゃいますか? ご回答よろしくお願いします。

  • If文中のExit Sub

    Dim i As String i = TextBox1.Value If i ="" Then MsgBox "入力なし" Exit Sub End If Exit Subは何の意味が有るのでしょう? Exit Subを調べたり試したりしたのですが、良く、解りません。 宜しくお願い致します。

  • vba boolean変数を開放する方法

    エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。 Sub macro2() Dim i, m As Integer Dim b, c As String Dim flg(1 To 20) As Boolean b = Cells(1, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(1, 2).Value = c End Sub これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。 Sub macro2() Dim i, m, n As Integer Dim b, c As String Dim flg(1 To 20) As Boolean For n = 1 To 10 b = Cells(n, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(n, 2).Value = c next n End Sub 一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。 取りあえずもう一つマクロを追加してやりたいことはできたのですが、 Sub macro1() Dim n As Integer For n = 1 To 10 Call macro2(n) Next n End Sub Sub macro2(n As Variant) 以下略 なんかスッキリしません。 boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。 flg(m) = Falseを挿入してもダメでした。

  • エクセル・マクロでIf Thenの使い方

    このような質問は、ルール(エチケット、マナー)違反になるでしょうか? もしそうならお許し下さい。 名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。 Private Sub CommandButton1_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = False Next End Sub Private Sub CommandButton2_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = True Next End Sub これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。   If Names.Visible = False Then   If ThisWorkbook.Names.Visible = False Then If ThisWorkbook.tname.Visible = False Then Private Sub CommandButton3_Click() Dim tname As Name If Names.Visible = False Then 'これでは駄目 For Each tname In ThisWorkbook.Names tname.Visible = False Next Else For Each tname In ThisWorkbook.Names tname.Visible = True Next End If End Sub 苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。 Private Sub CommandButton3_Click() Dim tname As Name If Range("g1").Value = " " Then   For Each tname In ThisWorkbook.Names   tname.Visible = False   Next Range("g1").Value = "1" Else   For Each tname In ThisWorkbook.Names   tname.Visible = True   Next Range("g1").Value = " " End If End Sub ど素人ですがよろしくご教導ください。

  • エクセルのマクロで exit について

    よろしくおねがいします 各々のシートのX1セルを値を参照して ゼロ以外の時は 印刷の処理をして ゼロの時は処理をしない という内容を書きたく思います。 このままで記述だとX1セルの値がゼロの場合 いきなりsubを抜けてしまうのですが 1,2枚目でゼロの場合 その次のシートにきちんと処理が 継続したいのですが どこを修正したらよろしいでしょうか? Sub マクロ() Dim shAry As Variant Dim i As Integer, cnt As Integer, x As Integer shAry = Array("東京", "千葉", "群馬") For cnt = LBound(shAry) To UBound(shAry) Sheets(shAry(cnt)).Select x = Int(((Range("x1").Value) - 1) / 5) + 1 If x = 0 Then GoTo ゼロの場合の処理 Else MsgBox "印刷枚数は " & x & "枚です" ここにいんさつの処理があります End If Next Exit Sub ゼロの場合の処理: MsgBox "印刷する内容はありません" End Sub

  • IFステートの中にWithステートメントの始まり

    IFステートの中にWithステートメントの始まりだけ入れることってできないのですか? Sub j() Dim a As String a = "aaa" If a = "aaa" Then With Sheets("作業用1") Else With Sheets("作業用2") End If End With End Sub このような事をやろうとすると、Elseの部分でコンパイルエラーになります。 別の方法として、シートオブジェクトの中に入れちゃえば入れちゃえば With の分岐をしなくていいことは分かったのですが、 このような使い方をしたいことが多々あるのですが、 VBAの文法的には、IFの中にWithの始まり(先頭)だけを入れることは不可能なのでしょうか?

  • エクセルVBAの条件指定が上手くいきません

    「7を超えたら、For Eachステートメントを抜けなさい」という条件を入れたいのですが、 7を超えても処理が継続し困っています。 勉強不足で申し訳ないですが、ご教授願います。 【やりたいこと】 まず、セルB1~D3までのセルの値(9つ)が、7を超えない条件で1を加算していきます。 加算したときの値はE~Gの列に貼り付けていきます。 7を超えた時点でFor Eachステートメントを抜けます。 また、B1~D3までのセルには計算式が入っており、A1に数字を入れると、 それぞれ異なる増え方をします。(計算式自体は$A$1+1.1、$A$1+2.1などシンプルなもの) Sub test() Dim i As Range Dim n As Long Dim x As Long n = 1 x = 1 For Each i In Range("B1:D3") Range("A1").Value = x If i < 7 Then Range("B1:D3").Copy Cells(n, 5).Select Selection.PasteSpecial Paste:=xlPasteValues n = n + 3 x = x + 1 ElseIf i > 7 Then Exit For End If Next End Sub お手数ですが、宜しくお願いいたします。

  • IF構文の使い方

    皆さんにはいつもお世話になっております。 エクセルVBAでご教授していただきたいことがあります。 1行目は空白行で、B2~CW51がデータがあるセルです。 A列は空白列で、B列(B2以降)にデータがある場合は、ListBox3の文字列を同行のcell(i , "A")に代入したいのですが。 下記のように、if構文を使ってみたのですが、うまくいきません。 Sub テスト_Click() Dim i As Integer With ActiveSheet For i = 2 To 51 If .Cells(i, "B") = "" Then .Cells(i, "A") = "" Else Cells(i, "A") = ListBox3.Value Exit For End If Next End With End Sub よろしくお願いいたします。

  • VBA IFステートメントがうまくできません

    Sub tset1() Dim URL As String URL = "http://oshiete.coneco.net/mypage#tabs" If URL Like "http://oshiete.coneco.net/mypage#tabs" Then MsgBox "成功!" End If End Sub を実行すると、URL の値は"http://oshiete.coneco.net/mypage#tabs"なのに、 "成功!"が表示されません。 #が曲者のような気がしますが、これ以上わかりません。 URL = "http://oshiete.coneco.net/mypage"にすれば、うまくいきした。 #があっても、IFステートメントが使えるようにするにはどうすればいいでしょうか? ご回答よろしくお願いします。

専門家に質問してみよう