Excel (VBA)

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

 
(Windows XP全般 : Excel 2003)
Application.EnableEvents = Falseについての疑問
投稿日時: 20/02/03 12:16:51
投稿者: 富山の初心者

お願いします。
以下のコーディングがあります。
----------------------------------
標準モジュールに

Sub テスト()
    sampleForm.Show
End Sub

フォームには、オブッジェクト名sampleFormを配置し、
2ケのチェックボックスがあります
CheckBox1
CheckBox2
 
フォームにモジュールに
'
'---------------------------------------
'フォーム初期化
'---------------------------------------
Private Sub UserForm_Initialize()
    
    CheckBox1.Caption = "18歳以上"
    CheckBox1.Value = False
    CheckBox2.Caption = "男子"
    CheckBox2.Value = False
    CheckBox2.Enabled = False

    Application.EnableEvents = False
End Sub
'
'---------------------------------------
'チェックボックスのCHANGEイベントに対応
'---------------------------------------
Private Sub checkBox1_Change()
    Debug.Print Application.EnableEvents
    If CheckBox1.Value = True Then
        CheckBox2.Enabled = True
    Else
        CheckBox2.Enabled = False
    End If
End Sub

この状態でテストを実行し、チェックボックス1をクリック(チェックをつける)と
イミディエイト部分には「False」が表示されます。
ここで、質問です。
Application.EnableEvents = Falseとなっている場合、
Private Sub checkBox1_Changeルーチンには飛ばないハズではないでしょうか?
なぜ、飛んだのですか?
 

回答
投稿日時: 20/02/03 12:56:30
投稿者: mattuwan44

 >Application.EnableEvents = False
 
アプリケーションとはエクセルのことですよね?
ユーザーフォームはエクセルの一部ではないので(おまけで付いてきてるのですが)、
その命令でユーザーフォーム上のコントロールのイベントの抑制はできないかと思います。

回答
投稿日時: 20/02/03 15:14:28
投稿者: WinArrow
投稿者のウェブサイトに移動

OSとExcelを例にすると、ExcelはOSのアプリケーションです。
このように、元になるソフト上で動作する側のソフトを○○のアプリケーションと呼びます。
 
ユーザーフォームなどVBA記述のソフト(EXcelVBA)は、Excelのアプリケーションです。
しかし、VBAの中で「Application」記述は、元となるExcelを意味します。
どんなソフトでも自分をApplicationとは言いません。
ですから、ExcelとExcelVBAは別物と考えた方がよいでしょう。
 
Excel側のイベントといえば、
ブックを開く、閉じる、アクティブにする・・・・・ブックに関するイベント
シートに関するイベント
などです。
 
ユーザーフォーム上のコントロールのイベントを制御するには、
自分で記述するしかないです。

回答
投稿日時: 20/02/03 15:37:57
投稿者: WinArrow
投稿者のウェブサイトに移動

>ユーザーフォーム上のコントロールのイベントを制御するには、
> 自分で記述するしかないです。
 
ここのところをもう少し具体的に
 
A(TextBox1)、B(TextBox2),C(TextBox3)と3つのテキストボックスがあるとして
タブオーダーが、A→B→Cに設定されていたと仮定します。
 
Aの条件によって、Bをスキップしたい場合のコード例
 
Dim Flag As Boolean
 
Private Sub TextBox1_AfterUpdate()
    If Me.TextBox1.Text = "B" Then
        Flag = True
    Else
        Flag = False
    End If
End Sub
 
Private Sub TextBox2_Enter()
    If Flag Then
        Me.TextBox3.SetFocus
    End If
End Sub
 

回答
投稿日時: 20/02/03 17:07:38
投稿者: takesi

実現したい動作はどのようなものなのでしょう
 
CheckBox1クリックされたら困るのでしたら、
前処理終わるまで
CheckBox1.Enabled = False
では困るのでしょうか?

投稿日時: 20/02/04 12:35:49
投稿者: 富山の初心者

mattuwan44
WinArrow 
takesi さま ありがとうございます
 

引用:
ユーザーフォームなどVBA記述のソフト(EXcelVBA)は、Excelのアプリケーションです。
しかし、VBAの中で「Application」記述は、元となるExcelを意味します。
どんなソフトでも自分をApplicationとは言いません。
ですから、ExcelとExcelVBAは別物と考えた方がよいでしょう。

いままで、何気なく「Application.xxx」とつかっていましたが、
「OSのアプリケーション」と「excelのアプリケーション」の
違いを意識していませんでした。
 
引用:
ユーザーフォーム上のコントロールのイベントを制御するには、
自分で記述するしかないです。

わかりました。
ありがとうございました。
解決といたします。