ワードをshell関数で開くには?


かな  2004-11-17 08:20:08  No: 86703

ワードはshell関数で実行することはできないのでしょうか?
プロパティを見ても、実行ファイルのパスがわからないので、だめなのでしょうか?
よろしくお願いします。


しい  2004-11-17 18:25:45  No: 86704

VB6
Private Sub Form_Load()
  Shell "C:\Program Files\Microsoft Office\Office\WINWORD.EXE", vbNormalFocus
End Sub


java.lang.Nullpo  2004-11-17 18:50:53  No: 86705

> C:\Program Files\Microsoft Office\Office\WINWORD.EXE

このパスだとは限らない罠ですね。

# 普通に、「winword」の方が、まだ安全かと。


GOD  2004-11-17 19:34:22  No: 86706

>> C:\Program Files\Microsoft Office\Office\WINWORD.EXE
>
>このパスだとは限らない罠ですね。
>
パスはレジストリを調べるとか。
(Word97は↓だったけど新しいのは分からない。一緒の気もするけど)
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\Winword.exe\shell\open\command

> # 普通に、「winword」の方が、まだ安全かと。
>
私の環境ではパスが通ってなかった。_|‾|○
createobject使って起動した方が簡単そうだけど


かな  2004-11-17 19:46:18  No: 86707

>お2人様、ありがとうございます。
ワード開くことができました。パスを見るときはエクスプローラで確認するといいんですね。
あと、追加なのですが、子ウインドウを指定したいとき、FindWindowExを使うのはわかっているのですが、クラス名でvbNullStringと書いてあるのですが、これはどういうことなのでしょう?文字列をメモリに格納しないというのは何を意味するんでしょうか?

例えば、ワードでメニューの「ファイル」という項目をVBから操作したいとき、どうすればいいのでしょうか?よろしくお願いします。


かな  2004-11-17 19:48:16  No: 86708

>GOD様
レジストリを調べるにはどうすれば、いいのでしょうか?
簡単な質問ですいません。


java.lang.Nullpo  2004-11-17 20:46:01  No: 86709

> パスはレジストリを調べるとか。
安全を追求するとそうなりますね。

# 「まだ安全かと」と言ったのはそのためです。
# ユーザ運用カバーとして、環境カバーすれば問題なしですが。

> vbNullStringと書いてあるのですが、これはどういうことなのでしょう?
オブジェクトブラウザでも見てください。
  「値を持つ文字列を要求する外部プロシージャを呼び出すときに使う定数です。」
とあります。

> レジストリを調べるにはどうすれば、いいのでしょうか?
GODさんをご指名ですが、ついでということで、代わりに..
GetSetting() でも調べてみてください。

# 何でもかんでも質問せず、ご自分で解決する努力をしましょう。


GOD  2004-11-17 21:01:09  No: 86710

> レジストリを調べるにはどうすれば、いいのでしょうか?
かなさんがどのVB使っているか分かりませんが、VB6だとRegCreateKeyEx(), 
RegOpenKeyEx(), RegQueryValueEx(), RegSetValueEx(), RegCloseKey() 
APIを使わなければなりません。GetSettingはVB用に作成されたレジストリの
下しか見れいない為です。(.NETでなら全体が見れるのかな?)

> 例えば、ワードでメニューの「ファイル」という項目をVBから操作したいとき、ど
> うすればいいのでしょうか?よろしくお願いします。
>
CreateObjectまたはGetObjectを使ってオブジェクトを操作してみてはいかがですか。
(ExcelができたからWordでもできるのでは。)
ファイルの操作をする必要があるならShellにこだわった理由が良く分かりませんが。


Say  2004-11-17 21:49:21  No: 86711

APIを使うなら、レジストリ操作するより
ShellExecuteExで関連付け実行したほうが楽なような・・・。

もっとも、関連付け実行なら、API使わずとも
CreateObject("Wscript.Shell").run "C:\Test.doc"
とかで起動できますが。


かな  2004-11-19 03:54:33  No: 86712

みなさま、回答ありがとうございます。

>CreateObjectまたはGetObjectを使ってオブジェクトを操作してみてはいかがですか。
調べてみて、一応自分なりに理解したつもりではあるのですが、CreateObjectは「オートメーションオブジェクトを作成し、作成したオブジェクトへの参照を返します」とあるのですが、
1.オートメーションオブジェクトというのは、Excel.sheetなどのようにはじめから決まったクラス名のことを指すのでしょうか?それとも、新たに自分でクラスを作成することができるのでしょうか?
となると、例えば市販のソフトのコマンドを動かすとなると、どのようにすればいいのでしょうか?

2.CreateObjectで作って、GetObjectで実際に処理を動かしていくという流れでよろしいのでしょうか?

