• ベストアンサー

簡単な事だと思うのですが vba での質問です。

Private Sub 処理名()  Dim a as Byte vbOK = MsgBox ("OK? or Cancel?",vbOKCancel,"確認")  If vbOK = 1 Then   MsgBox "OKが押されました"  else if   MsgBox "キャンセルが押されました"  End if  ~以下長々と処理~     長々と処理の最後~ End Sub 例えば上記のような、vbaマクロがあったとします。 もし、キャンセルを押した場合、有無を言わさず全ての処理を終了したい場合どのように記述をすれば宜しいのでしょうか? キャンセルを押した場合後続の長々と処理部分は全てキャンセルしたいのです。 私はその方法が分からないために分岐がある度にif分のネストが深くなってしまって困っています。 どなたかご教授下さい。 よろしくお願い致します。

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

  • ベストアンサー
回答No.2

MsgBox "キャンセルが押されました" の後に「Exit Sub」

muropon
質問者

お礼

そうです。それが知りたかったのです。 有難うございました。

その他の回答 (1)

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  方法1)   「長々と処理」を「MsgBox "OKが押されました"」と「else if」の間に入れる。  方法2)   方法1だと、構造が見づらくなるのであれば、「長々と処理」をサブルーチン化して、方法1と同じ場所でcallしたらどうでしょう。 では。

