[エクセル]VBA連続処理を途中でストップさせたい

このQ&Aのポイント
  • エクセルのVBAで連続処理を途中で自動的にストップさせる方法を教えてください。
  • Aシートの指定行まで自動的に処理が進むVBAですが、B~Gのセルに数値が入っていない行で処理を停止させたいです。
  • 具体的な記述方法を教えてください。
回答を見る
  • ベストアンサー

[エクセル]VBA連続処理を途中でストップさせたい

[エクセル]VBAの連続処理を途中で自動的にストップさせるには? 以前にこちらで下記の質問をさせて頂きました。 http://okwave.jp/qa/q3838337.html 最終的にNo.4の回答がベストアンサーとなりました。 ---------- Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value Worksheets("Bシート").Calculate Sheets("Aシート").Range("J3:O3").Offset(i, 0).Value = Worksheets("Bシート").Range("B15:G15").Value   '※元のマクロの19行まで   '※中略(ここの部分の処理も上を参考にすれば可能です) Skip: Next i End Sub ---------- 上記の場合はAシートの9行目(For i = 0 To 9)まで自動的に処理が進むのですが、AシートのB~Gのセルに数値が入っていなかった場合は、その行で処理をストップさせたいと思っています。 例えば、B~Gの3行目まで数値が入っていて、4行目には数値が入っていなかった場合、9行目まで処理を進めるのではなく、数値が入っていない4行目で処理を停止させたいです。 どのように記述を書き加えれば良いのでしょうか? 御教授を頂けると助かります。 よろしくお願い致します。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

以下のようなこと? >If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip If Range("B3").Offset(i, 0).Value = Empty Then Exit For

その他の回答 (3)

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

参考 上から1行ずつ全行処理していくのだと思うが、Offsetを使わずに質問の回答(掲出コード修正を希望)とは別に Sub test01() d = Range("B65536").End(xlUp).Row For i = 3 To d For j = 2 To 7 'B列からG列まで x = Worksheets("Sheet1").Cells(i, j) If x <> "" And IsNumeric(x) Then Else MsgBox i & "行以下処理せず 終了" Exit Sub End If Next j MsgBox i & "行を処理" 'ここに1行分の処理を入れる Next i End Sub のようなのを勉強したら。 ほとんどの場合、この方式で処理できる。 ーー >B~Gのセルに数値が入っていなかった場合 ・B-G列のすべての列が空白の場合なのか ・1つの列のセルでも空白なのか 質問ではっきりしない。 こういうことをはっきり表現できる思考と表現になれないとだめです。 すべての列の空白を条件にするなら(途中でストップにしてないが) Sub test02() d = Range("B65536").End(xlUp).Row For i = 3 To d With Range(Cells(i, 2), Cells(i, 7)) If WorksheetFunction.CountBlank(.Cells) = .Count Then MsgBox i & "行は全て空白です" Else MsgBox i & "行を処理" End If End With Next i End Sub のような方法もある。 http://park11.wakwak.com/~miko/Excel_Note/15-04_celldata.htm#15-04-64 ーーー 以前の回答の方法は難しい方を選んでいるように思う。自分との相性や自分の力に左右されるものだが。 課題にVBAで当たるには、もう少し勉強してからでないと、質問が続き。回答も質問者に誤解されかれない恐れがある状態のようだ。

Cuty_Cat
質問者

お礼

ご回答ありがとうございます。 私にはVBAの知識がないため、自分で記述をする事ができないレベルです。 「B~Gのセルに数値が入っていなかった場合」についてですが、これはB~Gの一部のセルにも空白だった場合と言う事でした。 単純にBのセルのみと言う事でも大丈夫です。 言葉足らずで申訳ありませんでした。 imogasi様が提案された記述の方が処理が早いでしょうか? 空白セルがあった場合の、メッセージボックスは出さなくても良いと思っています。 質問の記述にもありましたように、Aシートの数値を参考にして、Bシートで計算をして、Bシートの結果をAシートに自動に記載する。そして、また次の行も同様に処理していくといった感じです。 より処理速度が早くなる記述があれば、アドバイスを頂けると助かります。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

追加のマクロでカンマが入っていました。次のように訂正します。 If WorksheetFunction.Count(Range(Cells(i,2),Cells(i,7)))=0 Then Exit For

Cuty_Cat
質問者

お礼