3.レジストリ操作で気になったことがあるのですが、これを使えばインストールしたどんなソフトウェアでもそこのメニューやらファイルやらを動かすことができるのでしょうか?もし可能なら、ある一連の操作を自動化することもできますよね?

お助けください。


Say  2004-11-19 05:35:11  No: 86713

1.レジストリ登録されているWindows Classを指します。
自作、他作を問いません。
2.CreateObjectまたはGetObjectで参照を取得して、
その参照に対し、メソッドやプロパティを発行します。
3.対象アプリがそのような作りになっていれば可能です。


Wendy  2004-11-19 08:59:04  No: 86714

こんばんは。

>2.CreateObjectで作って、GetObjectで実際に処理を動かしていくという
GetObject は、個別のSheet, Document に対して、オブジェクトを生成するはずですね。
>決まったクラス名のことを指すのでしょうか?
  すでに、決まっています。

>ワードでメニューの「ファイル」という項目をVBから操作したいとき、どうすればいいのでしょうか?
個々の Document をそれぞれ扱うには、GetObject で、オートメーション・オ
ブジェクトで、Word.Document になるかと思います。ただし、これは、やった
ことがありません。

CreateObject で、ワードのドキュメントを開く

Dim wdApp As Object
Dim myDocument As String
Dim wdPath As String
  myDocument = "Test1.doc"
  Set wdApp = CreateObject("Word.Application")
With wdApp
    wdPath = .Options.DefaultFilePath(0) & "\"
    .Visible = True
    .Documents.Open (wdPath & myDocument)
End With
    Set wdApp = Nothing
End Sub


かな  2004-11-21 04:55:15  No: 86715

>Sayさん、Wendyさん
ありがとうございます。

あと、アプリケーションの実行はShell関数でできたのですが、アプリケーションで作成したファイルをVBから開きたいときはどうすれば、いいのでしょう?shell関数はEXE拡張子を開けても、そのほかの拡張子は開けないのでしょうか?


たくみ  2004-11-26 20:33:06  No: 86716

これだけさんざん皆さんアドバイスされて、で、Shell()なんですか−。
Shell()はどうしても仕方ないときなどに、あるいはすごい
安易に動かしたいだけ、なときにやられた方がいいと思います。
でも、Shell()でもちゃんと組めばそれなりに結構なのですが、

>shell関数はEXE拡張子を開けても、そのほかの拡張子は開けない・・?
って聞いたときに、正直だめだこりゃ、と。
ShellExecuteExと混同してませんか?
というかその辺、正直わかってませんよね。
Shell()は普通にヘルプでもわかりやすく、ここで紹介されている
他の策と比べてとっつきやすく平易だと思うのですが。
今一度よくShell()について読まれてみてください。

辛口はこれくらいにして、最後に、たぶん「これ」でしょ。
Shell()の引数はEXE名だけとかって考え方じゃないんです。
つまり、こういうひとつの文字列を作り渡せばいいのです。
まずEXE名を絶対パスを書いた文字列。
ひとつスペースを空ける。つまりSpace(1)の意味の文字列。
開きたいそのファイル名の絶対パスを書いた文字列。
この3つの文字列を結合させ、Shell()の引数にします。
以上です。

おそらく、最初からそれ、それが知りたかったんです、じゃ
ないですか?
はずしてないと思いますよ。
あと、思うのですが他のみなさんのご質問もなんだか
似たようなこの手のShell関係ネタが多いので
このレス参考にされてください。
そういう意味(にあくまで限定ですが)Shell()って何でもありで
お手軽で、すごいです。

で、お手軽ですごくていいんだけど、起動した後は制御が
さっぱり、飛んでいってしまった凧状態。
なのでいろいろと他の方法を考える必要があるのですが
そちらの方はここではあえて割愛します。


たくみ  2004-11-26 21:06:53  No: 86717

(訂正です)
>まずEXE名を絶対パスを書いた文字列。
まずEXE名の絶対パスを書いた文字列。

(重要!)
>この3つの文字列を結合させ、Shell()の引数にします。
あ、言い忘れましたが
この3つをつなげた文字列、で意味がおわかりのように
そのEXE自体が引数を伴った場合の起動が可能な場合に
限ります。
で、マイナーなEXEの場合、そんなものブラックボックスで
どうやって事前にそれが調べれるんだ!と
突っ込まれそうなのですが、ならば
コマンドプロンプト開いて
上述の結合したひとつの文字列を打ってみればわかります。
あ、もうひとつ突っ込み入りそうなので、言っておきますが
C:\Program Files\Microsoft Officeなどの
スペース区切りのあるパスはダブルクオートで囲ってください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加