Excel (VBA)

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

 
(Windows 10 Home : Excel 2016)
UserForm vbModeless時の挙動
投稿日時: 21/11/27 09:20:41
投稿者: variablevalve

以下のようなコーどを作成し、ユーザーフォームに動的にコントロールを配置してみました。
ですが、UserForm1.Show の場合はCheckBoxのイベントが有効になりますが、
UserForm1.Show vbModelessの場合はイベントが有効になりません。
どこか間違っているのでしょうか?仕様でしょうか?
 
標準モジュール
Sub test()
    Dim objTmpCheck As MSForms.CheckBox
    Dim objTmpCombo As MSForms.ComboBox
    Dim objCheck As CheckEvent
    Dim objCombo As ComboEvent
     
    Set objTmpCheck = UserForm1.Controls.Add("Forms.CheckBox.1", , True)
    With objTmpCheck
        .Caption = objTmpCheck.Name
        .Top = 10
    End With
    Set objCheck = New CheckEvent
    Set objCheck.SetCheckBox = objTmpCheck
     
    Set objTmpCombo = UserForm1.Controls.Add("Forms.ComboBox.1", , True)
    With objTmpCombo
        .Top = 10
        .Left = 100
        .AddItem "123"
        .AddItem "456"
        .Enabled = False
    End With
    Set objCombo = New ComboEvent
    Set objCombo.setComboBox = objTmpCombo
     
    UserForm1.Show vbModeless
End Sub
 
クラスモジュール(CheckEvent)
Public WithEvents xCheckBox As MSForms.CheckBox
Property Set SetCheckBox(ByRef fCheckbox As MSForms.CheckBox)
    Set xCheckBox = fCheckbox
End Property
Private Sub xCheckBox_Click()
     
    Dim intCheckNum As Integer
     
    intCheckNum = Right(xCheckBox.Name, 1)
     
    If xCheckBox.Value = True Then
        UserForm1.Controls("ComboBox" & intCheckNum).Enabled = True
    Else
        UserForm1.Controls("ComboBox" & intCheckNum).Enabled = False
    End If
End Sub
 
クラスモジュール(ComboEvent)
Public WithEvents xComboBox As MSForms.ComboBox
Property Set setComboBox(ByRef fComboBox As MSForms.ComboBox)
    Set xComboBox = fComboBox
End Property

回答
投稿日時: 21/11/27 16:11:55
投稿者: WinArrow
投稿者のウェブサイトに移動

vbModeless
に関係するのか、わかりませんが、
 
チェックボックスとコンボボックスの設置順序が逆なのでは?
 
SetCheckBoxのなかでコンボボックスを参照しているが、
この時点でコンボボックスは配置されていませんよね?

投稿日時: 21/11/27 21:36:22
投稿者: variablevalve

WinArrowさん
 
ありがとうございます。
設置順序を逆にしてみましたが、やはりvbModelessがあると有効にならないようです。

投稿日時: 21/11/27 21:58:11
投稿者: variablevalve

先の投稿の表示がおかしかったので再投稿です。
WinArrowさん
ありがとうございます。
設置順序を逆にしてみましたが、やはりvbModelessがあると有効にならないようです。

回答
投稿日時: 21/11/27 22:24:54
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
UserForm1.Show の場合はCheckBoxのイベントが有効になりますが、
UserForm1.Show vbModelessの場合はイベントが有効になりません。

 
イベントガ有効にならない
とは、どのような状態になっているのでしょう?
 
若しかして、「コンボぼクスのドロップダウンができない」ことなのかな?
 
そうだとすると
こちらでテストした結果、
>vbModeless に関係なく、
「コンボぼクスのドロップダウンができない」です。
 
> .Enabled = False
が、原因と思います。
ステップ実行して確認してください。
 
※チェックボックスは名前を設定していますが、
コンボボックスは、名前は不要なんですか?

回答
投稿日時: 21/11/27 22:26:12
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
UserForm1.Show の場合はCheckBoxのイベントが有効になりますが、
UserForm1.Show vbModelessの場合はイベントが有効になりません。

 
イベントガ有効にならない
とは、どのような状態になっているのでしょう?
 
若しかして、「コンボボックスのドロップダウンができない」ことなのかな?
 
そうだとすると
こちらでテストした結果、
>vbModeless に関係なく、
「コンボボックスのドロップダウンができない」です。
 
> .Enabled = False
が、原因と思います。
ステップ実行して確認してください。
 
※チェックボックスは名前を設定していますが、
コンボボックスは、名前は不要なんですか?

回答
投稿日時: 21/11/28 06:21:52
投稿者: simple

Dim objCheck As CheckEvent
Dim objCombo As ComboEvent
をモジュールベースの変数に変更すればどうですか?
モードレスだとtestの終了とともに、それらの変数のLifeTimeが尽きてしまうからでは?

投稿日時: 21/11/28 08:40:43
投稿者: variablevalve

WinArrowさん
ありがとうございます。
 
表現がよくありませんでした。
「イベントが有効にならない」→「コンボボックスのドロップダウンができない」
でした。
ご指摘いただいた箇所も確かに記述ミスでした。
 
simpleさん
ありがとうございます。
 
ご指摘通り、修正しましたところ意図した動作になりました。
LifeTimeが尽きてしまうところまで気が回っておりませんでした。
 
お二方ともありがとうございます。
お二人の洞察力にはいつも感心いたします。