Excel VBA質問箱 IV

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

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


2423 / 13645 ツリー ←次へ | 前へ→

【68106】UserForm.Hide→Show後の処理 ボビー 11/2/2(水) 17:28 質問[未読]
【68108】Re:UserForm.Hide→Show後の処理 ichinose 11/2/2(水) 21:16 発言[未読]
【68109】Re:UserForm.Hide→Show後の処理 ichinose 11/2/2(水) 21:26 発言[未読]
【68110】Re:訂正 ichinose 11/2/2(水) 21:33 発言[未読]
【68121】Re:訂正 ボビー 11/2/3(木) 11:39 お礼[未読]

【68106】UserForm.Hide→Show後の処理
質問  ボビー  - 11/2/2(水) 17:28 -

引用なし
パスワード
   タイトルが判りづらくて申し訳ありません。

Private Sub CommandButton1_Click()
  On Error Resume Next

  UserForm1.Hide

  If MsgBox("xxxxは以下で良いですか?", vbYesNo) = vbNo Then
    UserForm1.Show
  End If

  If ComboBox6.Value <> "XXX" Then
    GoTo Exit
  end if
※UserForm1には、CommandButton1(OK)とCommandButton2(キャンセル)が
 存在します。


上記のように、一度UserFormを隠してから確認のMsgBoxをだして
処理を行っているのですが、再表示(UserForm1.Show)した時の処理で、
[OK]ボタン・[キャンセル]ボタンどちらを押しても、後続のロジックを
走ってしまいます。
再表示後にCommandButton1(OK)とCommandButton2(キャンセル)を
見分ける方法をお教えて下さい。

宜しくお願いします。

【68108】Re:UserForm.Hide→Show後の処理
発言  ichinose  - 11/2/2(水) 21:16 -

引用なし
パスワード
   こんばんは。
簡単に再現方法

新規ブックにて ユーザーフォームを一つ作成してください(UserForm1)。
このUserForm1にコマンドボタンを二つ配置してください。
   CommandButton1  ----本当にUserForm1を非表示にしてよいか確認する
   CommandButton2  -----確認なしにUserForm1を非表示にする

このUserForm1のモジュールには、

Option Explicit
'=========================================================
Private Sub CommandButton1_Click()
  Me.Hide
  If MsgBox("本当に終了しますか", vbYesNo) = vbNo Then
    Me.Show
  End If
  MsgBox "終了します"
End Sub
'=========================================================
Private Sub CommandButton2_Click()
  Me.Hide
End Sub


標準モジュールに

'========================================================
Option Explicit
Sub test1()
  UserForm1.Show
End Sub


再現手順

標準モジュールのtest1を実行してください。UserForm1が表示されます。

CommandButton1をクリックしてください。
一度、UserForm1が非表示になり、「本当に終了しますか」という確認メッセージが
表示されますので、「いいえ」をクリックしてください。
すると、再度UserForm1が表示されます。

ここで、今度は、CommandButton2をクリックしてください。
すると、不思議なことに「終了します」という
CommandButton2_Click()には、記述していないメッセージが表示されて
プログラムが終了します。


という現象ですよね?

これ、CommandButton2をクリック時のコードも記述しないと
どんな現象なのか再現できない可能性もありますね!!

これは、CommandButton1_Clickで記述している

Me.Show(UserForm1.Showでも同じ)、
これ正確には、

Call me.show

と記述しているのと同じです。
つまり、他のプロシジャーを呼び出していることになります。

当然、呼び出されたプロシジャーが終了すれば、
この
Call me.show の後に記述されているコードが実行されることになります。

呼び出されたプロシジャーが終了 のきっかけになるのが

Private Sub CommandButton2_Click()
  Me.Hide
End Sub

にあたります。

非表示まま、イベントプロシジャーが終了しますから、
呼び出し元に制御が戻ります。

次投稿に続く

【68109】Re:UserForm.Hide→Show後の処理
発言  ichinose  - 11/2/2(水) 21:26 -

引用なし
パスワード
   >新規ブックにて ユーザーフォームを一つ作成してください(UserForm1)。
>このUserForm1にコマンドボタンを二つ配置してください。
>   CommandButton1  ----本当にUserForm1を非表示にしてよいか確認する
>   CommandButton2  -----確認なしにUserForm1を非表示にする
>
>このUserForm1のモジュールには、
Option Explicit
'=============================================
Public Disp_sw As Boolean
'=============================================
Private Sub CommandButton1_Click()
  Me.Hide
  If MsgBox("本当に終了しますか", vbYesNo) = vbNo Then
    Disp_sw = True
  End If
  If Disp_sw = False Then MsgBox "終了します"
End Sub
'=============================================
Private Sub CommandButton2_Click()
  Me.Hide
End Sub
'=============================================
Private Sub UserForm_Activate()
  Disp_sw = False
End Sub

>
>標準モジュールに
>
'========================================================
Sub test1()
  UserForm1.Disp_sw = True
  Do While UserForm1.Disp_sw = True
    UserForm1.Show
  Loop
  Unload UserForm1
End Sub

これで試してください。
確認できたら、本来問題にしているコードに応用してください。

【68110】Re:訂正
発言  ichinose  - 11/2/2(水) 21:33 -

引用なし
パスワード
   >非表示まま、イベントプロシジャーが終了しますから、
非表示のまま
>
>次投稿に続く

【68121】Re:訂正
お礼  ボビー  - 11/2/3(木) 11:39 -

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

提示して頂いたサンプルにて結果はスグに確認できましたが、
各処理(命令)で何をしてるのか理解するのに時間が掛り返信が
遅れましたが何とか問題解決しました。
ただ単に隠しているだけだと思っていたのですが…
結果を得るだけでなく処理の意味も理解(完全ではありませんが…)
できた事が非常にプラスになりました。
ありがとうございました。

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