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

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

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

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

Q&A

解決済

2回答

12937閲覧

VBAのモードレスのユーザーフォームでボタンが押されるまで処理を中断したい

Tetsuya3456

総合スコア22

VBA

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

0グッド

0クリップ

投稿2018/07/31 09:06

こんばんは。

VBAのモードレス表示でユーザーフォームのコマンドボタンがクリックされるまで処理を中断する方法はありますでしようか。

ざっくり処理内容をかきますと、

public text1 as string
public text2 as string

sub 処理()

'text1を入力してもらう
ユーザーフォーム1.show

'text1を引数にprocess1を実行
call process1(text1)

'text2を入力してもらう
ユーザーフォーム2.show

'text1、text2を引数にprocess2を実行
call process2(text1,text2)

end sub

という感じです。

それでこれをエクセルのボタンに実装して連続する1処理として実装したいです。

モーダル表示だとユーザーフォームに何らかのイベントが発生するまで中断してくれるんですが、モードレスだとうまくいきません。

何かいいアドバイスがありましたら、ご教授お願いします。

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

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

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

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

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

hatena19

2018/07/31 10:30

モーダル表示にすれば解決する話ですが、モーダル表示でダメな理由はなんですか。
Tetsuya3456

2018/07/31 10:48 編集

ユーザーフォーム2を開く直前の処理で text2の情報を入力するために必要なエクセルブックを開く処理があります。 workbooks.open 〜.xlsx ユーザーフォーム2.show という感じです。 ユーザーフォーム2をモーダルにすると、このブックが灰色の画面になって見れない状態になってしまいまして。 これが見れれば、モーダルでも大丈夫です。
hatena19

2018/07/31 10:58

当方のテストでは再現できませんが、新規作成したブックを開くようにしても、同じ状況がが発生しますか。新規ブックでは発生しないなら、開こうとしているブック側の問題かと思います。
Tetsuya3456

2018/07/31 11:00

かしこまりました。 明日会社で試してまた報告いたします。 ありがとうございます!
thom.jp

2018/08/01 10:22 編集

workbooks.openとモーダルフォームの表示の間にDoEvents命令を挟んでみてください。これはOSに一瞬制御を戻す命令で、モーダルフォームで描画系トラブルがでたらこれで解決することがあります。
Tetsuya3456

2018/08/01 11:27

会社で試してみたところ、新規ブックでもだめでした。 ただ、それぞれのプロシージャの最初にApplication.screenupdatingをfalseにしていたのですが、明示的にそれぞれ最後にtrueを入れたら開きたかったエクセルがきちんと見える形でモーダルのユーザーフォームが開きました。 Do eventsも興味があるので試してみたいと思います。 ありがとうございます。
hatena19

2018/08/01 11:39 編集

Application.screenupdatingをfalseにしてるなら、画面更新されないので、当然そうなりますね。 DoEvents のループで待機するのは、コードがずっと実行中になりますので、CPU負荷が大きくなるのでお勧めできません。モーダルがベストの解決法です。
guest

回答2

0

ベストアンサー

DoEvents のループで待機するのは、コードがずっと実行中になりますので、CPU負荷が大きくなるのでお勧めできません。モーダルにするのがベストの解決法だと思います。(ブックを開く時は、Application.ScreenUpdatingはTrueにして)

Office TANAKA - Excel VBA Tips[CPUの使用率を抑える方法]

どうしてもモードレスにする必要があるなら、
フォームを閉じたときに、次の処理を呼び出すようにします。
例えば、下記のように
VBA - VBAのループ処理途中でシートへ入力したい。(84535)|teratail

投稿2018/08/01 11:51

hatena19

総合スコア33620

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

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

Tetsuya3456

2018/08/01 12:24

回答ありがとうございます。 ご指示頂いたおかげで無事解決いたしました。
guest

0

workbooks.openとモーダルフォームの表示の間にDoEvents命令を挟めばモーダルでもうまくいく気はしますが、以下は一応モードレスフォームで実現するコードです。

vba

1Public text1 As String 2Public text2 As String 3Sub 処理() 4 'text1を入力してもらう 5 ユーザーフォーム1.Show 6 WaitFormClose ユーザーフォーム1 7 8 Call process1(text1) 9 'text2を入力してもらう 10 11 ユーザーフォーム2.Show 12 WaitFormClose ユーザーフォーム2 13 14 'text1、text2を引数にprocess2を実行 15 Call process2(text1, text2) 16End Sub 17 18Sub WaitFormClose(f As Object) 19 Do While f.Visible 20 DoEvents 21 Loop 22End Sub

投稿2018/08/01 10:40

thom.jp

総合スコア686

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

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

Tetsuya3456

2018/08/01 11:29

回答ありがとうございます。 いずれ、要望があればモードレス表示も検討する必要があるので参考にさせて頂きます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問