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

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

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

Re[14]: shell関数によるExcelの起動


(過去ログ 42 を表示中)

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

■21461 / inTopicNo.1)  shell関数によるExcelの起動
  
□投稿者/ nana* (4回)-(2008/07/02(Wed) 17:36:08)

分類:[.NET 全般] 

よろしくお願いします。
実行環境 Win Server2003 SP2
VisialStudio 2005
Microsoft Office 2007


VBのプログラムからローカルフォルダに保存してあるExcelファイルを同期的に開こうとしています。
Shell関数を用いて実行しようとしているので、Excel.exeの実体(?)へのフルパス指定が必要かと思うのですが
端末によってMicosoft Officeのインストールディレクトリが変わっている場合があるので
こまっています。

たとえば環境変数で
System.Environment.GetEnvironmentVariableとすると
"C:\Program Files"
がとれるのですが、実際にExcel.exeの実体は"D:\Program Files\Microsoft Office\Office12"にあります。
この"D:\"と"Office12"をプログラムから取得する方法は無いでしょうか。
もしくは、Shell関数でExcelを起動する際にフルバスを指定しないですむ方法とありましたら
ご教授願いたく。


実行しようとしているコード
Shell("D:\Program Files\Microsoft Office\Office12\Microsoft Office\Office\excel.exe", AppWinStyle.NormalFocus, True)
引用返信 編集キー/
■21462 / inTopicNo.2)  Re[1]: shell関数によるExcelの起動
□投稿者/ 魔界の仮面弁士 (775回)-(2008/07/02(Wed) 17:51:26)
No21461 (nana* さん) に返信
> Shell関数を用いて実行しようとしているので、Excel.exeの実体(?)へのフルパス指定が必要かと思うのですが

Shell ではなく、Process.Start を使ってみては如何でしょう。
 Process.Start("Excel.exe")
もしくは
 Process.Start("C:\Book1.xls")
で。
引用返信 編集キー/
■21468 / inTopicNo.3)  Re[2]: shell関数によるExcelの起動
□投稿者/ ロック (27回)-(2008/07/02(Wed) 19:12:09)
パスの取得について、答えじゃないですが(せっかく調べたので)一応参考までに

COMを使ったExcel操作をやっていた時、Excelのインストールパスがレジストリの何処かに
入っていたような気がしたので確認してみたら、省略されたパスしか入ってなかった orz
Excelがインストール済みならレジストリ「Excel.Application」のキーが存在しているはずなので
そこから追っています。

(1)「HKEY_CLASSES_ROOT\Excel.Application」キーを見つける

(2)その配下、「HKEY_CLASSES_ROOT\Excel.Application\CLSID」キーを見つける

(3)「HKEY_CLASSES_ROOT\Excel.Application\CLSID」キーの(既定)値をメモる
  ※「{00024500-0000-0000-C000-000000000046}」こういう数値が入っているはずです

(4)「HKEY_CLASSES_ROOT\CLSID」を見つける

(5)(4)キー配下に(3)で見つけた値を付加したキーを見つける
  ※例「HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}」
  この配下のどこかに入っています。

#「HKEY_CLASSES_ROOT\Excel.Addin」などのキーにはちゃんと入っていたんですけどね・・・

引用返信 編集キー/
■21471 / inTopicNo.4)  Re[3]: shell関数によるExcelの起動
□投稿者/ Jitta on the way (124回)-(2008/07/02(Wed) 19:31:34)
No21468 (ロック さん) に返信

*.xls の open に紐付いているものを取る、の方が簡単かも。


魔界の仮面弁士さんの方法を推します。
コマンドプロンプトで、
start エクセル.xls
とすると、エクセルが起動します。登録されているファイル種別であれば、アプリケーションの絶対パスは要りません。
引用返信 編集キー/
■21478 / inTopicNo.5)  Re[4]: shell関数によるExcelの起動
□投稿者/ mitchin (1回)-(2008/07/03(Thu) 02:16:39)
Process クラスを使う方をオススメしますがレジストリから取得したいのであれば

HKEY_CLASSES_ROOT\Excel.Application\CurVer からバージョンを取得して
例えばそれが 11 であれば
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Excel\InstallRoot からフォルダパスを取得できます。

引用返信 編集キー/
■21489 / inTopicNo.6)  Re[5]: shell関数によるExcelの起動
□投稿者/ nana* (5回)-(2008/07/03(Thu) 11:09:17)
みなさまお返事ありがとうございます。


>魔界の仮面弁士 さん、mitchinさん、 Jittaさん
とりあえず、以下のコードを試してみました。
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("D:\EXCELtest.xls")
p.Start()
p.WaitForExit()

しかし、
p.WaitForExit()
の箇所で
「このオブジェクトに関連付けられているプロセスはありません。」
とエラーになります。
ちょっとまだ調べている最中で解決出来ましたらまた報告いたします。


