• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:指定の動作中ユーザーフォーム終了方法)

指定の動作中ユーザーフォーム終了方法

cj_moverの回答

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#3で、ああ書いておけば具体的なソースコードやプロットが返ってくるかと期待していましたが、 どうも今回はコミュニケーション・エラーばかり目立っていて、うまくいきませんね。 出口が見つからなくなってしまいました。 限られた情報の中で私の推理力を試されているようにも感じていますけれど、 今一度だけお応えします。更に続けてレスを重ねることはしませんので悪しからず。 ところで、 > End を記入し、強制終了させるしかなさそうな どうしてもそういう結論に導きたいのでしたら、ご自由にどうぞ。 そもそも今時、何故End ステートメントに拘るのか解りませんが、 生憎、End ステートメントを使って解決に導くようなレスは私には書けませんので、 そういう意味で期待外れでしたらば、以下読まずに無視してください。 でも、End ステートメントを使うデメリットについても知っておいてください。 例えば、VBAProjectが終了(リセット)されるまで値を保持してくれるスタティックな変数 (Static、Private、Public、Friendなどのキーワードで定義する変数のこと)、 これを使えないのは、設計やコーディングの手法を大きく限定してしまうことになります。 他の部分で何を書くのにも手間を増やさなければなりませんから、 一般論として、その場凌ぎにはなっても、"自分さえ良ければいい"的な、負の遺産でしかありません。 また、これらスタティックな変数を使わないでも成立するプロジェクトって、 そう多くはないのではないでしょうか。 もっとも、ひとつのプロジェクトにひとつのマクロというような扱いで、 且つ外部のオブジェクトを一切扱わないならば、 (それとも全知全能なVBAプログラマーが正しい使い方をするのならば) "どうぞお使いください"ってことではあります。 あと、正しくプロシージャを抜ければ、正しく解放されるオブジェクト等でも End ステートメントのおかげでTempフォルダに残骸を残し、 ゆくゆくはExcelアプリケーションの挙動にまで悪影響を及ぼような事例もあったと思います。 まぁ一時的に変更しておいたプロパティ(例:Application.Calculation = False)等を End ステートメントだけの為に態々元に戻すのも面倒ですよね。 実の所、ひとつひとつの記述を正しく書き直すことができれば、 End ステートメントは使う必要がない、と断言してもいいのかなって思いますけれど。 逆にEnd ステートメントでなきゃうまく行かない、と感じてしまうということは、 間違いに目が行ってない気が付いていない、って時なんじゃないでしょうかね? 私の経験として、「非同期の外部オブジェクトを複数ループさせて、 リターンが返ったタイミングのイベントを使っていた時」、 「中止ボタンですべて中止するように書いていたつもりが 外部オブジェクトのイベントを止められていなかった」ことに気が付いた時、 私も一瞬「End ステートメントを使えれば楽なのに」と思ったことがあります。 実際、デバッグが済むまでの1~2時間の間、End ステートメントを使いました。 私が書いたのはその一度だけです。 End ステートメントを使ったものを公開や配布したことはありませんし今後も絶対しません。 本題ですが、、 1. ActionFormのCommandButton1_Clickプロシージャには、 時間の掛かるループ処理があって、 ユーザーがActionFormの閉じるボタンを押した時に、MsgBoxから選択して ActionFormのCommandButton1_Clickプロシージャにある時間の掛かるループ処理を 中断し、処理全体を中止する。 2. 続けて、 ActionFormとBasicFormを非表示にして、 BaseFormだけが表示された状態にしたい。 ということだったのでしょうか? もしも、 ActionFormのCommandButton1_Clickプロシージャ内でのループ処理を中断する ということだったらば、何故こちらがループという言葉を#3で持ち出すまで、 それについての説明が一切無かったのか、その理由も数通り想像していましたが、 どれも希薄に思えたので、これは無さそう、という推理でお応えしたのが#3でした。 さて、#3の補足を受けて 何が原因か10通りくらいまでは想定を拡げてみました、が、キリがないのでやめました。 今開示されている情報だけで篩に掛けても、原因となり得る数百通りの原因がありそうです。 恐らくは、 処理中断用のエスケープフラグを(PrivateやPublicで)設けて、 ActionFormのUserForm_QueryCloseのタイミングでフラグを立て、 ActionFormのCommandButton1_Clickプロシージャ内でのループ内に   If エスケープフラグ = True Then Exit For とか、Exit Do、みたいな、ごく普通の中断処理ぐらいまでは書けているのでしょう。 でも、もしも、これも出来ていない(知らない、解らない)ということなら、第一の原因は、これです。 その場合はこの質問の当初の主旨とは違いが大き過ぎるので、それは別件で質問してください。 次に考えなければいけないことは、 ActionFormのCommandButton1_Clickプロシージャを呼び出す方法です。 一例として、   Call ActionForm.CommandButton1_Click に替えて、   Application.OnTime Now, "ProcGoRoundActionFormCommandButton1_Click" と記し、 別途、標準モジュールに、 Private Sub ProcGoRoundActionFormCommandButton1_Click() On Error Resume Next   ActionForm.CommandButton1_Click On Error GoTo 0 End Sub と書いておきます。 こうすることで、 抜けて(終って)いなければいけない、プロシージャを事前に抜けておくことができます。 ユーザーフォームモジュールから他のユーザーフォームモジュール内のプロシージャをコールする記述 が、もしも他にも有る場合は、同様に手当てします。 そこまでする必要があるか解りませんが、対症療法的にお腹が痛い時に保険室で飲ませてくれた市販(汎用)薬的なものです。 この方法が適切か(必要か?十分か?)どうかは、やはり具体的に見てみないと判断出来ませんが、 ActionFormとBasicFormを非表示にする上では、何れにしても呼び出し方を変える必要があるでしょう。 その他、 ActionFormのCommandButton1_Clickプロシージャ内での処理について、 オブジェクトの扱い方をもう一度点検しておいた方がいいかも知れません。 もしかしたらユーザーフォームをモードレス表示にするべきだった、なんて結論(オチ)も アルかも知れませんけれど、あれこれ想像するのにも限界はあります。 経験的な直感ですが、今回のレスで解決に結びつく確率は5%くらいかな、って思います。 その他多数の1%に満たない可能性、のどれかが正解、ってことなのでしょうから、 うまく解決に導けなくてスミマセンでした。以上で退席します。

