C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: EXCEL プロセス操作方法について


(過去ログ 57 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■31891 / inTopicNo.1)  EXCEL プロセス操作方法について
  
□投稿者/ SSU (1回)-(2009/01/29(Thu) 19:16:15)

分類:[VB.NET/VB2005 以降] 

開発環境 VS2008 VB.NET
Excel 2003
プログラミング経験半年未満

現在、VB側からEXCELファイルを作成、保存処理を行っています。(EXCEL不可視状態)
この処理中に、外部から他のEXCELファイルを起動させると処理中のBookが開いてしまい、
処理が続行できなくなってしまいます。

この状況の回避方法としては、

1、処理中のEXCELファイルにアクセス制限(閲覧拒否か、読み取り専用か…?)を持たせる。
2、VB側からタスクを操作し、新規にプロセスを作成して対応
3、VB側からShell関数等を使って、アプリケーション起動そのものを制限

を考えましたが、イマイチの方法のようで、情報が掴めませんでした。
どれも今後につながる重要な操作なので、

「これは駄目。こうすれば良い」という指摘、よろしくお願いします。


引用返信 編集キー/
■31906 / inTopicNo.2)  Re[1]: EXCEL プロセス操作方法について
□投稿者/ 魔界の仮面弁士 (979回)-(2009/01/29(Thu) 22:53:28)
No31891 (SSU さん) に返信
> 現在、VB側からEXCELファイルを作成、保存処理を行っています。(EXCEL不可視状態)
> この処理中に、外部から他のEXCELファイルを起動させると処理中のBookが開いてしまい、
> 処理が続行できなくなってしまいます。
「処理が続行できない」のは、VB から制御中の Excel ファイルですか?
それとも、外部から開かれた Excel ファイルの方ですか?

前者であれば、制御中の Excel.Application に対して、あらかじめ
.Interactive = False を指定しておけば、ユーザーからの干渉を防ぐことができます。


後者だとしたら、レジストリ修正ぐらいしか思いつきません…。

ファイルの関連付け設定で、*.xls への設定を下記のように修正すると、
*.xls をダブルクリックした場合に、既に起動済みの Excel で開くのではなく、
毎回、新しい Excel を起動するようになりました。
(Excel 2007 の場合です。2003 は未検証なので保証できません。)

 アクション
   『開く(&O)』
 アクションを実行するアプリケーション
   『"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" /e』
     ↓
  ★『"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" /e "%1"』★修正
 DDEを使う
   『チェックあり』
 DDEメッセージ
   『[open("%1")]』
 アプリケーション
   『Excel』
 DDEアプリケーションが実行していないとき
   『』
 トピック
   『system』


とは言え、この方法でも、VB で編集中の xls ファイルをダブルクリックされてしまうと、
操作中の Excel で開かれてしまうのですけれども。
引用返信 編集キー/
■31914 / inTopicNo.3)  Re[2]: EXCEL プロセス操作方法について
□投稿者/ SSU (2回)-(2009/01/30(Fri) 08:45:36)
返信ありがとうございます。

> 「処理が続行できない」のは、VB から制御中の Excel ファイルですか?
> それとも、外部から開かれた Excel ファイルの方ですか?
>
> 前者であれば、制御中の Excel.Application に対して、あらかじめ
> .Interactive = False を指定しておけば、ユーザーからの干渉を防ぐことができます。
>
>
> 後者だとしたら、レジストリ修正ぐらいしか思いつきません…。

今回の事例は前者です。「.Interactive = False」を早速使わせていただきます!!

> ファイルの関連付け設定で、*.xls への設定を下記のように修正すると、
> *.xls をダブルクリックした場合に、既に起動済みの Excel で開くのではなく、
> 毎回、新しい Excel を起動するようになりました。
> (Excel 2007 の場合です。2003 は未検証なので保証できません。)
>
>  アクション
>    『開く(&O)』
>  アクションを実行するアプリケーション
>    『"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" /e』
>      ↓
>   ★『"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" /e "%1"』★修正
>  DDEを使う
>    『チェックあり』
>  DDEメッセージ
>    『[open("%1")]』
>  アプリケーション
>    『Excel』
>  DDEアプリケーションが実行していないとき
>    『』
>  トピック
>    『system』
>
>
> とは言え、この方法でも、VB で編集中の xls ファイルをダブルクリックされてしまうと、
> 操作中の Excel で開かれてしまうのですけれども。

回避方法を丁寧に解説までして頂き、感謝感激です!
この二重チェック + ファイル使用確認で当面を凌ごうかと考えております。

加えて質問です(すみません…)
VB側からこの操作と同様のことを行うのは可能なのでしょうか?



引用返信 編集キー/
■31944 / inTopicNo.4)  Re[3]: EXCEL プロセス操作方法について
□投稿者/ SSU (3回)-(2009/01/30(Fri) 11:53:07)
すみません、重ねての質問ですが失礼します。(汗)