関連するQ&A

  • エクセルVBAオプションボタンの選択画面に戻りたい

    皆さんこんにちは。 エクセルVBAの初心者です。 選択画面に戻るためのコードが足りていない感じなのですが・・ ご教授をお願いします。 ※エクセル2013を使用しています。 ユーザーフォーム1で作成書類を5種類から選択するようにしました。 選択後、「次へ」のボタンを押すと 『○○が選択されています。支社選択画面に移動します。』という メッセージが出るようにコードを作りました。 「OK」を押せば次の選択画面が開くように今後作っていく予定なのですが 「キャンセル」を押すとユーザーフォーム1が画面から消えるようになってしまっています。 やりたい事は「キャンセル」を押し『処理をキャンセルしました。』と メッセージが出た後に 最初のユーザーフォームで作成書類を選択し直すところに戻りたいのです。 私が作成したコードを記載しますので どこがどう間違っているのか、何が足りないのか ご教授いただければ幸いです。 ----------------------------------------------------- Private Sub CommandButton1_Click() Dim myMSG As String Dim i As Integer For i = 1 To 5 If Me.Controls("OptionButton" & i).Value = True Then myMSG = Me.Controls("OptionButton" & i).Caption End If Next i intRtn = MsgBox(myMSG & vbCrLf & "が選択されています。" & vbLf & _ "支社選択画面に移動します。", _ vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox "処理をキャンセルしました。" End End If intRtn = MsgBox("処理を続行します。", vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox "処理をキャンセルしました。" End End If End Sub

  • エクセルVBA 赤ペン先生をお願いします

    皆さんこんにちは。 エクセル2013使用しているVBA初心者です。 エクセルVBAでコードをど根性&こちらで質問させていただいた時のご回答を元に 作成してみたのですが思うような動作になりません。 下記のコードが美しくないのも重々承知しておりますが 下記内容で修正するべき個所を教えていただけないでしょうか。 やりたい事は ・ユーザーフォーム5でフレームが2個あり  1個は作成書類を7個から1つ選択  もう1個は支社を7個から1つ選択  →「次へ」のボタンを押すと「○○と△△支社を選択しています。お客様情報に~」のメッセージ表示  →OK→処理を続行します→OKならユーザーフォーム4(お客様情報)を開く   キャンセル→処理を中断します→ユーザーフォーム5を再度表示して選択し直せるように・・・   という事をやりたいのですが知識不足の上いくら参考書等を探しても これだ!というものにたどりつけずに困っています。 「○○と△△支社が選択されています」の箇所も myMSG & vbCrLf & "と" & myMSG & だと「△△と△△支社が選択されています」に なってしまうのは理解出来ているのですが代わりにいれるコードも分かりません。 また、「メッセージ表示のOK」を押して「処理を続行しますのキャンセル」を押しても ユーザーフォーム5に戻ることはなくユーザーフォーム4に 進んでしまう始末です。 毎度拙い質問文で申し訳ございませんが どうか皆様のお知恵をお借りできないでしょうか。 ※コードはコマンドボタン1(次へ)に書いてあります。 ---------------------------------------------------------------------------------- Private Sub CommandButton1_Click() Dim myMSG As String Dim i As Integer For i = 1 To 14 If Me.Controls("OptionButton" & i).Value = True Then myMSG = Me.Controls("OptionButton" & i).Caption End If If (OptionButton1 Or OptionButton2 Or OptionButton3 Or OptionButton4 Or OptionButton5 Or OptionButton6 Or OptionButton7) = False Then MsgBox ("作成する書類を選択して下さい") Me.Hide UserForm5.Show End If If (OptionButton8 Or OptionButton9 Or OptionButton10 Or OptionButton11 Or OptionButton12 Or OptionButton13 Or OptionButton14) = False Then MsgBox ("支社を選択して下さい") Me.Hide UserForm5.Show End If Next i intRtn = MsgBox(myMSG & vbCrLf & "と" & myMSG & "支社" & vbCrLf & "が選択されています。" & vbLf & _ "お客様情報に移動します。", _ vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox ("処理をキャンセルしました。") Me.Hide UserForm5.Show End If intRtn = MsgBox("処理を続行します。", vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") Unload UserForm5 UserForm4.Show If intRtn <> vbOK Then MsgBox ("処理をキャンセルしました。") Me.Hide UserForm5.Show End If End Sub Private Sub UserForm5_QueryClose(Cancel As Integer, CloseMode As Integer) 'Formが閉じるとき If CloseMode = 0 Then '×ボタンを押された場合 End 'プログラムの実行を終了 End If End Sub

  • 初心者です。エクセルVBAの質問なのですが・・・

    エクセルのVBAで 例えば・・・IF関数を使いたい時に Public Sub 練習() 年齢 = InputBox("あなたは何歳ですか。数字だけを入力して下さい。") If 年齢 < 20 Then MsgBox "未成年ですね" ElseIf 年齢 < 30 Then MsgBox "20代ですね。" Else MsgBox "その他の年代ですね" End If End Sub                            のようなものを作って、実行をしたときに、数字を入れてOKボタンではなく、ダイアログボックスのキャンセルや閉じるボタンを押したときに、「その他の年代ですね」が出てきますが、それを出てこないようにすることはできますか?(例えば、キャンセルボタンのような役割をさせるなど・・・)  結構難しいですかね? 教えて下さい。お願いします。

  • エクセル VBA MsgBox

    1)下記の記述だと コンボが空白ならエラー表示が出て Okをクリックすると ”記録しますか?” となります! そこをエラー表示されたら UserFormに戻り 空白が無くなったら ”記録しますか?” というMegBoxにしたいのですが どう変化すれば良いのでしょうか? 教えて下さい! Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 If Controls("ComboBox" & i).Text = "" Then MsgBox "選択されていません確認して下さい!", vbInformation, "良く見て下さい!" Exit For End If Next If MsgBox("記録しますか?", vbOKCancel) = vbOK Then With UesrForm From.TextBox1 = Val(UesrFrom.ComboBox1) + _ Val(UesrFrom.ComboBox2) + Val(UesrFrom.ComboBox3) + _ Val(UesrFrom.ComboBox4) + Val(UesrFrom.ComboBox5) From.TextBox2 = Val(UesrFrom.ComboBox6) + _ Val(UesrFrom.ComboBox7) + Val(UesrFrom.ComboBox8) + _ Val(UesrFrom.ComboBox9) + Val(UesrFrom.ComboBox10) End With MsgBox " 記録します!" Unload Me Else MsgBox " キャンセル!!" End If End Sub

  • VBA 加算演算時のトラブル

    事務処理用に準備したVBA処理の数値合計チェックにて本来イコールとなるべきところ、ノットイコールと判定されてしまいます。当該部分を抜き出し、わかりやすくしたものが下記のロジックですが、ここで、test2,test4は結果がイコールとなるものの、test3の場合、ノットイコールとなってしまいます。どなたか、原因につき教えていただけませんか? Dim aaa As Double Dim bbb As Double sub test2() bbb = 16.67 + 16.67 aaa = 33.34 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = 16.67 + 16.67 + 16.67 aaa = 50.01 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = 16.67 + 16.67 + 16.67 + 16.67 aaa = 66.68 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End sub

  • VBAのDoEventsが上手く動きません

    お世話になります。 ExcelのVBAで印刷処理をしているのですが、印刷枚数が多いのでDoEventsイベントを入れ、印刷中断処理を行いたいのですが、上手くできません。 印刷中ダイアログが表示されるのが原因なのでしょうか?それともコードの書き方が悪いのでしょうか?よろしくお願いします。 コードは以下のとおりです。 ************************************************ Public Can_flg As Boolean ************************************************ Private Sub CommandButton1_Click()   Can_flg = True End Sub ************************************************ Private Sub UserForm_Activate()   Dim ms As String   Dim j As integer   Can_flg = False   For j = 1 To 31    DoEvents    If Can_flg = True Then      ms = MsgBox("印刷を中止します。", vbOKCancel)        If ms = vbOK Then         Exit For        Else         Can_flg = False        End If    End If    Me.Label1.Caption = "印刷中です… (" & j & "/" & i & "ページ)"    Sheets("テスト").PrintOut   Next j   Unload Me End Sub

  • ExcelVBAで、広範囲セルの空白チェックをしたいと思います。

    ExcelVBAで、広範囲セルの空白チェックをしたいと思います。 以下のようなExcelシートがあります。 ・10行目まではタイトル行 ・データ入力可能セル範囲はA11~AF65536 全てのデータ範囲を削除するために、以下のコードを作成しました。 動きとしては問題ないのですが、データが存在しない場合の 処理時間が長くなってしまいます。 Sub 全データ削除() Dim endrow As Long Dim mydelete As Integer Dim myrange As Range endrow = Range("A11").End(xlDown).Row For Each myrange In Range("A11:AF" & endrow) If myrange.Value <> "" Then GoTo 削除処理 End If Next myrange MsgBox "データがありません。" Exit Sub 削除処理: mydelete = MsgBox("全てのデータを削除しますか?", vbOKCancel) Select Case mydelete Case vbOK Rows("11:65536").Delete Range("D4").Formula = "=COUNTA(A11:A65536)" MsgBox "データを削除しました。" Exit Sub Case vbCancel MsgBox "キャンセルされました。" Exit Sub End Select End Sub データ範囲が65536行までになってしまうため時間がかかっているのだと思いますが、 回避方法がわかりません。 ご教授お願いいたします。

  • 【VBA】値の引渡しについて

    VBA初心者です。 VBAの勉強もかねて、今、【 標準モジュール 】と【 UserForm 】を用いて あるプログラムを作っています。 その中で、プロシージャ間をまたいで 『 値の受け渡し 』をしたいと思っています。 今回、質問をさせていただいたのは、その『 値の受け渡し 』が 「できる場合」と「できない場合」があるので、常にできるように その対応方法を教えていただきたく、今回投稿させていただきました。 ---------------------------------------------------------------- 今困っているパターンを例にあげると、 ユーザフォームの中に2つのボタン 「OK」ボタンと「キャンセル」ボタンが あるとします。 【 「キャンセル」ボタンがおされた場合には「終了する」 】という 仕組みにしたいと思っています。 そこで以下のようなプログラムを作ろうとしました。 ---------------------------------------------------------------- ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1) General部にPublic変数(以下「P変数」)を宣言する。      Public cancel as byte 2) 【標準モジュール】のプロシージャから【フォーム】の「Userform1」を表示させる。          Sub A処理()           Userform1.show           End sub   3) 【フォーム】のUserform1._CommandButton2に以下のように記述する。    (キャンセルボタンがクリックされた場合)          Private Sub CommandButton2_Click()       cancel = False       Unload Me       Exit Sub      End Sub 4) 【標準モジュール】のプロシージャの、一連の処理の最後に    以下のようにプログラムを記述する。          Sub A処理()           Userform1.show      ↓      ↓           if cancel = false then                exit sub           end if      End sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1)~4)のようにして 「キャンセルがクリックされた場合、すべての処理を終了する。」 というようなプログラムを記述してみました。 すると、デバッグを使って、変数「cancel」の中身を見てみると 3)の段階で、その変数「cancel」に「false」値を格納したはずなのに、 プロシージャ間をまたいだことで 4)の段階では、変数「cancel」の中身が必ず「""」と 値が空値になってしまいます。 4)の段階でも、変数「cancel」の値が保持できる、 何かしらの方法はないでしょうか。 回答をよろしくお願いします。

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • エクセルVBAで Cancel=Trueの使い方

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

専門家に質問してみよう