none
EXCEL VBA(form)で他のEXCEL bookと並行して作業を行いたいのですが。。 RRS feed

  • 質問

  • EXCELについて質問させてください。

    VBAで複数のFormを遷移させるVBAプログラムを作成しています。

    既にEXCELで別のbookが立ち上がっていると、Formの呼び出しに失敗したり、マクロが稼働している間は他のbookでの作業が出来なくなる為、作成したマクロファイルの実行は、excel.exeを-x付きで実行するショートカットを作成し、プロセスを分けるようにしています。

    この場合、すでに別のbookが立ち上がっている場合は問題ないのですが、このマクロファイルを実行した後にエクスプローラからexcelブックを開くと、動けなくなってしまいます。

    この問題については、

    https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/01/17/cannot-keep-office-process-to-myself/

    を読んで、図3の状態となっていることが理解できているのですが、「重ねての記載となりますが、これらの動作をふまえ、Officeをオートメーションするプログラムを設計する場合は、自ブログラムで起動する Office プロセスがユーザー操作や他のプログラムで起動されるプロセスと統合されても問題ない動作となるようご設計ください。」と記載されている内容が理解できておりません。どのような設計をするべきなのでしょうか。

    マクロファイルは、常に稼働しておいてもいいような状態にしておきたいのですが、他のBookをエクスプローラーから立ち上げて使用することを考えると、その考え自体が間違いなのでしょうか。

    その場合の解決策として、例えばexcelブックを開く場合、ある特的のマクロブックを開いている場合は、そのマクロブックを閉じるように促すような仕組みを作ることは可能なことでしょうか?(すみません、現在のところヒントも思いつかない状態です。もし何かヒントを頂けたら、自分で調査するつもりです。)

    どうぞよろしくお願いいたします。

    2017年2月7日 1:56

回答

  • >例えばexcelブックを開く場合、ある特的のマクロブックを開いている場合は、そのマクロブックを閉じるように促すような仕組みを作ることは可能なことでしょうか?
    Application.NewWorkbook イベントがあるので、新しく開いた Book を残して他を閉じることも、今取り込んでいるから別のプロセスで開いてね とお願いすることも可能だと思います。

    >マクロファイルは、常に稼働しておいてもいいような状態にしておきたいのですが、他の Book をエクスプローラーから立ち上げて使用することを考えると、その考え自体が間違いなのでしょうか。
    少なくとも引用先の推奨する条件は満たしてないかと…

    >複数のFormを遷移させるVBAプログラム
    VBAには UserForm ぐらいしかありませんから、UserForm の事ですよね。
    UserForm は、ダイアログやツールウィンドウに近い物ですから対話や設定が終わったらすぐ閉じるのが真っ当な使い方のような気がします。


    私が気をつけていることを挙げておきます。

    1.長時間処理が戻ってこないプログラムは書かない。
     ・VBAで書くのは原則マクロの延長程度にする。
      やむを得ず処理が長くなる時は、処理中である旨と進捗状況を表示する。

     ・ユーザフォームは、出しっぱなしにはしない。
      やむを得ない場合はプログレスバーなどを使って処理中である旨をユーザにアピールする。

    2.ユーザ以外はクリップボードを操作しない。
     クリップボードはユーザがオペレーションを行う上で大切なものです。

    3.ActiveWindow, ActiveWorkbook 等のActive~を使わない。
     これらもユーザ操作と密接に関わってきます。
     同様に ~.Activate, ~.Select, Selected~ も余程気を付けないとトラブります。
    2017年2月7日 5:33

すべての返信

  • >例えばexcelブックを開く場合、ある特的のマクロブックを開いている場合は、そのマクロブックを閉じるように促すような仕組みを作ることは可能なことでしょうか?
    Application.NewWorkbook イベントがあるので、新しく開いた Book を残して他を閉じることも、今取り込んでいるから別のプロセスで開いてね とお願いすることも可能だと思います。

    >マクロファイルは、常に稼働しておいてもいいような状態にしておきたいのですが、他の Book をエクスプローラーから立ち上げて使用することを考えると、その考え自体が間違いなのでしょうか。
    少なくとも引用先の推奨する条件は満たしてないかと…

    >複数のFormを遷移させるVBAプログラム
    VBAには UserForm ぐらいしかありませんから、UserForm の事ですよね。
    UserForm は、ダイアログやツールウィンドウに近い物ですから対話や設定が終わったらすぐ閉じるのが真っ当な使い方のような気がします。


    私が気をつけていることを挙げておきます。

    1.長時間処理が戻ってこないプログラムは書かない。
     ・VBAで書くのは原則マクロの延長程度にする。
      やむを得ず処理が長くなる時は、処理中である旨と進捗状況を表示する。

     ・ユーザフォームは、出しっぱなしにはしない。
      やむを得ない場合はプログレスバーなどを使って処理中である旨をユーザにアピールする。

    2.ユーザ以外はクリップボードを操作しない。
     クリップボードはユーザがオペレーションを行う上で大切なものです。

    3.ActiveWindow, ActiveWorkbook 等のActive~を使わない。
     これらもユーザ操作と密接に関わってきます。
     同様に ~.Activate, ~.Select, Selected~ も余程気を付けないとトラブります。
    2017年2月7日 5:33
  • 返信が大変遅くなりまして申し訳ございません。

    どうもありがとうございます。

    そもそもの設計の留意点を理解しました。

    Application.NewWorkbook イベントについては、勉強してみます。

    2017年2月18日 12:01