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

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

cj_moverの回答

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

#1-2、cjです。補足欄へのレスです。 #1 大事なのは   読込む → 表示する → 非表示にする        → 再表示する → 非表示にする        → 再表示する → 非表示にする        → 再表示する → 非表示にする        → 再表示する → 非表示にする      ↓   二度と使わないタイミングが来たら→インスタンスを取り消す という順番だったり、 Load→.Show→.Hide→Unload という順番を(プログラムの開発者として)正しく実践するか、 または、省略するなら、どこで何を省略しているのか把握しておく、ということです。 「ブックを開いたら閉じる」のと同じように 「表示したら非表示にする」一連の(一対の)処理だってことなのです。 非表示にされたユーザーフォームは目に見えませんけれども、 クラス丸ごと(イベントもプロパティもメソッドも関数もStaticな変数も)失われることなく そのまま維持されている、ということです。 普通に閉じるボタンで閉じてしまえば、すべて失われる訳ですから大きく違います。 #2 補足欄での説明に副い   BaseForm    └CommandButton1   BasicForm    ├CommandButton1    └ComboBox1   ActionForm    ├CommandButton1    └ComboBox1   (Sheet1 : "TEST") というテスト用のブックを作成しました。 以下の記述で動作の確認は取れています。 > Call ActionForm.Commandbutton1_Click この処理の内容が原因でうまくいってない可能性も少しありますけれど、 見ないと何とも言えません。 > Commandbutton1を押して、動作中であったとしても > 終了できるように、「End」を使っていました。 > Unload についても試してみましたが、 End を使う場所ではありませんし、Unloadではなく.Hideするべきかと、、、。 > CommandButton1を押して動作中のため、 > 見た目上消えては居ますがCommandButton1の動作は継続しておりました。 意味する処が判然としませんが、 ActionFormを.Hideすれば、BasicFormのCommandButton1_Clickを抜けます。 これで解決している、というのが今の処、一番可能性の高い解釈です。 或いは、BasicFormのCommandButton1_Clickから呼び出されるループ処理を抜けられない、 ってことだったり、なんて無さそうなことも考えてみましたが、 今解っている限りでは、以下に示す方法(#1-2の主旨そのまま) これを試して貰ってから、ですね。 テスト用のブックを作成して、この下に書いてあるままの記述を動かしてみて、 その上で未解決なら実行結果とともに詳細な補足をください。 そうしてもらわないと問題の切り分けがこちらでも出来ません。 CommandButton操作に関する処理内容はこちらで適当に仮設したものです。 ' ' 〓〓〓〓〓 BaseForm モジュール 〓〓〓〓〓 8671316-3 Private Sub CommandButton1_Click()   BasicForm.Show End Sub ' ' 〓〓〓〓〓 BasicForm モジュール 〓〓〓〓〓 8671316-3 Private Sub CommandButton1_Click()   Load ActionForm   With ActionForm     .ComboBox1.List = ComboBox1.List     .ComboBox1.Value = ComboBox1.Value     Call .CommandButton1_Click     .Show   End With End Sub ' ' 〓〓〓〓〓 ActionForm モジュール 〓〓〓〓〓 8671316-3 Sub CommandButton1_Click()  '  ! Not Private !   Dim sBuf As String   With Me.ComboBox1     sBuf = .List(0) '.Value     .List(0) = .List(.ListIndex)     .List(.ListIndex) = sBuf     .ListIndex = 0   End With End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)   If CloseMode = vbFormControlMenu Then '終了ボタンを押されていた場合は     If FP_GetResult = True Then 'はい を押した場合の判断       With ThisWorkbook.Worksheets("TEST")         .Select       End With       Cancel = True       Me.Hide  '  ←後から表示したものから順番に       BasicForm.Hide  '  ←そのまま表示しておきたいものは.Hideしない       BaseForm.Hide  '  ←    同上       Exit Sub  '  これ←特に必要ないとは思うのですが一応、、、、。     End If   End If   Application.ScreenUpdating = True  '  ←この記述の意図は解りません。 End Sub ' キャンセルするかを確認する関数 Private Function FP_GetResult() As Boolean   If MsgBox("終了しますか?", vbInformation + vbYesNo) = vbYes Then     FP_GetResult = True   End If End Function ' ' 〓〓〓〓〓 〓〓〓〓〓 > UserForm という名称でユーザーフォームは作っていなく、 > 投稿用?に名前を変えさせていただきました。 こちらの指摘の仕方も悪かったのでしょうけれど、 私が問題にしているのは、寧ろ、 UserForm という名前のユーザーフォームがあるという設問で、 投稿されていたこと、の方なのです。 質問掲示板は質問者と回答者の為にだけ存在する訳ではないので、 何も知らない閲覧者が話を鵜呑みにしてトラブった処で自己責任、ではありますが、 トラブルの原因になり兼ねない書き方を敢えて選ぶこともない訳ですし、 出来るだけ、資料として役立つスレッドだったり回答だったり、 そういうものであって欲しい、ありたい、という私の願いも含めての話でした。 認識にズレがあるようなので仕方ないです、これ以上は言いません。 あなた自身がこのカテゴリーで回答をしている人でなかったなら、 幾度かスレッドでご一緒した方でなかったなら、何も書かずに素通りしていたとは思います。 失礼しました。 #1-2補足欄へのレス、以上です。

satoron666
質問者

お礼

回答・ご忠告ありがとうございます。

satoron666
質問者

補足

テストプログラム、ありがとうございます。 試してみました。 ActionFormのCommandButton1_Clickの ループから抜けられませんでした。 BaseForm →BasicForm →ActionForm(画面は切り替わらない) この流れで試し、ActionFormで長いこと処理があるので 右上の×をクリックし終了させる。 そうすると、記載されていた .hideが動くわけですが、 メモリ上では動作したままでした。 分かりやすいように、 ActionFormのCommandButton1_Clickが 終わったときに Msgbox "ActionFormのボタン動作は終了しました!" と出るようにしましたが、 何度試しても「ActionFormのボタン動作は終了しました!」 と表示されました。 やはり、CommandButton1_Clickの動作を 途中で終了させるにはUserForm_QueryCloseで 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