質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

3052閲覧

VBAでコンソールアプリの結果を取得したい

x86

総合スコア7

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2021/07/28 23:22

よろしくお願いいたします。
VBAでコンソールアプリを実行するには

rc = Shell("nslookup”)

と行いますが、この場合rcにはコンソールアプリが実行した結果が得られません。

nslookupをvbaで立ち上げ、以下のように結果を取得するにはどのようにすれば良いのでしょうか?
どのような方法でも良いのでご教授お願い致します。

既定のサーバー: sv**.**.**.jp Address: ×.×.×.× > www.xxxxx.com         ←VBAで命令を送付 サーバー: sv**.**.**.jp     ←この結果を取得したい Address: ×.×.×.×

また、以下の方法だとアプリがコンソールに結果を出力する場合にはResultにその結果が
出力されますが、コンソールアプリとやり取りを行う場合、コンソールに結果が出力されるまで
待つことになり、
(3)を行った時点でコンソールで止まってしまいます。

  Dim sh, ex, cmd As String, Result As String Set sh = CreateObject("WScript.Shell") ''(1) cmd = "nslookup" ''(2) Set ex = sh.exec("%ComSpec% /c " & cmd)   ''(3) Do While ex.Status = 0  ''(4) DoEvents Loop Result = ex.StdOut.ReadAll

コンソールアプリ内の結果を取得するにはどのように行えばよいのでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/07/29 00:25 編集

対話的に処理したいのなら、終了を待たずに、ReadLineで読めば良いかと。 終了を待てば、終了まで待つのは自明です。
x86

2021/07/29 00:26

ありがとうございます。 VBAがあまりくわしくないので、もう少し具体的に教えてもらえないでしょうか?
guest

回答1

0

ベストアンサー

コメントに書いたように、応答を見ながら入力するコマンドを変えるのであれば、1行単位で読んでその内容を判断しながら進めます。

応答を見ずに一方的に入力するなら、

VBA

1 Set sh = CreateObject("WScript.Shell") 2 cmd = "nslookup" 3 Set ex = sh.exec("%ComSpec% /c " & cmd) 4 ex.StdIn.WriteLine "入力したいコマンド" 5 ex.StdIn.Close 6 Result = ex.StdOut.ReadAll

ですが、それならコマンドラインで指定しても良いかもしれません。

投稿2021/07/29 00:35

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x86

2021/07/29 01:03

すみません、つまり応答を見ながら入力するコマンドを変える方法も教えていただけないでしょうか?
otn

2021/07/29 01:24

ReadLineで読んで、ifで何らかの判断をして、WriteLineでコマンドを書き込みます。 ただし、出力が無い状態でReadLineを実行すると待ちで止まってしまうので、 よく考える必要があります。
x86

2021/07/29 01:40 編集

お手数かけて本当にすみません。 ReadLineの使い方がわからなのですが、以下の①の部分に入れるということでしょうか? また、止まらないようにするためにはどのように回避すれば良いでしょうか? Set sh = CreateObject("WScript.Shell") cmd = "nslookup" Set ex = sh.exec("%ComSpec% /c " & cmd) ex.StdIn.WriteLine "コマンド"   ・・・・・・・・・・・① ex.StdIn.Close Result = ex.StdOut.ReadAll
otn

2021/07/29 01:48

> ReadLineの使い方がわからなのですが、以下の①の部分に入れるということでしょうか? 例えばそうですね。 > また、止まらないようにするためにはどのように回避すれば良いでしょうか? 出力があるかないかを人間があらかじめ判断しておいて、出力が無い状態ではReadLineしないようにします。 例えば、コマンド起動直後には3行出力されて入力待ちになるのであれば、 ReaLineは3回だけ行って4回目はコマンドを入力するまで行わないようにします。
x86

2021/07/29 01:51

ご回答ありがとうございます。感謝いたします。 上記の例で①にReadLineを入れると、 ex.StdIn.WriteLine "コマンド" の部分で止まってしまいませんでしょうか?
otn

2021/07/29 02:10

なぜ? WriteLineが止まることは無いと思いますが。(エラーになることはある)
x86

2021/07/29 03:26

よくVBAを解っていないのですみません。 いろいろとすみません。 あと、Shellでも外部ソフトを立ち上げることができますが、そちらでは応答を見ながら入力するという ことは不可能なのでしょうか? お手数かけてすみません。
otn

2021/07/29 04:07

標準入出力を使うものは可能でしょう。 可能であっても困難かも知れませんが。
x86

2021/07/29 04:55

いろいろありがとうございました。 ご回答をお付き合いいただきありがとうございました。 少し、自分で調べてみます。 またわからなければ、同様の質問をすぐに上げさせていただきます。 また、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問