Excel VBA質問箱 IV

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

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


20344 / 76735 ←次へ | 前へ→

【61812】Re:ModelessなUserFormが消えてしまいます
発言  ichinose  - 09/6/6(土) 7:38 -

引用なし
パスワード
   おはようございます。
ActiveXControlの作成・削除(貼付けも含む)ことによる
データ初期化のタイミングの問題だと思いますよ!!

新規ブックの標準モジュールにて

'================================================
Private a As Long
Sub main()
  a = 15
  ActiveSheet.OLEObjects.Add _
       ClassType:="Forms.CommandButton.1", Link:=False, _
       DisplayAsIcon:=False, Left:=[a1].Left, _
       Top:=[a1].Top, Width:=[a1].Width, _
       Height:=[a1].Height
  MsgBox a
  'ActiveXControlが作成された直後、変数aの値は、ちゃんと設定値を保持している
  Application.OnTime Now(), "subproc"
End Sub
'======================================================================
Sub subproc()
  MsgBox a
  'Ontimeメソッドによって、起動されたSubprocでは変数aは、0 初期化されている
End Sub

上記のmainを実行すると
ActiveXControlを動的に作成したmainのプロシジャーが終了するまでは、
変数aの値は保持されています。
が、mainのプロシジャーが終了してOntimeメソッドにより直ちに実行されたSubprocでは、既に変数aの値は、初期化されています。
Ontimeメソッドの実行は、

Private a As Long
Sub main()
  a = 15
  ActiveSheet.OLEObjects.Add _
       ClassType:="Forms.CommandButton.1", Link:=False, _
       DisplayAsIcon:=False, Left:=[a1].Left, _
       Top:=[a1].Top, Width:=[a1].Width, _
       Height:=[a1].Height
  MsgBox a
End Sub
Sub subproc()
  MsgBox a
End Sub

上記のmainを実行した直後に手動操作でsubprocを実行することと同じです。

つまり、デザインモードになる
(正確には、三角定規のアイコンをクリックし、デザインモードにしてから、再度
三角定規のアイコンをクリックし、デザインモードを終了するという
操作を行った効果)のは、
ActiveXControlの作成・削除(貼付けも含む)を行った
プロシジャーの実行が終了した時点で発生する ということです。


よって、うにボンバーさん事例に戻すと

モーダルモードでは、

>いくらでもCopy & Paste出来てしまう

のは、モーダルモードでは、
コマンドボタンクリックする時点では、
プログラムの制御は、Showメソッドのラインで止まったままです。

sub main()
  userform1.show
ens sub

つまり、
ActiveXControlの作成・削除(貼付けも含む)を行った
プロシジャーの実行が終了していません。

つまり、ボタンクリックという操作の時点では、まだmainは終了していないのです。

よって、コピー&ペーストが可能になります。

デザインモードになっていないのですから・・・。


これが、モーダレスモードでユーザーフォームを表示させると、

sub main()
  userform1.show Vbmodeless
end sub

mainの実行が終了してから、コマンドボタンクリックされる
という流れになります。
既にmainプロシジャーの実行が終了した時点で
ActiveXControlの作成・削除(貼付けも含む)を行いますから、
CommandButton1_Click()の実行が終了して時点で
デザインモードになりますから、ユーザーフォームが消えてしまいます。

又、

Private Sub CommandButton1_Click()
 Sheet1.CheckBox1.Copy
 Sheet1.Paste Sheet1.Range("C4")
 UserForm1.Show vbModal
End Sub

これに関しては、
ActiveXControlの作成・削除を行ったCommandButton1_Clickが
未だ終了していない時点での

UserForm1.Show vbModal

ですから、

「フォームは既に表示されているので・・・」

のエラーが発生するのです。


以上ですが、デザインモードなる時期(タイミング)の問題だと思います

0 hits

【61806】ModelessなUserFormが消えてしまいます うにボンバー 09/6/5(金) 17:00 質問
【61807】Re:ModelessなUserFormが消えてしまいます もも 09/6/5(金) 17:53 発言
【61810】Re:ModelessなUserFormが消えてしまいます ichinose 09/6/5(金) 20:46 発言
【61811】Re:ModelessなUserFormが消えてしまいます うにボンバー 09/6/6(土) 0:39 発言
【61812】Re:ModelessなUserFormが消えてしまいます ichinose 09/6/6(土) 7:38 発言
【61815】Re:ModelessなUserFormが消えてしまいます うにボンバー 09/6/6(土) 10:03 お礼
【61822】Re:ModelessなUserFormが消えてしまいます もも 09/6/8(月) 8:51 お礼
【61813】Re:ModelessなUserFormが消えてしまいます Yuki 09/6/6(土) 9:39 発言
【61814】Re:ModelessなUserFormが消えてしまいます Yuki 09/6/6(土) 9:56 発言
【61816】Re:ModelessなUserFormが消えてしまいます うにボンバー 09/6/6(土) 10:11 お礼

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