>ロックさん、mitchinさん
確かに、言われた方法でインストールディレクトリを見つけることが出来ました。
よく、こんな方法を発見しはったな〜と感心しました。
次回、インストールディレクトリのフルパスが必要な時に使用させていただきます。
どうもありがとうございます。
引用返信 編集キー/
■21496 / inTopicNo.7)  Re[1]: shell関数によるExcelの起動
□投稿者/ シャノン (521回)-(2008/07/03(Thu) 12:07:02)
No21461 (nana* さん) に返信

WMI でも取れるかも。
root\MSAPPS 名前空間の Win32_ExcelSummay.Path がそれっぽいです。
Microsoft がドキュメント化してくれているかどうかわかりませんが。
引用返信 編集キー/
■21497 / inTopicNo.8)  Re[6]: shell関数によるExcelの起動
□投稿者/ Jitta on the way (125回)-(2008/07/03(Thu) 12:10:54)
No21489 (nana* さん) に返信
> みなさまお返事ありがとうございます。
>
>
> >魔界の仮面弁士 さん、mitchinさん、 Jittaさん
> とりあえず、以下のコードを試してみました。
> Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("D:\EXCELtest.xls")
> p.Start()
> p.WaitForExit()
>
> しかし、
> p.WaitForExit()
> の箇所で
> 「このオブジェクトに関連付けられているプロセスはありません。」
> とエラーになります。
> ちょっとまだ調べている最中で解決出来ましたらまた報告いたします。
>
終わっちゃってるからねぇ(^_^;)
引用返信 編集キー/
■21500 / inTopicNo.9)  Re[2]: shell関数によるExcelの起動
□投稿者/ ロック (30回)-(2008/07/03(Thu) 12:47:33)
C#に(空白が入っていても大丈夫な)FindExecutable()のような関数があれば
楽なんですけどね。

引用返信 編集キー/
■21501 / inTopicNo.10)  Re[1]: shell関数によるExcelの起動
□投稿者/ 渋木宏明(ひどり) (808回)-(2008/07/03(Thu) 13:08:38)
渋木宏明(ひどり) さんの Web サイト
2008/07/03(Thu) 13:34:43 編集(投稿者)

素朴な疑問。

Process.Start() を使うなら Excel.exe のパスなんか必要ないけど、どうしてそこに執着すんの?

引用返信 編集キー/
■21502 / inTopicNo.11)  Re[2]: shell関数によるExcelの起動
□投稿者/ 渋木宏明(ひどり) (809回)-(2008/07/03(Thu) 13:15:49)
渋木宏明(ひどり) さんの Web サイト
ProcessStartInfo info = new ProcessStartInfo();

info.FileName = @"hoge.xlsx";
info.UseShellExecute = true;

Process process = Process.Start();

process.WaitForExit();

じゃダメなん?

引用返信 編集キー/
■21503 / inTopicNo.12)  Re[3]: shell関数によるExcelの起動
□投稿者/ 渋木宏明(ひどり) (810回)-(2008/07/03(Thu) 13:37:52)
渋木宏明(ひどり) さんの Web サイト
2008/07/03(Thu) 13:39:04 編集(投稿者)

ちなみに、既に目的のファイルが Excel で開かれていた場合なんかに細かく対応するためには、オートメーションするしかありません。

# ROT 見てごにょごにょとか、そんな感じ
引用返信 編集キー/
■21509 / inTopicNo.13)  Re[4]: shell関数によるExcelの起動
□投稿者/ nana* (6回)-(2008/07/03(Thu) 15:19:46)
No21503 (渋木宏明(ひどり) さん) に返信
> 2008/07/03(Thu) 13:39:04 編集(投稿者)
>
> ちなみに、既に目的のファイルが Excel で開かれていた場合なんかに細かく対応するためには、オートメーションするしかありません。
>
> # ROT 見てごにょごにょとか、そんな感じ



お返事ありがとうございます。
まだ掲示板拝見しています。
依然Processで苦戦中です。

>(渋木宏明(ひどり) さん
このようなソースで試してみました。
確かに目標のExcelは起動出来ました。
どうもありがとうございます。

Dim info As New ProcessStartInfo
info.FileName = "D:\EXCEL管理.xls"
info.UseShellExecute = True
Dim proc As new Process
proc.Start(info)
proc.WaitForExit()


ただ・・・ 依然としてWaitForExitメソッドで
「このプロセスに関連づけられているプロセスはありません」
とエラーになります。
Excelが閉じるのを待って別の処理が実行したいのでWaitForExitメソッドは大切なのですが・・

※21461で私はことばを間違えていますね
「同期的にExcelを開く」→「非同期でExcelを開く」
です。Excelが閉じるまで待機していたいです。

引用返信 編集キー/
■21511 / inTopicNo.14)  Re[5]: shell関数によるExcelの起動
□投稿者/ y4yama (77回)-(2008/07/03(Thu) 16:13:44)
No21509 (nana* さん) に返信
> proc.Start(info)
でここは終わっておいて、Timerを起動して、1秒ごとに
このprocは終了しているか? 判断させる、とか。
もしかして、このprocは別の本体(EXCEL2007)を起動したら即終了している、とかは考えられませんか
引用返信 編集キー/
■21512 / inTopicNo.15)  Re[5]: shell関数によるExcelの起動
□投稿者/ 小春 (53回)-(2008/07/03(Thu) 16:49:32)
> Dim info As New ProcessStartInfo
> info.FileName = "D:\EXCEL管理.xls"
> info.UseShellExecute = True
> Dim proc As new Process
> proc.Start(info)
> proc.WaitForExit()

