none
ファイルごとにMDI状態とSDI状態を使い分けるための設定のキモは? RRS feed

  • 質問

  • あるVBAプログラム付のエクセルファイル XXXX.xlsm を開発しました。他のPC作業との予期せぬ干渉を避けるために、このVBAプログラムを独立したエクセルプロセスのインスタンス上で動かしたかったので、次のようにしました。

    1. エクセルを /x オプション付きで立ち上げるショートカットを作成し、XXXX.xlsmを開くときにはそこから開くことで、新しいエクセルプロセスが立ち上がるようにした。
    2. VBAWorkbook_open Application.MergeInstances = Falseを設定することによって、後から開く他のエクセルファイルがXXXX.xlsmのエクセルインスタンスを共有しないようにした。 

    この対策をしたのですが、PC環境によって期待通りに動作する場合と動作しない場合が発生し、困っています。すなわち、

    (a) Office2013Windows 7 では、後から開く他のエクセルファイルが
      
    XXXX.xlsm とエクセルインスタンスを共有して開いてしまう。

    (b) Office2016Windows 10では、期待通り、後から開く他のエクセルファイルは、
      
    XXXX.xlsm のエクセルインスタンスを避けて、新しいエクセルプロセスが

      立ち上がって開くか、別のエクセルプロセスを共有してSDIの状態で開く。

     

    運用上、暫定的にすべてのエクセルファイルを独立したエクセルインスタンス上で動かすようにしています。しかし、この方法では、SDIを前提にしたエクセルファイル群で一部の機能が正常に動かないという別の問題が発生してしまいます。結局、ファイルごとにMDI状態とSDI状態を意図したように使い分けるという手段が必要になっております。今の自分の知識では、そのための設定のキモが理解できません。

     

    質問としては、次の2点です。

    • Office2013Windows 7の環境でも、期待通り上記(b)のような動作を実現することは可能でしょうか?
    • もし、不可能だとしたら、何か別の方策はあるでしょうか?

     

    諸先輩のお知恵をお貸し頂ければ非常に助かります。

     


    • 編集済み RioMedio 2018年7月29日 5:45
    2018年7月29日 5:40

すべての返信

  • Excel2007 の例ですが、

    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    Dim Name1   As String
        If Wb Is ThisWorkbook Then Exit Sub
        App.EnableEvents = False
        Name1 = Wb.FullName
        Wb.Close SaveChanges:=False
        With New Excel.Application
            .Workbooks.Open Name1
            .Visible = True
            .UserControl = True
        End With
        App.EnableEvents = True
    End Sub

    なんてことをやってます。

    2018年7月29日 13:28
  • よろずやさん、ご回答ありがとうございます。
     
    コードを拝見し、なるほどと思いました。全てのファイルが

    別プロセスで走りました。Applicationイベントは馴染みがなかったので、
    勉強してみます。

    ファイルによってエクセルプロセスを共有するかしないかを自由に設定するのが
    今回の目標ですので、それは未達です。よろずさんに教えてもらったことは
    ヒントになりました。

    引き続きファイルによってSDIとMDIを選べる方法について、皆様からのアドバイスを
    頂ければうれしいです。
     

    2018年7月30日 3:28