[[20160529151557]] 『VBA 特定のブックが最前面になった場合だけにユー』(Macha) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA 特定のブックが最前面になった場合だけにユーザーフォームを表示させたい』(Macha)

ブックAにユーザーフォームをモードレスで表示させるようにしています。

1.ブックAが表示されている状態で、別のブックBをダブルクリックで開いた場合にはフォームが隠れて、ブックAをアクティブにした場合にはフォームを再度表示させたい。

2.また、ダブルクリックで開いた複数のエクセルブック(ブックAも含む)を最小化した場合に、他のブックを元のサイズに戻した場合にはフォームが表示されず、ブックAを元のサイズに戻した場合にだけフォームが自動で表示されるようにしたい。

上記二つの条件を同時に満たすようにしたいのですが、そのようなことは可能でしょうか。

複数のエクセルブックをダブルクリックで開いて作業することが多いので、ブックAが最前面になった場合のみフォームを自動で表示させたいのです。

フォームを閉じるボタンと再表示させるボタンは実装しますが、なるべくそのボタンでの操作をユーザーにさせず、あくまで自動で表示させるようにしたいのです。

別のブックを開く際、ダブルクリックで開かずに、その都度別のエクセルを立ち上げてから新規で開くという方法もありますが、業務上、都度別のエクセルを立ち上げてから新規で開くという手間を、すべてのユーザーに実践させることができないのが現状です。

環境はWindows7、Excel2010を使用しており、ユーザーも全て同じ環境です。

どなたか良い方法をご教授いただけないでしょうか。
宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 まず、本件、xl2013以降の SDI環境であれば、ふつうにやれば、ユーザーフォームは
 ブックBの後ろに隠れます。逆に、ブックBの前面に出すということになると、(別エクセル自動立ち上げ含み)
 いろいろ、面倒なことをしなければいけません。

 一方、xl2010までのMDI環境では、ユーザーフォームは、常にエクセル区画のすべてのブックの前に表示されます。
 これを別ブックの後ろに表示するのはちょっと大変。

 悩ましいのは、現在 xl2010だとして、それようの制御コードを書いたときに、いずれxl2013 になると
 そんなことは不要というか、もしかしたら不具合が出るかもしれないという問題を潜在的に内包してしまうことでしょうか。

 どちらでも矛盾なく対応する方策を取り入れることが必要ですね。

 思い付きですが、ブックAのThisWorkbookモジュールに、当該エクセル全体のイベントキャッチのコードを書き
 ブックがActivateになったときに、そのブックが自ブックならユーザーフォームをSHow、他ブックなら ユーザーフォームをHide。
 こうしたらいいかもしれません。

 思い付きでいってますので抜けがあるかもしれません。

(β) 2016/05/29(日) 16:25


 ↑ Hide は xl2013 になった時に不都合になりますね。
 Hide ではなく UnLoad が必要ですけど、再表示の時に、前に保持していたユーザーフォームの値がすべて消えてしまうというのは
 具合悪いでしょうね?

 現在のユーザーフォームの制御がどうなっているのかが不明ですが、たとえばXボタン等でユーザーフォームを閉じた。
 もう、金輪際、ユーザーフォームは表示不要なんですが、↑でコメントした思い付きだと、別ブックを前面にだしたとき不具合がでますし
 その不具合を解消したとして、ブックAを表示させたときに(もう必要がないのに)ユーザーフォームが表示されます。

 このあたりを矛盾なく制御することはできると思いますが、現在のユーザーフォームの表示は、どのタイミングで
 どんなコードでやっておられますか?

(β) 2016/05/29(日) 16:48


早々にご回答をいただきありがとうございます。

Excel2013のことまでは考えておりませんでした。今のところ社内端末がアップグレードされる気配はないので、2010に限定していただいて構わないです。

> Hide ではなく UnLoad が必要ですけど、再表示の時に、前に保持していたユーザーフォームの値がすべて消えてしまうというのは具合悪いでしょうね?

おっしゃる通り、UnLoadでは値を保持してくれないので具合が悪いです。

>現在のユーザーフォームの制御がどうなっているのかが不明ですが、たとえばXボタン等でユーザーフォームを閉じた。
>もう、金輪際、ユーザーフォームは表示不要なんですが、↑でコメントした思い付きだと、別ブックを前面にだしたとき不具合がでますし その不具合を解消したとして、ブックAを表示させたときに(もう必要がないのに)ユーザーフォームが表示されます。

