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

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

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

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

Q&A

解決済

1回答

4121閲覧

コマンドプロンプトでの実行結果をExcel VBAでWshShellを使って取得する。

nayameru

総合スコア8

VBA

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

0グッド

0クリップ

投稿2021/06/19 04:39

Windows10のコマンドプロンプトにおいて、
ある実行ファイルの実行結果をExcel VBAでWshShellを使って取得しようとしているのですが
うまく行きません。
下記コードでfncWinScriptが空になります。
コマンドプロンプトでの手動実行では、実行完了までに1分10秒程度掛かりますが、
下記コードでも同じくらいの時間で返ってきますので、実行完了はしていると思われます。
コマンドプロンプトでの手動実行では、
数字がインクリメントされたりの進捗表示があってから
(ここが曲者ではないかと考えています)、
2400行程度の結果が出力されます。
output = output & wExec.StdOut.Read(1)
は、これが無いとStatusが0のままループを抜けないので、入れています。
outputには上記進捗表示の表示履歴が入っているようです。

Excel

1Public Function fncWinScript(実行パス As String, command As String) As String 2Dim WSH As WshShell 3Dim wExcec As Object 4Dim output As String 5 6Set WSH = New WshShell 7Set wExec = WSH.Exec("%ComSpec% /c " & "set LESSCHARSET=utf-8 && cd " & 実行パス & " && " & command) 8 9Do While wExec.Status = 0 10 output = output & wExec.StdOut.Read(1) 11 DoEvents 12Loop 13 14Sleep(1000) 15DoEvents 16 17fncWinScript = wExec.StdOut.ReadAll() 18 19Set wExec = Nothing 20Set WSH = Nothing 21 22End Function

何か分かりましたらアドバイス頂きたくよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

outputを捨てているからでは?

VBA

1fncWinScript = output & wExec.StdOut.ReadAll()

投稿2021/06/19 10:45

otn

総合スコア85778

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

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

nayameru

2021/06/19 13:19

そうですね。 outputに何か入っているようですので何とかなりそうです。 wExec.StdOut.Read(1) wExec.StdOut.ReadAll() の使い方がよく分かりませんが。 wExec.StdOut.ReadAll() は空になるのですかね?
otn

2021/06/19 13:31

文字通りなのですが、、、Read(1)は1文字読む、ReadAll()は全部読む(まだ読んでいない物全部)。 何のために output = output & wExec.StdOut.Read(1) しているのでしょうか?
nayameru

2021/06/20 04:27

ありがとうございます。非常に助かります。 > 何のために output = output & wExec.StdOut.Read(1) しているのでしょうか? > output = output & wExec.StdOut.Read(1) > は、これが無いとStatusが0のままループを抜けないので、入れています。 なのですよね。。。なぜか。。。
otn

2021/06/20 07:06

そうか。2400行と言うことなので、パイプのバッファー以上のデータサイズになり、読んであげないと書き込み側が待ちになるんですね。データが数百バイトだと不要のはずです。
nayameru

2021/06/20 07:48

ありがとうございます。そうなんですね。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問