ご回答ありがとうございます。 ----------------------- Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If WorksheetFunction.Count(Range(Cells(i,2),Cells(i,7)))=0 Then Exit For If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value ----------------------- または ----------------------- Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If WorksheetFunction.Count(Range(Cells(i,2),Cells(i,7)))=0 Then Exit For Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value ----------------------- と、上記のように両方試してみましたが、「アプリケーション定義またはオブジェクト定義~」などとエラー表示され動作しませんでした。 最初にアドバイスして頂いたように、下記のように記述したら空白セルの行で処理がストップしたのですが、No3の回答の記述と何が違うのでしょうか? 一応、下記の記述で途中で処理をストップさせる事ができたのですが、No3では違う記述を提案されているので、どちらが良いのかアドバイスを頂ければ助かります。 ----------------------- Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If Range("B3").Offset(i, 0).Value = Empty Then Exit For Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value -----------------------

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

次のように追加すればよいでしょう。 For i = 0 To 9 Sheets("Aシート").Select If WorksheetFunction.Count(Range(Cells(i,2),Cells(i,7)))=0,Then Exit For

関連するQ&A

  • VBA Match関数の使い方について

    お世話になります ご教示頂けたら幸いです シート結果セルE4の値を検索してシート結果G4の値を 検索行のB列に値を転記したいです 下記のように書くとMatch関数行でエラーが出てしまいます どの様にすればいいのでしょうか? お手数おかけしますが 何卒よろしくお願いいたします With Sheets(Worksheets("結果").Range("A4").Value) WorksheetFunction.Match(Worksheets("結果").Range("E4").Value, Range("A1:A1000"), 0).Offset(3) = _ Worksheets("結果").Range("A4").Offset(2).Value End With

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • VBAの処理を軽くしたい

    各行ごとに5回セルを参照した結果を吐き出すプログラムを作成しています。 200行前後の処理が必要なのですが、現在のコードではあまりにも処理が重くなっています。 とにかく処理を軽くしたいのですが、どのような方法が考えられるでしょうか? 初心者なのでコードも含めてご教示頂けたら幸いです。 Sub test(b, c, d) Dim i1, i2 As Long Dim A1 As String  For i1=0 To Cells(Rows.Count, 1).End(xlUp).Row For i2 = 0 To 5 If Range(b).offset(i1, i2).Value = "x1" Or Range(c).offset(i1, i2).Value = "x1" Then A1 = "XXX" ElseIf Range(b).offset(i1, i2).Value = Range(c).offset(i1, i2).Value Then A1 = "YYY" Else A1 = "ZZZ" End If Range(d).offset(i1, i2).Value = A1 Next i2 Next i1 End Sub

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • VBAの転記について

    With Sheets("入力") '3行目~22行目まで For i = 5 To 24 SheetName = Sheets("入力").Cells(i, "C").Value On Error Resume Next Set Dummy = Sheets(SheetName) SheetName2 = .Cells(i, "C").Value U最終行 = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 If U最終行 = 39 Then Sheets(SheetName2).Copy BEFORE:=ActiveSheet Sheets(SheetName).Delete End If If Err.Number = 0 Then A = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 Sheets(SheetName2).Range("C" & A).Value = .Cells(i, "G").Value Sheets(SheetName2).Range("D" & A).Value = .Cells(i, "I").Value Sheets(SheetName2).Range("E" & A).Value = .Cells(i, "L").Value Sheets(SheetName2).Range("F" & A).Value = .Cells(i, "N").Value Sheets(SheetName2).Range("G" & A).Value = .Cells(i, "P").Value Sheets(SheetName2).Range("H" & A).Value = .Cells(i, "R").Value Sheets(SheetName2).Range("I" & A).Value = .Cells(i, "T").Value Sheets(SheetName2).Range("K" & A).Value = .Cells(i, "V").Value Sheets(SheetName2).Range("L" & A).Value = .Cells(i, "X").Value ElseIf .Cells(i, "C").Value <> "" Then G = Sheets("原紙").Range("C65536").End(xlUp).Row + 1 Sheets("原紙").Range("B1").Value = .Cells(i, "D").Value Sheets("原紙").Range("B4").Value = .Cells(2, "D").Value Sheets("原紙").Range("C" & G).Value = .Cells(i, "G").Value Sheets("原紙").Range("D" & G).Value = .Cells(i, "I").Value Sheets("原紙").Range("E" & G).Value = .Cells(i, "L").Value Sheets("原紙").Range("F" & G).Value = .Cells(i, "N").Value Sheets("原紙").Range("G" & G).Value = .Cells(i, "P").Value Sheets("原紙").Range("H" & G).Value = .Cells(i, "R").Value Sheets("原紙").Range("I" & G).Value = .Cells(i, "T").Value Sheets("原紙").Range("K" & G).Value = .Cells(i, "V").Value Sheets("原紙").Range("L" & G).Value = .Cells(i, "X").Value '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next i End With On Error GoTo 0 上記のVBAを作成しましたが、 C行の値ごとの転記(G~Xの値)が出来ません。 どこが間違いか教えていただけないでしょうか。

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

  • Excel VBAでの質問

    以前、質問に回答頂きそれを実行してうまくいったのですが、 特定のsheetだけsheetのつくりが違うため、 このsheetは毎回なにも処理をしないという処理を加えたいのですが、 (例えばsheet5とsheet8は処理をしない) 下記のコードにどのように付け加えればよいでしょうか? わかるかた宜しくお願い致します。 Dim i As Long For i = 1 To Worksheets.Count  If Worksheets(i).Range("A1").Value = 10 Then Worksheets(i).Range("K1") = Worksheets(i).Range("A1")  Worksheets(i).Range("A1:D80").ClearContents Next End Sub

  • エクセルのマクロで繰り返し処理

    当方マクロ初心者ですが下記のマクロをCheckBox0~CheckBox23についてコピーするセルを変化させながら繰り返し処理を行いたいのですが、簡単なループ処理で行えますか? 教えていただければ幸いです。 If CheckBox0.Value = True Then Worksheets("sheets1").Activate  行 = Worksheets("sheets1").Range("e7")   行 = 行   Worksheets("sheets1").Range("g7:t7").Copy Windows("Books1.xls").Activate Sheets("sheets1").Select Range(Cells(行, 15), Cells(行, 15)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If

  • Excel VBAで…。

    データーシート(1)のデータをレイアウトシート(2)に転記するのに 例えば sheets(1).range("A1").value=sheets(2).range("C5").value sheets(1).range("B1").value=sheets(2).range("C6").value sheets(1).range("C1").value=sheets(2).range("C7").value と言うように配置しているのですが もし、シート(1)セルB1の値が空白ならば シート(1)セルC1の値はシート(2)のセルC6に配置・・・ と言うように データがない場合は、転記後の配置は詰めて配置したいのです。 どうすればよろしいでしょうか?

  • ExcelのVBAで複数行を転記する方法について

    いつもお世話になります。YouTubeで変数を使わない複数行を纏めて転記する内容を見ました。”C10~H12セルの値をL10~Q12セルへ出力する" <Range("L10:Q12"):Value=Range("C10:H12"):Value> で一行で纏められる例題が出ていました。そこで私が作っている変数入りの複数行を一行で書く方法を教えてください。 ””””私の作ったプログラムです””””” Sub 領収証班別() '出力行を設定する変数の定義 Dim CtrRow '繰返し処理用の変数定義 Dim i '------------------------------------------------------------------------------ '出力行の開始位置を設定 CtrRow = 2 '2行目から62行目まで繰り返す For i = 2 To 62 'B(領収証の班別)に指定班名が合致しているか判定する If Worksheets("領収証").Range("B" & i).Value = "南1班" Then 'Worksheets("領収証班別").Range("A" & CtrRow).Value = Worksheets("領収証").Range("A" & i).Value 'Worksheets("領収証班別").Range("B" & CtrRow).Value = Worksheets("領収証").Range("B" & i).Value 'Worksheets("領収証班別").Range("C" & CtrRow).Value = Worksheets("領収証").Range("C" & i).Value 'Worksheets("領収証班別").Range("D" & CtrRow).Value = Worksheets("領収証").Range("D" & i).Value 'Worksheets("領収証班別").Range("E" & CtrRow).Value = Worksheets("領収証").Range("E" & i).Value '1行出力したため、出力行の位置を+1にする CtrRow = CtrRow + 1 '判定処理の終了 End If '繰り返し処理の終了 Next i '------------------------------------------------------------------------------ '出力行の開始位置を設定 CtrRow = 24 '2行目から62行目まで繰り返す For i = 2 To 62     :     : 次から次へと続きます。 と云うようなプログラムの中で 'Worksheets("領収証班別").Range("A" & CtrRow).Value = Worksheets("領収証").Range("A" & i).Value 'Worksheets("領収証班別").Range("B" & CtrRow).Value = Worksheets("領収証").Range("B" & i).Value 'Worksheets("領収証班別").Range("C" & CtrRow).Value = Worksheets("領収証").Range("C" & i).Value 'Worksheets("領収証班別").Range("D" & CtrRow).Value = Worksheets("領収証").Range("D" & i).Value 'Worksheets("領収証班別").Range("E" & CtrRow).Value = Worksheets("領収証").Range("E" & i).Value この複数行をYouTubeの例題の様に一行に纏めて書く方法はありませんか?このプログラムも、よちよち歩きで作ったものです(初心者です)よろしくお願いいたします。

専門家に質問してみよう