こんばんは。
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処理として実装したいです。
モーダル表示だとユーザーフォームに何らかのイベントが発生するまで中断してくれるんですが、モードレスだとうまくいきません。
何かいいアドバイスがありましたら、ご教授お願いします。
モーダル表示にすれば解決する話ですが、モーダル表示でダメな理由はなんですか。
ユーザーフォーム2を開く直前の処理で text2の情報を入力するために必要なエクセルブックを開く処理があります。 workbooks.open 〜.xlsx ユーザーフォーム2.show という感じです。 ユーザーフォーム2をモーダルにすると、このブックが灰色の画面になって見れない状態になってしまいまして。 これが見れれば、モーダルでも大丈夫です。
当方のテストでは再現できませんが、新規作成したブックを開くようにしても、同じ状況がが発生しますか。新規ブックでは発生しないなら、開こうとしているブック側の問題かと思います。
かしこまりました。 明日会社で試してまた報告いたします。 ありがとうございます!
workbooks.openとモーダルフォームの表示の間にDoEvents命令を挟んでみてください。これはOSに一瞬制御を戻す命令で、モーダルフォームで描画系トラブルがでたらこれで解決することがあります。
会社で試してみたところ、新規ブックでもだめでした。 ただ、それぞれのプロシージャの最初にApplication.screenupdatingをfalseにしていたのですが、明示的にそれぞれ最後にtrueを入れたら開きたかったエクセルがきちんと見える形でモーダルのユーザーフォームが開きました。 Do eventsも興味があるので試してみたいと思います。 ありがとうございます。
Application.screenupdatingをfalseにしてるなら、画面更新されないので、当然そうなりますね。
DoEvents のループで待機するのは、コードがずっと実行中になりますので、CPU負荷が大きくなるのでお勧めできません。モーダルがベストの解決法です。

回答2件
あなたの回答
tips
プレビュー