• ベストアンサー

VBAでcallで呼び出したsubを終了させる

heno-_-の回答

  • ベストアンサー
  • heno-_-
  • ベストアンサー率100% (6/6)
回答No.1

Subプロシージャを外部から終了させるのは、実用的ではありません。 Subプロシージャの中で、停止ボタンが押された場合には、 計算処理を中断するような仕組みにしておくと良いと思います。 下記のコードは、ユーザフォームに「 実行ボタン( cmdAction ) 」と 「 停止ボタン( cmdStop ) 」を配置した場合のサンプルです。 グローバル変数で停止フラグを定義し、 フラグがOFFの間は処理を続け、 フラグがONになったら終了するプログラムになっています。 '' 停止フラグ Public bStopFlg As Boolean ''------------------------------ '' [ 実行 ]ボタン押下時 ''------------------------------ Private Sub cmdAction_Click() '' フラグをOFF bStopFlg = False '' 計算処理実行 Call cal End Sub ''------------------------------ '' [ 停止 ]ボタン押下時 ''------------------------------ Private Sub cmdStop_Click() '' フラグをON bStopFlg = True End Sub ''------------------------------ '' 計算処理 ''------------------------------ Sub cal() Do While True '' 何らかの計算処理 Cells(1, 1) = Cells(1, 1) + 1 Application.Wait Now + TimeValue("00:00:01") DoEvents '' [停止]ボタンが押された場合( フラグがON ) If bStopFlg Then If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbYes Then Exit Do Else bStopFlg = False End If End If Loop End Sub

