• ベストアンサー

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/1415)
回答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

  • VBA Shell

    VBA のコマンドボタンで他のソフトを起動したいのですが Private Sub CommandButton1_Click() Shell "C:\Windows\Notepad.exe", 1 End Sub でノートパットは起動しますが マイドキュメントに置いてある XX.EXEを起動したくて Private Sub CommandButton1_Click() Shell "C:\Users\X\Documents\XX.exe", 1 End Sub としても起動しません この方法で マイドキュメントに置いてある XX.EXEを起動することは出来ないのでしょうか

  • VBA でshell関数を使ってコマンドプロンプト立ち上げてコマンドの入力方法

    VBAの初心者です。 今、shellを使ってコマンドプロンプトを 立ち上げ、エクセルのあるセルを参照し、 そのセルに入力した文字をコマンドプロンプトへ 入力したいのですが。。。 また、下記のshell関数を走らせると 以下のようなエラーみたいなのが出ます。 「ドライブ C のボリューム ラベルは ○○○ です ボリューム シリアル番号は △△△ です」 ----------------------------------- Sub test() Shell "cmd /k cd C:\Documents and Settings & dir" End Sub ---------------------------- また、上記shellで " & "以降でコマンドは 打ち込めるのでしょうか。 初心者で大変困っております。 ご存知の方よろしくお願いいたします。

  • VBAの関数について

    VBA初心者です。 VLOOKUP関数の使い方がわかりません。 具体的に書かせてもらうと VBAの中にVLOOKUP関数を使いたいです 試験1ファイルのシート"sheet1"にある 検索値を使い 試験2ファイルの指定した検索範囲を 試験1ファイルのシート"sheet1"の指定した位置に数値を挿入することです。 例えばですが(この使い方も間違ってるかもしれません)コードを書いてみると 試験1の検索値はA5セルとします 試験2の検索範囲はB1~C20とします 検索範囲から取得した数値の位置はD5とします VLOOKUPに関してですが 検索値は変数を使い 検索値範囲も変数を使い 列番号はC列がいいので3で 検索方法はFALSEでお願いします sub test() dim a as range dim b as workbooks dim c as range set a = range("B1~C20") set b = workbooks("sheet1") set c = range("A5") workbooks("試験1").worksheets("sheet1").range("D5").value=workbooks("試験2").activesheet."=VLOOKUP(ここがわかりません)".value end sub そもそも変数やsetの使い方が間違ってるかもしれませんm(__)m コードを書いて貰えるととても助かります。 回答お願いします。

  • VBAに詳しい方、「Mod」を解説していただけませんか?

    四捨五入したり、繰り上げたり、なんだかさっぱり分かりません。 詳しく教えてください。 Sub 答え()  Dim kotae As Double  keisan = 6.6 Mod 2  Range("A1").Value = keisan End Sub この場合、A1は1と入るのですが、なぜ1なのですか。 VBAの試験があるので、なんとか覚えたいのです。 さっぱりわからず、困っています。教えてください。 お助けください。

  • エクセルでのVBA

    エクセルでVBAを使ってIEで指定のURLを開いて、VBAで指定したWEBフォームにエクセルで指定したセルの値を入力したいのですが、下記のコードを入れるとエラーが出てしまいます。   A1:1-1 or 1-2 or 1-3 B1:月曜日 C1:火曜日 D1:水曜日 上のA1~D1まで入力した上でコマンドボタンをクリックすると、自動的に行うようにしたいです。 Private Sub CommandButton1_Click() Dim objie As Object Set objie = CreateObject("InternetExplorer.application") objie.Visible = True objie.Navigate "http://●●●●/form.html" Dim kubun As String kubun = range("A1") Select Case kubun Case "1-1" call ma1_1 Case "1-2" call ma1_2 Case "1-3" call ma1_3 End select Set objie = Nothing End sub Sub ma1_1() objie.Document.all.form1_1.Value = Range("B1") End Sub Sub ma1_2() objie.Document.all.form1_1.Value = Range("B1") objie.Document.all.form1_2.Value = Range("C1") End Sub Sub ma1_3() objie.Document.all.form1_1.Value = Range("B1") objie.Document.all.form1_2.Value = Range("C1") objie.Document.all.form1_3.Value = Range("D1") End Sub これで実行を押すと、objie 変数が定義されていません。と出てしまいます。このobjieを有効にするにはどうしたよいのでしょうか? わかる方いましたらご教授願います。 よろしくお願いします。

  • vba pdfを手前に開きたい  Shell

    Sub Sample() Dim myFile As String myFile = "C: \test.pdf" Shell """C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"" " & myFile End Sub vbaからこれでPDFファイルを開くことができるのですが アクセスの後ろで開いてしまいます。 このコードを実行したら、開いたPDFファイルを画面の手前に表示したいので 何を付け足せばいいのでしょうか?

  • Excel2003 VBA Shell関数について

    AフォルダにあるZipファイルを検索し、そのファイルを解凍ソフトで開きBフォルダに解凍するマクロを作成中です。解凍ソフト自体に保存先フォルダを設定していますので、Bフォルダは関係ありません。 ---------------------------- Sub AAA Dim ksDir As String Dim ktExe As String Dim fName As String Dim i As Long  Const KTS As String = ".zip"  ksDir = "\\xxx.xxx.xxx.xxx\A\"  fName = Dir (ksDir & "*" KTS , vbNormal)   Do While fName = <> ""   Shell "\\xxx.xxx.xxx.xxx\C\解凍ソフト.exe ktDir & fName"    i = i + 1    nName = Dir Loop End Sub -------------------------- 「Shell "\\xxx.xxx.xxx.xxx\C\解凍ソフト.exe ktDir & fName"」の”ktDir & fName”の部分に実在する ファイルのパスを入れるとうまくいきますが、変数を入れて処理するとうまくいきません。 どこか間違いがある、又は他によい記述のしかたがあれば教えてください。 よろしくお願いします。

  • VBAでVlookup関数を組もうとしていますがエラーが出ます。VBAに詳しい方、教えてください

    VBAでvlookup関数を下のように組みましたが、(1)でエラーが出ます。VBAに詳しい方、教えてください。 Sub VLLOKUPによる表の検索4() Dim mykensakuchi Dim mykensakuhan Dim gyo As Integer (1) mykensakuchi = Worksheets("sheet1").Range("a" & gyo).Value mykensakuhan = Worksheets("sheet2").Range("b2:e9") saikagyo = Worksheets("sheet1").Range("a" & Rows.Count).End(xlUp).Row gyo = 2 For gyo = saikagyo To 1 Step -1 With Application.WorksheetFunction Range("b:gyo").Value = .VLookup(mykensakuchi, mykensakuhan, 2, False) End With Next End Sub

  • VBA Shell について(アプリの起動)

    Shellを使用して特定のアプリケーションの起動および操作をしたいと考えています。 起動は以下の式で出来たのですが、 Sub VbaToCmd() Call Shell("C:...........................................................................exe", vbNormalFocus) End Sub 起動後の画面でパスワード入力が求められます。 (1)パスワードを自動入力にしたい。 (2)起動後、キーボード操作を行いたい。 VBA初心者ですみません。。 ご回答よろしくお願いします。

  • VBAの年月を取得したいのですが

    以下のように作成したのですが、 年:XXXX 4桁 できました。 月:XX 2桁ができません、1桁になります。   5月なら05として取得したいのですが、修正方法がわかりません A1には、2009/5/1と入力しています。 VBAに詳しい方で簡単に、どうぞお願いします。 Sub sample() Dim myDate As Date myDate = Range("A1").Value Range("B7").Value = Year(myDate) Range("C7").Value = Month(myDate) Range("D7").Value = Day(myDate) End Sub

専門家に質問してみよう