ユーザーフォームの×ボタンは非表示にしています。
また、フォームの表示・非表示ボタンは別に実装しているので、基本的にはブックAがアクティブになった場合にはユーザーフォームを必ず表示させたいです。

コードはThisWorkbookに以下のように記述していますが、
うまく動いてくれないので困っています。

Private Sub Workbook_Open()

   KensakuForm.Show 
End Sub

Private Sub Workbook_Deactivate()

   UserForm1.Hide
End Sub

Private Sub Workbook_Activate()

   If ActiveWorkbook.Name = "BookA.xlsm" Then
     UserForm1.Show
   End If
End Sub

以上になりますが、宜しくお願い致します。
(Macha) 2016/05/29(日) 17:47


 それでは xl2010までのバージョン限定ということで。
 ウィンドウのリサイズなども意識していますが、やってみて何か不都合なことがあれば指摘願います。

 ThisWorkbookモジュールを以下に。(一度保存して閉じた後、再度いてください)

 Dim WithEvents xlApp As Application

 Private Sub Workbook_Open()
    Set xlApp = Application
 End Sub

 Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
    If Wb.Name = ThisWorkbook.Name Then
        UserForm1.Show vbModeless
    Else
        UserForm1.Hide
    End If
 End Sub

(β) 2016/05/29(日) 18:02


コードをご提示いただきありがとうございました。

早速試してみたところ、質問ナンバー1については問題なく動作しました。ありがとうございます。

しかし、質問ナンバー2については、他のブックも含めて全て最小化した状態で、他ブックを元のサイズに戻すと、他ブックにユーザーフォームが表示されてしまいます。

また、このとき奇妙な現象が起きました。
ユーザーフォームのタスクがタスクバーに表示されたのです。通常はユーザーフォームのタスクがタスクバーに表示されることはないと思うのですが。
このユーザーフォームのタスクをタスクバーから消すには、他ブックに誤って表示された状態にしてから、その他ブックを最小化しないと、タスクバーから消すことができないようでした。

他ブックを元のサイズに戻した場合には表示されず、ブックAを元のサイズに戻した場合にのみ表示させることは可能でしょうか。 
(Macha) 2016/05/29(日) 18:59


 私はユーザーフォームを多用しています。
 で、同じような症状(特に2016/05/29(日) 18:59のMachaさんのレス)が出ています。
 もう諦めて何年もそのままにしていますが・・・。
 たしにならないレスですみません。
(カリーニン) 2016/05/29(日) 19:35

 なるほど、そうなりますね。
 ただし、こちらの環境、win7+xl2010 2つあって FMVのデスクトップと NEC の Note。
 NEC の Note のみで、発生。かつ、各ブック、最小化の前に、最大化した上で最小化を行うと
 そういった現象にはならないので、ちょっと、本筋のところはわからないのですが試行錯誤で
 ThisWorkbookモジュールに以下を追加してみました。なんとなく、うまく切り抜けているように思われますが
 そちらでは、どうなりますか?

 Private Sub xlApp_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
    If Wb.Name = ThisWorkbook.Name Then
        If Wn.WindowState = xlMinimized Then UserForm1.Hide
    End If
 End Sub

(β) 2016/05/29(日) 21:38


 ↑ ちょっと漏れがありました。

 Private Sub xlApp_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
    If Wb.Name = ThisWorkbook.Name Then
        If Wn.WindowState = xlMinimized Then
            UserForm1.Hide
        Else
            UserForm1.Show vbModeless
        End If
    End If
 End Sub

(β) 2016/05/29(日) 21:42


早々に解決策をご提示いただきありがとうございました。
当方は月・火が休みで、自宅では試す環境がないため、返答が遅くなりまして申し訳ありませんでした。

まず、コードを試してみましたが、こちらの環境では変化はなく、やはり一旦全てのブックを最小化した後に、他のブックを元のサイズに戻すと、他のブックにユーザーフォームが表示されてしまいました。

また、こちらの環境も企業向けのNECのMateを利用しています。最大化した後で最小化しても解消はされませんでした。カリーニン様がどのような環境でご使用になっているかも興味がありますが、NECに限ったことなのでしょうか。。。