プロセスクラスを眺めてみたのですが、プロセス保護のようなメソッドやプロパティを
見つけることが出来ませんでした。

現段階では
上記処理中にExcelファイルを開いた場合、VB内で作成したプロセスで
Excelを開くことしか出来ない状況です。
(魔界の仮面弁士様が言う通り…)

VB内のプロセスとは別々にする方法は、初心者にはかなり難易度が高いのでしょうか?



引用返信 編集キー/
■31991 / inTopicNo.5)  Re[4]: EXCEL プロセス操作方法について
□投稿者/ SSU (4回)-(2009/01/30(Fri) 17:03:02)
何度も自己レスすみません。

強引な解決方法を見つけたので一応報告します。

Excel.Application のインスタンスを2つ用意し、インスタンス順が先ので処理を行い、
インスタンス順が後ので外部のExcelファイルが起動した場合のプロセスとして利用しました。

これを行うことで、一応プロセスが別となり、目的を達成することができました…。
こんな無駄なコーディングしか出来ない自分が情けないです。

どうか良い方法教えて下さい、お願いします。





引用返信 編集キー/
■32035 / inTopicNo.6)  Re[5]: EXCEL プロセス操作方法について
□投稿者/ 魔界の仮面弁士 (980回)-(2009/01/30(Fri) 19:31:38)
No31914
> 今回の事例は前者です。「.Interactive = False」を早速使わせていただきます!!
その結果、何か改善されましたか?

> VB側からこの操作と同様のことを行うのは可能なのでしょうか?
HKEY_CLASSES_ROOT\.xls
HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command あたりの
レジストリを書き替えれば可能かも知れません。が、試した事はありません。


No31944
> プロセス保護のようなメソッドやプロパティを
> 見つけることが出来ませんでした。
「プロセス保護」とは何でしょう?


No31991
> Excel.Application のインスタンスを2つ用意し、インスタンス順が先ので処理を行い、
> インスタンス順が後ので外部のExcelファイルが起動した場合のプロセスとして利用しました。
その手法は、先の投稿に先んじて検証してはいたのですが、使用されるインスタンスの
判断条件が不明だったので、対策案としては除外していました。
(当方環境で実験を繰り返していたときには、先に開いた方が使われることもあったので…)

> どうか良い方法教えて下さい、お願いします。
私にも分かりません。。。
引用返信 編集キー/
■32040 / inTopicNo.7)  Re[6]: EXCEL プロセス操作方法について
□投稿者/ SSU (5回)-(2009/01/30(Fri) 19:50:27)
返信ありがとうございます!!!

No32035 (魔界の仮面弁士 さん) に返信
> ■No31914
>>今回の事例は前者です。「.Interactive = False」を早速使わせていただきます!!
> その結果、何か改善されましたか?

この機能自体は求めていた内容でしたが、処理中のプロセスと
外部からExcelファイルを実行した場合のプロセスが同一になる
という解決にはなりませんでした…

ですが、必要な処理なので使用しています!


> HKEY_CLASSES_ROOT\.xls
> HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command あたりの
> レジストリを書き替えれば可能かも知れません。が、試した事はありません。

きちんとしたShellの知識が必要になりそうですね。勉強します!


> 「プロセス保護」とは何でしょう?

すみません…。あまりに酷い日本語でした。

具体的に申しますと、VB側で生成したプロセスに、外部から一切干渉を受けないようにする
ということです。
Excelファイルを実行した場合は、必ず新規プロセスで開くように出来れば何ら問題ないのですが…。


> その手法は、先の投稿に先んじて検証してはいたのですが、使用されるインスタンスの
> 判断条件が不明だったので、対策案としては除外していました。
> (当方環境で実験を繰り返していたときには、先に開いた方が使われることもあったので…)

ええ!?そうですか…。
この方法はガーベッジコレクションでプロセスが終了できない場合を生むので、
良くないとは思いましたが…

実用には耐えないようなので止めます。


> 私にも分かりません。。。

我侭ですみません…。
親切にここまで教えて下さって感謝しています。

もう少し検討してみます!



引用返信 編集キー/
■32198 / inTopicNo.8)  Re[7]: EXCEL プロセス操作方法について
□投稿者/ SSU (6回)-(2009/02/03(Tue) 11:25:38)
いつもお世話になっています。

今回は「.Interactive = False」と
保存時に出力ファイル名が既にある場合は、別名で保存することで
問題を回避しました。

結局のところ、
作業プロセスに繋がってしまった外部起動Excelファイルは使用不可であり
作業中にExcelを使用する場合はexeから起動してもらうという
場当たり的な対処しかできませんでした。

一応、今回は解決にします。

魔界の仮面弁士 様
本当にありがとうございました。

また質問した時は、力添え頂ければ幸いです。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -