Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
vbModeless の動作について
投稿日時: 20/12/31 17:47:23
投稿者: manatsu

メインのプロシージャの処理の途中で UserFrom1 を呼び出し、そこで Boolean 型の変数の設定して、 メインにもどってから変数を判定、True なら続行、False なら抜ける、というプロシージャを書きました。
UserForm1 を vbModeless にしなければ一応意図したとおり動くようです。
vbModeless にすると、UserForm1 が表示されたのちもメインが中断されず最後まで実行されてしまうようです。なぜこうなるのでしょうか? またこれを避ける方法はありますでしょうか?
よろしくお願いします。
(UserForm1 に2つの CommandButton、cmdContinue, cmdEnd を配置しました。)
Module1
---
Option Explicit
Public flg As Boolean
Sub Main()
    Debug.Print "Process1"
    UserForm1.Show
    'UserForm1.Show vbModeless '←●これがだめ
    If flg = False Then Exit Sub
    Debug.Print "Process2"
End Sub
---
 
Useform1
---
Private Sub cmdContinue_Click()
    flg = True
    Unload Me
End Sub
 
Private Sub cmdEnd_Click()
    flg = False
    Unload Me
End Sub
---

回答
投稿日時: 20/12/31 20:35:57
投稿者: WinArrow
投稿者のウェブサイトに移動

>vbModeless
を指定しなかった場合
ユーザーフォームを開いている間は、
シートを操作(セルに値を入力するなど)できません。
  
 >vbModeless
は、ユーザーフォームを開いている間でも、シートを操作したい場合に指定します。
  
掲示のような処理を考えているのでしたら、
vbModeless
を指定してはいけません。
  
 

投稿日時: 20/12/31 23:41:30
投稿者: manatsu

WinArrow 様
大晦日にもかかわらずありがとうございます。
もっぱら極私的な Tool を 趣味的につくっている初心者です。 UserForm が好きで多用してます。で、なんの考えもなしに Show のあとには必ず vbModeless を付けてました。実行中に Worksheet をいじれるのは便利だからと思って。今回の場合、Worksheet を操作する必要はまったくありません。はずします。
今後ともよろしくご指導お願いいたします。

回答
投稿日時: 21/01/01 00:31:23
投稿者: たらのり

こんばんは
 
# のんびり書いているうちに年が明けてしまいましたw
 
UserForm1.Show や,引数を省略せずに
UserForm1.Show vbModal とすると,
表示されたユーザーフォームを Unload するなどして
閉じてしまうまで呼び出し側(今回のケースでは Main)へ
制御が戻りません。
テストなどで体験されたと思いますが,ボタンを押下して
フォームが消去されるまで呼び出し側の処理は止まります。
この間,シートなどへの操作もできなくなると思います。
 
一方,UserForm1.Show vbModeless とした場合,
UserForm1 を表示すると直ちに呼び出し側へ制御が
戻ってしまい,(Main 側の)後続の処理へ進んでしまいます。
ボタンを押下しても間に合わなかったと思います(フォームの
ボタンの押下で flg へ値を設定することが)。
 
これは仕様なので,使い分けが必要です。
 

投稿日時: 21/01/01 11:25:18
投稿者: manatsu

たらのり様
あけましておめでとうございます。
仕様ということなんですね。
Userform を表示したら、その必要もないのに常に必ず vbModeless にするという癖をやめます。
今後ともよろしくお願いします。