質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.54%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1104閲覧

フォームを閉じようとするとオートメーションエラーが出る。

pe_san

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

2クリップ

投稿2023/03/13 06:52

編集2023/03/15 00:01

前提・実現したいこと

 ユーザーフォーム1内のコマンドボタン3を押すことでフォーム4を呼び出し、
フォーム4内のテキストボックス1に"CLOSE"と入力することでフォーム1,4を両方閉じるようにしたいです。
(フォーム2,3やコマンドボタン1,2は今回関係ないので割愛させていただきます。)

 詳細は下記「該当のソースコード」を参照していただきたいのですが、"CLOSE"以外の"END "と"SP "の場合は問題なく動作します。
"CLOSE"の場合だけオートメーションエラーが出てしまいます。

3/15 追記(補足)
ユーザーフォーム2内にコマンドボタンがあり、
Unload UserForm1
Unload UserForm4
の2行のみ記述している。
このコマンドボタンだと強制終了することもなく正しく動作する。

発生している問題・エラーメッセージ

「オートメーションエラーです。起動されたオブジェクトはクライアントから切断されました。」というエラーが出ます。
デバッグ画面では、フォーム1の「UserForm4.Show」の部分が黄色にハイライトされています。

該当のソースコード

vba

1Private Sub CommandButton3_Click() 'フォーム1のボタン3 2 3 '作業者が選択されていればフォーム4開く 4 If UserForm1.TextBox1 = "" Then 5 6 r = MsgBox("作業者を選択してください。") 7 If r = 1 Then 8 9 Application.OnTime Now(), "フォーカスu1t1" 10 11 End If 12 13 14 Else 15 16 UserForm1.Hide 17 UserForm4.Show '←エラー時ハイライトされる箇所 18 19 End If 20 21End Sub 22 23 24Private Sub textbox1_afterupdate() 'フォーム4のテクストボックス1 25 26 If UserForm4.TextBox1.Value <> "" Then 27 28 '変数 29 '------------------------------ 30 u4t1 = UserForm4.TextBox1.Value 31 '------------------------------ 32 33 Select Case u4t1 34 35 Case "CLOSE" 'フォーム閉じる 36 Unload UserForm1 37 Unload UserForm4 38 Exit Sub 39 40 Case "END " 'フォームクリア 41 42 UserForm4.TextBox1.Value = "" 43 Application.OnTime Now(), "フォーカスu4t1" 44 45 Case "SP " 'チェック 46 Application.OnTime Now(), "フォーカスu4t3" 47 48 End Select 49 50 End If 51 52End Sub 53

試したこと

・再起動…再現。
・別のブックに同じコードを記述…再現せず。
(なぜ新しく作ったブックでは再現しないのかが理解できていません。
「そういうもの」と思った方がいいのでしょうか?

3/14 追記(補足)
・デバッグ画面でハイライトされる
UserForm4.Show

UserForm4.Show vbmodeless
に変更。
→フォームは両方閉じることに成功しましたが、
フォームを閉じた状態でEXCELが固まり、
強制終了するようになりました。

3/15 追記(補足)
・hide、show、unload以外のステーメント、プロシージャを削除
→再現(両フォームが閉じた後にEXCEL強制終了)

補足情報(FW/ツールのバージョンなど)

再現が確認できたPC
Windows PRO /EXCEL 2016
Windows home /EXCEL LTSC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

logres_Fan

2023/03/14 15:54

Hyde、Show、Unloadの行だけ残し、それ以外を削った場合も再現されるでしょうか?
pe_san

2023/03/14 23:52

コメントありがとうございます。 ユーザーフォーム1を呼び出すための Private Sub CommandButton1_Click() 'メインフォーム開く UserForm1.Show End Sub ユーザーフォーム2を呼び出すための Private Sub CommandButton3_Click() UserForm1.Hide UserForm4.Show vbModeless End Sub 両フォームを閉じるための Private Sub textbox1_afterupdate() Unload UserForm1 Unload UserForm4 End Sub この3つのプロシージャ以外のコードを全て削除しましたが再現しました。 それと補足になるのですが、ユーザーフォーム2にコマンドボタンがあり、そこには Unload UserForm1 Unload UserForm4 の2行のみが記述してあるのですが、コマンドボタンでの動作なら問題なく両フォーム共閉じることが出来ました。 EXCELが強制終了することもありません。
logres_Fan

2023/03/15 05:51

Unloadの2行の順番を入れ替えてみてください。改善されなければ、お役に立てなかったです。すみません。
pe_san

2023/03/15 06:20

Unloadの2行を入れ替えたところ再現しました。 自分では思いつかなかったデバッグ方法は大変勉強になりました。 確かに解決してはいませんが、私にはとてもありがたいコメントでした。 ありがとうございました。
guest

回答1

1

自己解決

根本的な解決ではありませんが、

Application.OnTime Now(), "formclose"

で標準モジュールの別プロシージャで
Unload UserForm1
Unload UserForm4
を実行することで、エラーが再現せずフォームを両方とも閉じることが出来ました。

投稿2023/03/23 00:18

pe_san

総合スコア4

logres_Fan👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.54%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。