関連するQ&A

  • Private Sub内でSubをCallしたい

    Excel 2007でVBAを組もうとしています。 ユーザーフォームのコマンドボタンをクリックすると動く処理を Private Sub 内に書きましたが、処理が長くなりましたので、 Subに分けたいと思います。 Private subからSubプロシージャをCallすることはできますか? またどのSubでも同じ変数を使う場合、定義は、各Sub内で 毎回行う必要がありますか? 引数渡しのところがよく分からないので、すみませんが よろしくお願い致します。

  • プログラムを終了しても消えない変数

    VBAを使っていて ユーザーフォーム上にボタンを二つ配置します。 ボタン1を押すとsub 1が実行されます。 このプログラムで出力された変数を ボタン2で実行するsub 2で使いたいのですが どうすれば良いですか? sub 1の中でcall subを使ってプログラム2を呼び出すということはしたくないのですが このsub を終了しても変数が消えないようにするには ワークシートのセルに代入するか ユーザーフォームのテキストボックスなどに代入するしかないでしょうか? この変数を外に出さずに隠さずに保存しておき 次のsub で使いたいのですが 何か良い方法はないでしょうか?

  • エクセルVBA ユーザーフォームの終了について

    エクセルVBAでユーザーフォームを作成しています。 コマンドボタンにVBAマクロを割り当てしているのですが 思うように動いてくれないので質問します。 コマンドボタンをクリックしたら望む動作 1、ワークシートを選択 2、その後、ユーザーフォームを消す。 と言う動作にしたいのですが、2の ユーザーフォームを消す方法、書き方が分かりません どなたか教えていただけないでしょうか 1の動作は以下のように書いています。その後の書き方を お願いします。 Private Sub CommandButton8_Click() ブック名 = "VBA演習" シート名 = "sheet1" Workbooks(ブック名 & ".xls").Worksheets(シート名).Activate End Sub (ユーザーフォームの名前は"テストフォーム"としてます)

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • Excel VBA 『Call』で呼び出す意味

    いつもお世話になっております。 今更な話なのですが、 SubプロシージャなどをCallで呼び出す意味は何なのでしょうか? 例) ユーザーフォーム:UserForm1 Public Sub CommandButton1_Click() Call DATA_CREATE End Sub Sub DATA_CREATE() Range("A1").value=1 Range("A2").value=5 End Sub ---------------------------- ためしに書いてみましたが(実際に実行していません Subと書いてあるものはCallを使わなくても 上手く動作します。 Public Sub CommandButton1_Click() DATA_CREATE End Sub 上記方法でも大丈夫です。 何か意味などありましたら、教えてくださるとうれしいです! よろしくお願い致します。

  • VBAで画像を表示する方法

    VBA初心者です。ExcelのVBAでプログラミングの練習をしています。 早速ですが質問させてください。 ユーザーフォーム上にコマンドボタンをクリックすることにより画像を表示させることはできるのですが、これをユーザーフォームを開いた瞬間に自動的に表示させる方法はないのでしょうか? ちなみに現在は以下のようにしています。 Private Sub CommandButton1_Click() Image1.Picture = LoadPicture(" ") End Sub インターネットで調べてみても見つからないので質問させてもらいました。分かりにくい説明でしたらすみません。

  • Excel VBAプログラム終了時に、

    Excel2016でVBAのプログラムを終了しようとすると、自動的にコードが書かれている画面に移ってしまいます。 ユーザーフォームを使用しているのですが、終了する際にそのフォームだけ消したいです。 プログラムにどうやって書けばいいでしょうか? ちなみに終了するときは「終了ボタン」を押してプログラムを終了させるようにしています。(画像参照)

  • エクセルVBA

    ユーザーフォームがあり、コマンドボタンが準備されています そのコマンドボタンをクリックした場合、処理1~処理3を実行するようにしています Sub CommandButton1_Click() CommandButton1処理1 CommandButton1処理2 CommandButton1処理3 End Sub Private Sub CommandButton1処理1() ・・・ End Sub Private Sub CommandButton1処理2() ・・・ End Sub Private Sub CommandButton1処理3() ・・・ End Sub 処理1→処理2→処理3という流れが進むかと思います 処理1の中にIf~End ifがあり、Ifに合致する場合はメッセージボックスが表示するようになっています 処理3の中に、「ユーザーフォームを閉じる」記載がされています 処理1のIfに合致する場合、メッセージボックスを表示させユーザーフォームを閉じることなく終了したいです つまりIfに合致した場合、その後の処理2、処理3をさせず処理1で終了させればいいのかと思ったのですが、そのようなことはできるのでしょうか? 処理1でIfに合致する場合、Exit Subとすると処理1は終了するかもしれませんが、その後処理2、処理3に進んでしまうので困っています よろしくお願いします

  • 別ブックのマクロよりコマンドボタンを押下する方法

    当方、VBAに関しては初心者です。 EXCEL2000のVBAで作成したプログラムAの操作を、マクロを使って別のブックに記録させたのですが、マクロを実行しても途中で操作が止まってしまいます。 マクロを変更することで解決できる方法がわかる方がいらっしゃったら教えてください。 ※RocketMouseのようなWindows操作制御ソフトが会社では利用禁止とされていて使えません。 ちなみにVBAで作成したプログラムAは ・ユーザーフォーム上に2つのコマンドボタン(「次へ」「終了」)と4つのラジオボタンがあります。 ・「次へ」を押下すると別のユーザーフォームへ遷移します。 ・遷移先のユーザーフォームにはコマンドボタン(「戻る」)があります。 ※ただし、会社の資産であるためプログラムAを変更することはできません。 マクロで記録した操作は以下の(1)~(4)です (1)ラジオボタンはデフォルト表示のままで (2)コマンドボタン「次へ」を押下して別のユーザーフォームへ遷移 (3)遷移先のユーザーフォームでコマンドボタン「戻る」を押下 (4)(1)のユーザーフォームに戻った後コマンドボタン「終了」を押下 別のブックに(1)~(4)の操作を記録させ実行しましたが、(2)でコマンドボタン「次へ」が押下されず、別のユーザーフォームへ遷移できません。 マクロの変更で別のユーザーフォームへ遷移させる方法を教えてください。 ※コマンドボタン「次へ」の関数はPublic Subで定義されてます。 よろしくお願いします。