(Macha) 2016/06/01(水) 14:45


 コードを提示しているのはカリーニンさんではなくβですけど、そうですかぁ・・
 こちらでは、マクロブックが最小化である限り、どのブックを表示しても、ユーザーフォームは表示されません。

 申し訳ありませんが、これ以上、お役に立てそうにないですねぇ。

 同じ状況を経験されている回答者さんからのアドバイスをお待ちください。

(β) 2016/06/01(水) 16:09


β様。ありがとうございました。

コードを提示していただいているのがβ様ということは十分承知しておりました。
途中で同じ症状とおっしゃっていたカリーニン様の環境も興味があるという意味だったのですが、紛らわしい言い回しで申し訳ありませんでした。

(Macha) 2016/06/01(水) 16:53


 当方NEC Value Star(VW770/K)(Windows Vista)です。
http://kakaku.com/item/00100219400/spec/
(カリーニン) 2016/06/02(木) 20:27

カリーニン様 環境を教えていただき有難うございます。
NEC製ですかぁ… となると、原因はNEC製ということも考えられることになりますね。

NEC以外で試してみたいと思いますが、社員は全員NEC製の同じ機種を利用しているので、結局解決しないことになるのですが。。。
(Macha) 2016/06/03(金) 20:26


ようやく社内の別のPCで試すことができました。
結論から言うと、残念なことに同様の結果になってしまいました。
使用環境はTOSHIBA製Dynabook。Windows7でExcel2010でした。

どなたか、よい解決方法をご教授していただけないでしょうか。
宜しくお願い致します。
(Macha) 2016/06/18(土) 23:21


 そちらの環境では、また、すべったレスになるかもしれませんが。

 ThisWOrkbookモジュールを、以下にリバイスして実行すると、こちらで、操作手順によっては、不具合が発生していた
 NEC Note でも、今のところ、スムーズにいってます。

Dim WithEvents xlApp As Application

Private Sub Workbook_Open()

    Set xlApp = Application
    UserForm1.Show vbModeless
End Sub

Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)

    If Wb.Name = ThisWorkbook.Name Then UserForm1.Show vbModeless
End Sub

Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)

    If Wb.Name = ThisWorkbook.Name Then UserForm1.Hide
End Sub

(β) 2016/06/20(月) 08:50


β様。いつもありがとうございます。

早速試してみましたが、残念ながら改善されませんでした。
リバイス後も全く同様の動きになってしまいました。

Workbook_Openイベントにその他のコードも入っていたので、単純にユーザーフォームとご提示いただいたコードのみのエクセルブックを作って試してみたのですが、同様の結果になってしまいました。

自分なりに調べてみたのですが、エクセル2010の仕様でマルチウィンドウになっているのが原因のように思えます。
エクセル2013以降ではシングルウィンドウがデフォルトになると聞きました。
社員全員のエクセル自体が2013以降にバージョンアップすればうまくいくのかもしれませんが、そのような大規模なバージョンアップはなかなか行われないので、いったいいつになることやら…

β様には度々コードをご提示していただいているにもかかわらず、なかなか上手くいかず申し訳ありません。
(Macha) 2016/06/23(木) 11:37


 >>自分なりに調べてみたのですが、エクセル2010の仕様でマルチウィンドウになっているのが原因のように思えます。 

 はい。何度もコメントしていますが MDI 環境での、ある意味【当たり前】の状況です。
 2010までは、どのブックが前面になろうとも、ユーザーフォームは最前面に表示される、これが【仕様】であって
 それを、今回のテーマのようにしようとすると、いろいろやりくりが必要で、そのやりくりをしても、こちらでは
 うまくいきますが、PC環境によってはうまくいかないんでしょうね。

 >>エクセル2013以降ではシングルウィンドウがデフォルトになると聞きました。

 ディフォルトではなく、それ(SDI)しかないということなんです。
 で、SDIになれば、何もしなくてもお望みの状態になります。(これも、コメント済みだと思いますが)
 ただ、そうなると、 Machaさんはハッピーでしょうけど、ふつうに、どのブックがアクティブであってもユーザーフォームが表示されていた、
 それが、表示されなくなるわけで、それを従来の状態にするために、皆さん、逆に、四苦八苦しています。

(β) 2016/06/23(木) 11:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.