Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4763 / 13646 ツリー ←次へ | 前へ→

【54590】ユーザフォームのCheckBox1にチェックが付かない Mari 08/3/22(土) 17:22 質問[未読]
【54591】Re:ユーザフォームのCheckBox1にチェックが... ichinose 08/3/22(土) 17:56 発言[未読]
【54593】Re:ユーザフォームのCheckBox1にチェックが... ichinose 08/3/22(土) 18:44 発言[未読]
【54595】Re:ユーザフォームのCheckBox1にチェックが... Mari 08/3/22(土) 19:50 発言[未読]
【54597】Re:ユーザフォームのCheckBox1にチェックが... ichinose 08/3/22(土) 21:00 発言[未読]
【54594】Re:ユーザフォームのCheckBox1にチェックが... VBWASURETA 08/3/22(土) 18:44 発言[未読]
【54622】Re:ユーザフォームのCheckBox1にチェックが... Masato 08/3/24(月) 20:46 お礼[未読]

【54590】ユーザフォームのCheckBox1にチェックが...
質問  Mari  - 08/3/22(土) 17:22 -

引用なし
パスワード
   UserFormのCheckBoxについてお尋ねします。
CheckBox1〜4まで有るのですが、チェックをつけると即
動作(testAやtestB・・・)をさせています。
動作は順調にするのですが、CheckBox1には何故か、チェックが付かないで
動作します。理由が分からないのですが、どなたかご存知でしたら、
その理由を教えてください。

Private Sub CheckBox1_Click()
  If Controls("CheckBox1").Value = False Then Exit Sub
   Run "testA"
   Controls("CheckBox1").Value = False
End Sub

Private Sub CheckBox2_Click()
  If Controls("CheckBox2").Value = False Then Exit Sub
   Run "testB"
   Controls("CheckBox2").Value = False
End Sub

【54591】Re:ユーザフォームのCheckBox1にチェック...
発言  ichinose  - 08/3/22(土) 17:56 -

引用なし
パスワード
   ▼Mari さん:
こんばんは。

>UserFormのCheckBoxについてお尋ねします。
>CheckBox1〜4まで有るのですが、チェックをつけると即
>動作(testAやtestB・・・)をさせています。
>動作は順調にするのですが、CheckBox1には何故か、チェックが付かないで
>動作します。理由が分からないのですが、どなたかご存知でしたら、
>その理由を教えてください。
>
>Private Sub CheckBox1_Click()
  doevents
>  If Controls("CheckBox1").Value = False Then Exit Sub
>   Run "testA"
>   Controls("CheckBox1").Value = False
>End Sub
>
>Private Sub CheckBox2_Click()
  doevents
>  If Controls("CheckBox2").Value = False Then Exit Sub
>   Run "testB"
>   Controls("CheckBox2").Value = False
>End Sub

こうするとどうでしょうか?

【54593】Re:ユーザフォームのCheckBox1にチェック...
発言  ichinose  - 08/3/22(土) 18:44 -

引用なし
パスワード
   再現手順

新規ブックにユーザーフォーム(UserForm1)を作成してください。

このUserForm1には、チェックボックスを二つ配置します。

 UserForm1−−−−−CheckBox1
           CheckBox2

上記のUserForm1のモジュールには、

'===============================================================
Private Sub CheckBox1_Click()
' DoEvents
  If CheckBox1.Value = False Then Exit Sub
  Call testa
  CheckBox1.Value = False
End Sub
'===============================================================
Private Sub CheckBox2_Click()
  If CheckBox2.Value = False Then Exit Sub
  Call testb
  CheckBox2.Value = False
End Sub
'===============================================================
Sub testa()
  Dim g0 As Long
  Dim g1 As Long
  For g0 = 1 To 10000000
    g1 = g1 + 1
    Next
End Sub
'===============================================================
Sub testb()
  MsgBox "ok1"
End Sub


標準モジュールに
'===============================================================
Sub main()
  UserForm1.Show
End Sub


