Excel VBA質問箱 IV

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

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


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

【26891】他ブックが閉じられたことを知る方法 05/7/22(金) 17:26 質問[未読]
【26892】Re:他ブックが閉じられたことを知る方法 ichinose 05/7/22(金) 17:34 発言[未読]
【26895】Re:他ブックが閉じられたことを知る方法 05/7/22(金) 19:41 質問[未読]
【26896】Re:他ブックが閉じられたことを知る方法 1 ichinose 05/7/22(金) 21:02 発言[未読]
【26897】Re:他ブックが閉じられたことを知る方法 2 ichinose 05/7/22(金) 21:20 発言[未読]
【26904】Re:他ブックが閉じられたことを知る方法... 05/7/22(金) 23:13 お礼[未読]

【26891】他ブックが閉じられたことを知る方法
質問    - 05/7/22(金) 17:26 -

引用なし
パスワード
   いま作っているツールは、
今後、機能を増やしていくことを考え、

 メニュー用のブック(共通の処理をここに記述)
 各機能ごとのブック(メニュー用のブックへ参照を設定する)

とういう構成にしています。

しかし、
各機能ごとのブックのBefore_Closeイベントの中でメニュー用のブックのフォームを表示しても、
各機能ごとのブックが閉じられるときにフォームも閉じてしまい困っています。

他のブックが閉じられたことを知る方法はないのでしょうか?

【26892】Re:他ブックが閉じられたことを知る方法
発言  ichinose  - 05/7/22(金) 17:34 -

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

>いま作っているツールは、
>今後、機能を増やしていくことを考え、
>
> メニュー用のブック(共通の処理をここに記述)
> 各機能ごとのブック(メニュー用のブックへ参照を設定する)
>
>とういう構成にしています。
>
>しかし、
>各機能ごとのブックのBefore_Closeイベントの中でメニュー用のブックのフォームを表示しても、
>各機能ごとのブックが閉じられるときにフォームも閉じてしまい困っています。
>
>他のブックが閉じられたことを知る方法はないのでしょうか?

何となく、現象は想像できますけど・・・・、
簡単な再現コードを提示してください。
でないと、こういうコードを記述すると
こういう不具合がでるんだ ということがはっきりしません。

よろしくお願いします。

【26895】Re:他ブックが閉じられたことを知る方法
質問    - 05/7/22(金) 19:41 -

引用なし
パスワード
   ▼ichinose さん:
レスありがとうございます!
質問がわかりづらくてすいませんでした。

具体的に言うと、
1)まず、各機能でクリティカルエラーが発生した場合に自分自身を引数にして、
 共通機能のHandleCriticalErrorを呼びます。

2)HandleCriticalErrorは、エラーをダイアログで表示して、
 渡されたブックを閉じます。

3)各機能のブックにあるbefore_closeイベントの中で、
 showMenuを呼んでメニューを表示するのですが、
 各機能のブックが閉じられると同時になぜかメニューも閉じられてしまいます

以下がコードです。

--------メニュー用のブック---------
    Public Sub ShowMenu()
      frmMenu.Show 0
    End Sub

    Public Sub HandleCriticalError(ByRef wrkErrorSource As Workbook)
      MsgBox "Error!", vbCritical
      wrkErrorSource.Close False
    End Sub

-------各機能用のブック------------
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      ShowMenu
    End Sub

    'エラー処理
    On Error Goto Err
        処理
    Err:
      call HandleCriticalError(ThisWorkBook)

これを解決するためにも
各機能のブックが閉じられた後で、メニューを表示するようにしたいのですが、
何かいい方法はありませんか?

【26896】Re:他ブックが閉じられたことを知る方法...
発言  ichinose  - 05/7/22(金) 21:02 -

引用なし
パスワード
   ▼故 さん:
正直に申し上げますと、まだわかりません。
故 さんが提示されたコードでは私が私の環境で再現ができません。

以下のような手順で二つのブックを作成し、
同じフォルダに保存してください。

一つ目のブック
 ブック名---- menubk.xls
  ユーザーフォーム ---Userform1
     Userform1には、
       コントロールは、コマンドボタン一つ(Commandbutton1)

     標準モジュールに

