スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手する
↑ポチして頂けると、とても励みになります

EXCEL.EXEを独立したインスタンスとして起動させる設定

ちょっとここ数日の暑さ・・殺人的という表現があうのかも。
良く言われる水分補給、次の点に注意してしっかり補給してくださいね。

1.「喉が渇いた」と感じる前に →感じた時点で既に遅い、です。
水分の吸収は主に小腸・大腸からになりますので体内の浸透圧が変化するには少し時間がかかる→「喉渇いた~」がしばらく続くため短時間にどんどんがぶ飲み→そして実は飲み過ぎ→お腹壊した!の流れに。。。
2.ただの水より浸透圧調整水やスポーツ飲料がベター →汗は水だけで無くミネラルも排出してしまうため、ミネラル補給ができるスポーツドリンクは良いですね。そして、生き物の持つホメオスタシスを利用して吸収速度を高めた浸透圧調整水は急速回復にはもってこいでしょう。


今回はExcelのインスタンスを"ファイル毎に切り離して起動させる"方法の私的メモです。
Excelはスタートメニューから本体を起動すると、それぞれが別のインスタンスで起動します。
しかし、例えばデスクトップに保存した.xlsファイルをダブルクリックすると
これは新規インスタンスでは無く、最初に起動したインスタンスに接続して起動します。
実はこれが弊害となるケースに直面したのでした・・
普通は、右クリックメニューで必要な時に別インスタンスで開くようにすることが多いですが、
今回は拡張子「.XLS」に関連づけられた既定コマンドを書き換えます。経緯はどうでもいいので後述。



OS:Windows XP SP3
環境:Microsoft Office 2000

<.xlsファイルを開いても、常に異なるインスタンスで独立して起動させる>
1.コントロールパネルの「フォルダ オプション」を開く
2.拡張子が「XLS」の項目を選択し、「詳細設定」ボタンをクリック
folderoption.jpg

3.太字の既定コマンド「開く&O」を選択し、「編集」ボタンをクリック
configmaincommand.jpg

4.「アクションを実行するコマンド」の最後を[/e "%1"]に変更
5.「DDEを使う」フレームの「DDEメッセージ」を[]に変更
changemaincommand.jpg

これで、普通にファイルをダブルクリックしても常に新規EXCELで起動します。
independentinstances.jpg

gdgd経緯は下に。

今回の方法は検索すれば同じやり方は沢山紹介されています。

会社に電源を切らないマシンが共用として設置されており、
これを利用して業務管理シートのXLSファイルの自動更新機能を組み込んだファイルを
最小化状態で常駐起動させたのですが、何故か不定期に自動更新が止まり、原因も分かりませんでした。
これ、どうやら別の作業者が過去に作られたマクロを使用したExcelファイルで作業中に実行時エラーが発生、
全体マクロの停止状態に巻き込まれていた可能性が高いのです。

マクロを組む時、個人用や単独使用以外を想定する場合はできるだけ
Active~やRange、Selectionといったアクティブなシートを対象にした相対参照は避けるべきです。
これは複数シートを連携して開く際にパソコンの処理速度や、
入力待ちなどのシーンでアクティブブックが切り替わることで予期せぬエラーに繋がるからです。
(特に処理速度は厄介な問題で、.Activateメソッドを使用しても防ぎきれない時があります)
また、エラーが起こる可能性のあるところには可能な限りOn Errorを入れてハンドルして下さい。

今回のように常駐して無人運転させる場合、巻き込み事故で勝手に停止されては困ります。
また、誤ってファイルを閉じられても困るので、
ThisworkbookのBeforeCloseイベントにCancel=Trueの一文を導入しました。
すると、通常の作業をした後のファイルは内側の×ボタンでしか閉じられなくなってしまいました。
Thisworkbookの中に書くことで、外側の×ボタンを押すとこの常駐させたいファイル以外は
全て閉じてくれるという動作を想定したのですが、実際はそういかないようです。
しかし外側の×ボタンと内側の×ボタンで閉じる動作は、VBAから区別する手段がありません・・
そして、何かファイルを開く度に最小化して常駐しているファイルが一瞬表示されるのが鬱陶しい・・
これら3つの懸念事項について一気に解決するためには、
異なるインスタンスで起動することで一般作業用のEXCELとは環境を完全に分離できれば、と考えました。

EXCELは通常動作では、ファイルを開くと最初に起動したインスタンスに接続、その環境下で開かれます。
そこでマクロ内でWorkbooksオブジェクトを使わず、新規にEXCELを独立起動させれば、
呼び出し元とは分離した新規インスタンスで起動させることができます。
ところが起動させた元インスタンスを終了させた後、次に何かファイルを開くと
先程開いた唯一残っているインスタンスに接続され、再び同じトラブルを抱えることになってしまいます。

参考1:Office オートメーション サーバーの GetObject および CreateObject の動作

参考2:Office 製品をスクリプトから使うこと by kanegon

意識的に新規インスタンスで開くように作業すればこのような状況は回避可能ですが、
そもそも共用マシンは様々な人が利用するため、全員にルール化を徹底するのは無理がありました。
今回の方法はレジストリなどをいじるわけでは無く、今まで通り意識せず.XLSファイルをダブルクリックで
開いて作業する時は独立インスタンスで起動します。
一方マクロ内ではWorkbooksオブジェクトを使うことで
連携させているファイルを呼び出し元のインスタンスに接続して開き、これまで通りのコードを利用します。
なお、CreateObjectでEXCELを新規に起動することもできます。

ちょっとしたことでも、毎日、毎回となると面倒になるものです。
コーディングは常に利用者の事を考えて行うよう心懸けましょう。
拍手する
↑ポチして頂けると、とても励みになります

コメントの投稿

非公開コメント

Blog Search Form
Access Counter
since 2009/03/22
thank you for coming to my blog...
World Community Grid
参加中。ランク1万台を脱するのはいつの日か・・
カテゴリ
最新記事
・・新着順に5件表示中・・
コメント
月別アーカイブ
RSSリンクの表示
リンク
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。