として、mainを実行し、CheckBox1をクリックしてみてください。
チェックが付かずに処理が終わってしまいます。
(CheckBox2では、普通にチェックが付きますが)
DoEventsを付加すると処理中はチェックが付きます。

このような現象ですか?

Win2000&Excel2002で確認

【54594】Re:ユーザフォームのCheckBox1にチェック...
発言  VBWASURETA  - 08/3/22(土) 18:44 -

引用なし
パスワード
   ▼Mari さん:

こんにちは。

ソースをぱっと見させて頂きました。
で、何故チェックがつかないのかというところですが。


>Private Sub CheckBox1_Click()
>  If Controls("CheckBox1").Value = False Then Exit Sub
>   Run "testA"
>   Controls("CheckBox1").Value = False
>End Sub

この条件だとつきませんよ^^;

チェックボックスが付いてないときは即SubからExit Subで抜けます。
>  If Controls("CheckBox1").Value = False Then Exit Sub

で、チェックボックスが付いているときは

>  If Controls("CheckBox1").Value = False Then Exit Sub
>   Run "testA"
>   Controls("CheckBox1").Value = False

このIfの条件内に入ってチェックボックスを消してますよ。


>
>Private Sub CheckBox2_Click()
>  If Controls("CheckBox2").Value = False Then Exit Sub
>   Run "testB"
>   Controls("CheckBox2").Value = False
>End Sub

【54595】Re:ユーザフォームのCheckBox1にチェック...
発言  Mari  - 08/3/22(土) 19:50 -

引用なし
パスワード
   ▼ichinose さん:

再現テストありがとうございました。
ご指摘の通りです。
コードから考えれば、理屈的にはチェックが瞬時付いているだけと思いますが、
チェック2やチェック3にはチェックが正しく付くのです。
DoEventsも追加しましたが、checkの印が付く時間が極めて短く認識できないのでは・・・と判断しています。
でも再現テストでははっきりと確認できました。ありがとうございました。

ただ、チェックの印が2以降は残るのに、何故チェック1は残らないか・・・っと思い、質問しました。

OptionButtonでやれば何ら問題は無いのですが、チェックボックであえて作成したものですので、この現象は?何か?なぁっと思いました。

【54597】Re:ユーザフォームのCheckBox1にチェック...
発言  ichinose  - 08/3/22(土) 21:00 -

引用なし
パスワード
   ▼Mari さん:
>再現テストありがとうございました。
>ご指摘の通りです。
私は、再現手順書は、本来は質問者が記述すべきことだと
常々思っています。


>コードから考えれば、理屈的にはチェックが瞬時付いているだけと思いますが、
>チェック2やチェック3にはチェックが正しく付くのです。

CheckBox2のイベントにCheckBox1とまるっきり同じコードを記述して試してみてください。

CheckBox2でも同じようにチェックが付かない現象になりませんか?

だとしたら、

イベントプロシジャーに記述しているコードが原因と言うことになります。

つまり、testAやtestBのコードまで調べる必要があるということですよね?


>DoEventsも追加しましたが、checkの印が付く時間が極めて短く認識できないのでは・・・と判断しています。

↑これが本当なら、仕様を見直すべきだと思いますよ!!

>ただ、チェックの印が2以降は残るのに、何故チェック1は残らないか・・・っと思い、質問しました。

Doeventsは、OSに制御を移す機能を持つのですよね?

「チェックの印が2以降は残る」は、コードにヒントがあるのではないですか?

Msgboxを使えば、OSに制御が移りますから、チェックが入っているように見えますよね!!

これと同じように制御をOSに移しているようなコードが実行されていませんか?
(オブジェクトのプロパティやメソッドなんて、中のコードを見ていないのですから、
要注意ですよ)

再度、調べてみてください。

【54622】Re:ユーザフォームのCheckBox1にチェック...
お礼  Masato  - 08/3/24(月) 20:46 -

引用なし
パスワード
   ▼VBWASURETA さん:
ご指摘ありがとうございます。
>この条件だとつきませんよ^^;
>チェックボックスが付いてないときは即SubからExit Subで抜けます
理解しました。ありがとうございました。
コードをまた考え直します。

4763 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free