'============================================================
Sub main()
  UserForm1.Show vbModeless
End Sub


     Userform1のモジュールには

'============================================================
Private Sub CommandButton1_Click()
  Me.Hide
  Workbooks.Open ThisWorkbook.Path & "\item1bk.xls"
  
End Sub

尚、このmenubk.xlsのプロジェクト名はmenuprojectに
変更してから保存してください。


二つ目のブック
 ブック名---- item1bk.xls
  ユーザーフォーム ---Userform2
     Userform2には、
       コントロールは、コマンドボタン一つ(Commandbutton1)
 尚、menuprojectに参照設定する事。

 Thisworkbookのモジュールに

'================================================
Private Sub Workbook_Open()
  UserForm2.Show
End Sub

 Userform2のモジュールに

'==========================================================
Private Sub CommandButton1_Click()
  Me.Hide
  Call main
  ThisWorkbook.Close False
End Sub


上記の設定で二つのブックを作成してください。
作成後、一度二つのブックを閉じた後、

・menubk.Xlsのみを開いてmainを実行してください。

・Userform1が表示されます。ボタンをクリックして下さい。

・item1bk.xlsのユーザーフォームが表示されます。

・ボタンをクリックして下さい。

・menubk.xlsのフォームに戻ったとたんにフォームが消えてしまいます。


このような現象ですね?

確認してください。

【26897】Re:他ブックが閉じられたことを知る方法...
発言  ichinose  - 05/7/22(金) 21:20 -

引用なし
パスワード
   前回のような不具合が起きないように
コードを変更します。


>
>一つ目のブック
> ブック名---- menubk.xls
>  ユーザーフォーム ---Userform1
>     Userform1には、
>       コントロールは、コマンドボタン一つ(Commandbutton1)
>
>     標準モジュールに
>
>'============================================================
>Sub main()
>  UserForm1.Show vbModeless
>End Sub
>
>
>     Userform1のモジュールには
>
>'============================================================
Private Sub CommandButton1_Click()
  Me.Hide
  Set bk = Workbooks.Open(ThisWorkbook.Path & "\item1bk.xls")
  Application.Run "item1bk.xls!frmshow"
  bk.Close False
  Me.Show
End Sub
>
>尚、このmenubk.xlsのプロジェクト名はmenuprojectに
>変更してから保存してください。
>
>
>二つ目のブック
> ブック名---- item1bk.xls
>  ユーザーフォーム ---Userform2
>     Userform2には、
>       コントロールは、コマンドボタン一つ(Commandbutton1)
> 尚、menuprojectに参照設定する事。
 Thisworkbookのモジュールに

'================================================
Private Sub Workbook_Open()
  UserForm2.Show
End Sub
↑は、削除

代わりに
 標準モジュールに
>
>'================================================
Sub frmshow()
  UserForm2.Show
End Sub

>
> Userform2のモジュールに
>
>'==========================================================
Private Sub CommandButton1_Click()
  Unload Me
  
End Sub

>
>
>上記の設定で二つのブックを作成してください。
>作成後、一度二つのブックを閉じた後、
>
>・menubk.Xlsのみを開いてmainを実行してください。
>
>・Userform1が表示されます。ボタンをクリックして下さい。
>
>・item1bk.xlsのユーザーフォームが表示されます。
>
>・ボタンをクリックして下さい。
>
>・menubk.xlsのフォームに戻ったとたんにフォームが消えてしまいます。
 今度は表示されます。

違いを検討してみて下さい。

【26904】Re:他ブックが閉じられたことを知る方法...
お礼    - 05/7/22(金) 23:13 -

引用なし
パスワード
   ▼ichinose さん:
たびたびありがとうございます!

【26896】Re:他ブックが閉じられたことを知る方法 1 
確認しました。
まさにその通りの現象です

【26897】Re:他ブックが閉じられたことを知る方法 2 
なるほど
別ブックのフォームをモーダルで表示すれば同等のことができるわけですね
別ブックを開いた後、シートをつかって情報を入力しようと考えていたのですが、
フォームでやるという手もありということか・・・

うん、ちょっと検討してみます
ありがとうございました^^

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