• ベストアンサー

VBA Shell関数 

エクセルVBA shell関数でプログラムを立ち上げ (DOSプロンプト画面が起動) そのあとに、続けてDOSプロンプトにコマンドと"Sheet1のA1"のセルに入力してある文字を打ち込みたいのですが上手くいかなく困っています。 どのようにしたらよいのでしょうか。 以下のように記述しています。 (初心者です) ------------------------------------ Sub ShellSamp1() Dim myID As Double   myID = Shell("C:\****\*****\*****.EXE & " & cd C:\Documents and Settings & " & Range("A1").Value & """") End Sub ------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.4

ANo.3でコメントしたものです。 >****.EXEというのは、海外のソフトです。 >****.EXEを起動するとDOSプロンプトが立ち上がります。 >そのDOSプロンプト上にA1セルのコマンドを実行しようとしています。 なるほど。よくわかりました。ありがとうございます。 とすると、その****.EXEに(そのコマンド上で実行して欲しい)"cd C:\Documents ..."とA1セルの文字列とを渡さないといけません。しかし、その渡し方は****.EXEの仕様次第です。なので、「どのようにすれば****.EXEに実行してもらうコマンドを渡せるのか」ということを調べないといけません。少なくとも今はそのコマンド名すら明かされていないので私にはどうしたらよいのかはわかりません。(つまり、コマンドの仕様を知らずに書ける一般的な手法があるわけではないです。) どのようなコマンドライン文字列にしたらよいのかを調べて教えてもらえればコード例を示すことはたぶんできます。コマンド名を教えてもらえれば(もしこちらでその仕様の調べがつくなら)コード例を書けるかもしれません。 私がANo.3で書いた例だと、cmd.exeにその上で実行してもらいたいコマンド文字列を渡しています。それはcmd.exeの仕様に従って、"/c"オプションを前置してその後ろにコマンド文字列が続くことを示したり、cdコマンドとA1セル内容(のコマンド)との間に"&&"を入れて区切ったり、ということをしています。これはcmd.exeだからその書き方になるのですけれど、****.EXEの場合はどう書いたらよいのかがわからないので調べる必要があります。 調べがついたらそれに従った文字列を生成するようにコードを書くだけです。 ちなみに、ご存じかもしれませんがcmd.exeは「コマンドプロンプト」の実体です。ですのでcmd.exeを使えばコマンドプロンプトのコマンドライン上で入力するような文字列を渡して処理させることができます。参考まで。 ということを踏まえるともうおわかりかもしれませんが、 >/c *** は DOSに***のコマンドを送るってことですか? というのは正確には「DOSに」というよりも「(コマンドプロンプトの処理を担当する)cmd.exeに」***のコマンドを送る(実行してもらう)ということです。そして"/c"というのは一般的な話ではなくてcmd.exe用のオプションフラグです。

ok_answer
質問者

お礼

回答ありがとうございます。 >、「どのようにすれば****.EXEに実行してもらうコマンドを渡せるのか」ということを調べないといけません >、****.EXEの場合はどう書いたらよいのかがわからないので調べる必要があります。 マニュアルを熟読します。 >どのようなコマンドライン文字列にしたらよいのかを調べて教えてもらえれば そのプログラムでは、私が使う範囲ではDOSとコマンドは同じです。 しかし、やはり、マニュアルで詳細を調べます。 今回の質問に対して親切丁寧なご回答ありがとうございます。 非常に助かりました。 マニュアルを読んで再度質問させてもらいます。

その他の回答 (3)

  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.3

ANo.1でコメントしたものです。 >カレントシートのA1セルの"abcd"の文字列がそのままDOSプロンプトに"abcd"と入力したいです。 うーん、そうするともとのプログラムにある"C:\****....***.EXE"とか"cd C:\..."はどういう関係になるのでしょう。 あんまりつまらないやりとりをしてもしょうがないので2パターンだけ想定して例を示してみます。もし、想定が違っていれば教えてください。 なお、コードはShell関数を呼んでいる行だけ書いています。 例1) 想定:****.EXEというのは実はcmd.exeのことを意味している。(ので実行したいこととは関係ない。)したい処理は、C:\Documents and SettingsにcdしてからA1セルに書いてあるコマンドを実行すること コード: myID = Shell("cmd /c cd C:\Documents and Settings && " & Range("A1").Value) 例2) 想定:****.EXEというのが実行したいコマンド。C:\Documents and Settingsにcdしてから****.EXEを実行するがそのとき引数としてA1セルの内容を渡したい。ただし、A1セルの内容は'"'(ダブルクォート)で括りたい コード: myID = Shell("cmd /c cd \Documents and Settings && C:\****\*****\*****.EXE """ & Range("A1").Value & """") 要するにcmd.exeを起動してその引数にコマンドラインを渡して実行させる、というコード例です。 余談ですが、cmd.exeはフルパスで指定してもいいですけど、普通はパスが通っているので手抜きで"cmd"とだけ書いても通ります。よりきちんと書くならShell("C:\Windows\System32\cmd.exe ...とか書いた方がいいかもしれません。ですが、Windowsのシステムディレクトリが"C:\Windows..."である保証などないので、本当はレジストリからシステムディレクトリを引いてきて…とかいう処理になって面倒ですから"cmd"で許してもらいたいところです。 ほかにも「あなたが何をしたいのか」は色々なパターンで想像できるのですけれど、とても思いつく全てのパターン(二桁以上ある)で回答を書き続けるのは嫌なのでとりあえず2パターンに絞ってみました。 違っていたら、もうちょっとこうしたいというのをなるべく詳しく書いて教えてください。

ok_answer
質問者

お礼

回答ありがとうございます。 ****.EXEというのは、海外のソフトです。 ****.EXEを起動するとDOSプロンプトが立ち上がります。 そのDOSプロンプト上にA1セルのコマンドを実行しようとしています。 立ち上がったDOSプロンプトは、****.EXEと同じ場所の位置が表示されます。 そこで、"cd C:\Documents and Settings" に移動しA1セルのコマンドを実行するようにしようと考えています。 回答よろしくお願い致します。 追記   /c *** は DOSに***のコマンドを送るってことですか?

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

Shellはプロセスを非同期に実行します。返ってくるのはプロセスIdで、 これではプロセスの標準入出力に操作することは出来ません。 ShellオブジェクトのExecメソッドを使うと、標準入出力を操作できます。 プログラムは少し難しいかも知れませんが、確実に処理するためには必要です。 下記を参照してみてください。 http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_03.html

ok_answer
質問者

お礼

ありがとうございます。 リンクを見ましたがやはり難しかったです。 頑張って勉強していきます。 回答ありがとうございました。

  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.1

うーん、このコードを見るだけだとどうなって欲しいのかがよくわかりません。 例えば、Sheet1(というかカレントシート)のA1セルに"abcd"という文字列が入っていたらどういうコマンド文字列がDOSプロンプトに入って欲しいですか?(コマンド名はC:\****\*****\*****.EXEでいいので、特にその後ろの辺りを中心に。) あと、A1セルには'"'(ダブルクォート)とかを含む文字列が入る可能性はありますか?

ok_answer
質問者

お礼

回答ありがとうございます。 カレントシートのA1セルの"abcd"の文字列がそのままDOSプロンプト に"abcd"と入力したいです。 あと、A1のセルには"'(ダブルクォート)とかを含む文字列は入りません。 お手数をお掛けします。。。。

関連するQ&A