satoron666
質問者

お礼

何度も回答頂き、本当にありがとうございます。 説明不足により、色々ご迷惑をお掛けして申し訳ありません。 ActionFormのCommandButton1_Clickで行うことが 多すぎて、そのループから抜けれないような状況でもありました。 フラグをたて、If文で抜けることも考えていたのですが Commandbuttonをクリックしたときの動作は 色んなプロシージャを利用するため、一度に抜けることが出来ず、簡単に抜ける方法は無いか?と思い 質問させて頂きました。 If文を立てる場合、利用するループ、プロシージャなど 様々な部分にExit subをおかなければならないかと思います。 ActionForm BasicForm BaseForm それぞれのフォームを終わらせるために、 If文を書いてしまうと100個以上記載しないといけないため 他にいい方法は無いかと探していました。 また、End ステートメントはあまり使わないほうがいいのですね。 ユーザーフォームを途中で終了したい場合など 楽だったため、良く使っておりました…。 色々と、文章がごちゃごちゃしていて申し訳ないです。 別に質問させていただこうと思います。 懇切丁寧に教えてくださり、ありがとうございました!

関連するQ&A

  • ユーザーフォームの切り替えについて・・・

    UserForm1とUserForm2の2つのユーザーフォームがあります。 UserForm1の中にあるcommandButton1をクリックすると、UserForm2が表示される仕組みになっています。 (ちなみに、UserForm2にもコマンドボタンがあり、クリックするとUserForm1に戻るようになっています) UserForm1の方に、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub UserForm2の方に、 Private Sub CommandButton1_Click() UserForm1.Show 0 Unload UserForm2 End Sub と記述してあります。 ところが、それぞれのユーザーフォームには、閉じると同時にブックが閉じるように Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか? 宜しくお願いします。(*´Д`人)

  • ExcelVBA:フォームの閉じるボタン「×」を消す方法

    ExcelVBAで、ユーザーフォームの閉じるボタン「×」を使用できなくなる方法は以下のコードで教わったのですが「×」自体消す方法ってあるでしょうか? Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = 1 End Sub 回答よろしくお願いします。

  • エクセル ユーザーフォームの位置

    ブックを閉じた時のユーザーフォームの位置を、次回ブックを開いた時に同じ位置で表示したいです。 以下のコードでユーザーフォームは閉じれないようになっています。 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True End If End Sub この場合でも、前回と同じ位置でのユーザーフォームの表示は可能でしょうか? 可能な場合はどのようにしたらいいでしょうか?

  • VBA ユーザーフォームのコードについて

    下記の2つのコードの意味について教えて下さい。 Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus・・・・・1 Exit Sub End If Application.Run (ComboBox1.List(ComboBox1.ListIndex))・・・2 End Sub 1と2がわかりません。 Private Sub UserForm_Initialize() TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB End Sub 「Private Sub UserForm_Initialize()」と「Array」がわかりません。 よろしくお願いします。

  • フォームのボタンからのみexcelを終了したい

    おねがいします。 都合上、フォームのボタンからだけexcelを終了したのです。 Private Sub CommandButton1_Click() Application.DisplayAlerts=False Application.Quit End Sub それに伴い、 右上のexcelのxボタン、シートのxボタンを無効化または非表示にしたいです。 Private Sub Workbook_BeforeClose(Cancel As Boolean)      If CloseMode = 0 Then     Cancel = 1   End If End Sub これで、エクセルxボタンは無効になりましたが、 フォームからの終了も出来なくなってしまいました。 フォームからのみ終了する方法を教えてください。

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus 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) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • ExcelVBA ユーザーフォーム間の変数について

    UserForm1のコントロールボタンbtn1又はbtn2をクリックするとUserForm2を開く。 UserForm1にはテキストボックスtxtN1、txtN2がある。 UserForm2のテキストボックスtxtN3に入力された値をbtnDecideをクリックすると、 UserForm1に自動入力するようにする。 その際btn1をクリックしてUserForm2を開いた場合はtxtN1に、btn2をクリックして開いた場合は txtN2に自動入力されるようにする。 以下のようにコードを組んでみました。 UserForm1のコード Public Number as integer Private Sub btn1_Click() Number = 1 UserForm2.Show End Sub Private Sub btn2_Click() Number = 2 UserForm2.Show End Sub UserForm2のコード Public Number as integer Private Sub btnDecide_Click() If Number = 1 Then UserForm1.txtN1 = txtN3.Text else:Number=2 UserForm1.txtN2= txtN3.Text End If Unload Me End Sub 以上になります。 どうもpublic 変数NumberがUserForm2を開いた段階でリセットされているようなのです。 何かいい方法はありますでしょうか。 教えていただける方がいましたらよろしくお願い致します。

  • ユーザーフォームに入力したデーターが転記できない

    いつもお世話になります。 Windows7 excell2010 です。 いろんなものに勉強してここまでに作成したユーザーフォームですが、データーは入力できるのですがコマンドボタンをクリックしても各セルに反映されません。 色々と試行錯誤していますがうまくゆきません。 どこに不具合があるかわからず恐れ入りますがどなたかご指導いただけませんか。 参考にコードは参考に下記にします。 ユーザフォームのVBAは下記です コード ※Module1 Sub 売上() Do UserForm1.Show Loop End Sub Sub 入金() Do UserForm2.Show Loop End Sub ※UserForm1 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "1" .AddItem "2" .AddItem "3" End With End Sub Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm1.TextBox1.Text Cells(n, 3) = UserForm1.TextBox2.Text Cells(n, 4) = UserForm1.TextBox3.Text Cells(n, 11) = UserForm1.ComboBox1.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub ※UserForm2 Private Sub CommandButton1_Click() n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 2) = UserForm2.TextBox1.Text Cells(n, 3) = UserForm2.TextBox2.Text Cells(n, 4) = UserForm2.TextBox3.Text Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End End Sub