procは、インスタンスを生成しているだけなので、
中身が空の状態です。
空の状態では、何を待てばいいのか分からないので、エラーになります。

そして、
> proc.Start(info)
は、入れ子のアクセスとかって、ビルド時に警告になってませんか?

なので、
Dim proc As Process = Process.Start(info)
でいいと思います。
引用返信 編集キー/
■21518 / inTopicNo.16)  Re[6]: shell関数によるExcelの起動
□投稿者/ nana* (9回)-(2008/07/03(Thu) 17:29:18)
>y4yama さん、小春さん
お返事ありがとうございます。

確かに、Process.sartでExcelは起動するのですが、すぐにProcessが破棄されているようです
(nothingが設定されている)

小春さんに教えていただいたことを参考にこのように試してみたのですが、
Excelは起動しますが、WaitForExitで
「オブジェクト参照がインスタンスに設定されていません。」(nullReferenceException)
とエラーです・・。


Dim info As New ProcessStartInfo
info.FileName = "D:\EXCEL管理.xls"
info.UseShellExecute = True

Dim proc As Process = Process.Start(info)
proc.WaitForExit()



かなり手ごわい相手です・・・.






引用返信 編集キー/
■21520 / inTopicNo.17)  Re[7]: shell関数によるExcelの起動
□投稿者/ 小春 (54回)-(2008/07/03(Thu) 17:38:36)
> 小春さんに教えていただいたことを参考にこのように試してみたのですが、
> Excelは起動しますが、WaitForExitで
> 「オブジェクト参照がインスタンスに設定されていません。」(nullReferenceException)
> とエラーです・・。
>
> Dim info As New ProcessStartInfo
> info.FileName = "D:\EXCEL管理.xls"
> info.UseShellExecute = True
>
> Dim proc As Process = Process.Start(info)
> proc.WaitForExit()

このソースを私の環境でそのまま実行してみましたが、
エラーになりませんでしたよ????
本当にWaitForExitで落ちてます??
引用返信 編集キー/
■21529 / inTopicNo.18)  Re[8]: shell関数によるExcelの起動
□投稿者/ nana* (11回)-(2008/07/03(Thu) 18:44:42)
No21520 (小春 さん) に返信

> このソースを私の環境でそのまま実行してみましたが、
> エラーになりませんでしたよ????
> 本当にWaitForExitで落ちてます??


>小春さん
何度もお返事ありがとうございます。
再度確認しましたがWaitForExitで落ちてます・・。
stactarceを確認しましたが、間違いないようです。
小春さんの環境で問題無いとすると、私の環境に問題がありそうですね。
(他にVisual Studioがインストールされている環境があればいいのですが・・・
Expressでも使えたらいいのになあ〜。)

何度も確認して頂いてありがとうございます。m(_._)m


引用返信 編集キー/
■21532 / inTopicNo.19)  Re[9]: shell関数によるExcelの起動
□投稿者/ 小春 (55回)-(2008/07/03(Thu) 19:38:49)
2008/07/03(Thu) 20:41:16 編集(投稿者)
2008/07/03(Thu) 19:39:18 編集(投稿者)

No21529 (nana* さん) に返信
> >小春さん
> 何度もお返事ありがとうございます。
> 再度確認しましたがWaitForExitで落ちてます・・。
> stactarceを確認しましたが、間違いないようです。
> 小春さんの環境で問題無いとすると、私の環境に問題がありそうですね。
> (他にVisual Studioがインストールされている環境があればいいのですが・・・
> Expressでも使えたらいいのになあ〜。)
>
> 何度も確認して頂いてありがとうございます。m(_._)m

実行環境が
>実行環境 Win Server2003 SP2
ということですので、一度クライアントで、新しいプロジェクトで実行してみてはいかがでしょうか?

新規プロジェクト作成

フォームにボタンを配置

ボタンのクリックイベントに下記のソースを記述

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim info As New ProcessStartInfo
info.FileName = "C:\hoge.xls"
info.UseShellExecute = True

Using proc As Process = Process.Start(info)
proc.WaitForExit()
End Using
MessageBox.Show("んちゃ")
End Sub

実行すると、Excelが閉じるのを待ってから、「んちゃ」と出る。

でうまくいくかどうか?
うまくいかない場合は、他に原因があると思います。



引用返信 編集キー/
■21543 / inTopicNo.20)  Re[10]: shell関数によるExcelの起動
 
□投稿者/ Jitta on the way (126回)-(2008/07/04(Fri) 07:38:08)
MSDN を確認して、実行環境を確認しましょう。

ドキュメントを指定した場合、プロセスが再利用されます。この場合、戻り値は null です。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -