- ベストアンサー
VBAでdosのcompコマンドの実行結果を得たい
- Excel2010のVBAで、MS-DOSのcompコマンドの実行結果を取得する方法を教えてください。
- 現在、file1とfile2のパスを指定してcompコマンドを実行していますが、うまくいきません。
- どのようにすれば正しくcompコマンドの実行結果を取得できるでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
compコマンドは ほかのファイルを比較しますか (Y/N)? と言うプロンプトを「標準エラー出力」に出力します。 ですので If wshExec.StdErr.AtEndOfStream = False Then が「真」になり 'エラー result = wshExec.StdErr.ReadAll だけが実行されます。 そして、resultには ほかのファイルを比較しますか (Y/N)? と言う文字列が返って来ます。 なので MsgBox result とやっても ほかのファイルを比較しますか (Y/N)? しか表示されず、欲しい結果は得られません。 なので「標準エラー出力になにか出力されても、無視する」ようにして下さい。 つまり '判定しない ’If wshExec.StdErr.AtEndOfStream = False Then 'エラー 'result = wshExec.StdErr.ReadAll 'Else '正常 result = wshExec.StdOut.ReadAll 'End If のように、if文をコメントアウトして下さい。 なお「compコマンドは、プロンプトを出して、yかnが入力されるまで、待ってしまう」ので command = "echo n | comp " & file1 & " " & file2 にしないといけません。じゃないと「手でnを入力しないとcompコマンドが終了しない」です。
その他の回答 (2)
- Prome_Lin
- ベストアンサー率42% (201/470)
私が調べたサイトでは、以下のようになっていました。 Sub Test() Dim w, x As Object Dim c, r As String Set w = CreateObject("WScript.Shell") c = "comp D:\Programming\Book1.csv D:\Programming\Book2.csv" Set x = w.Exec("%ComSpec% /c " & c) Do While x.Status = 0 DoEvents Loop r = x.StdOut.ReadAll MsgBox r End Sub ただ、そのサイトの説明では「%ComSpec% /c」の「/c」で実行後、コマンドプロンプトの画面が閉じる、ということでしたが、私が試したところ、閉じませんでしたが、エクセルの画面上に結果は表示されていましたので、文字列変数「r」には、間違いなく、コマンドプロンプト上で「comp」が実行され、その結果までの内容が格納されています。
お礼
上記のコードを試してみました。 コマンドプロンプトの画面は開いた状態のままで Do~Loopの所で x.Status = 0 の条件が満たされずに ループし続けていますので、 その後の MsgBox r は実行されず 結果は表示されませんでした。 なお、f272さん、chie65535さんから 頂きました方法で解決できました。 ありがとうございました。
- f272
- ベストアンサー率46% (8467/18126)
If wshExec.StdErr.AtEndOfStream = False Then で分けなくてもいいんじゃないの? 単に,コマンドを command = "echo n | comp " & file1 & " " & file2 これにして result = wshExec.StdOut.ReadAll これだけ
お礼
result = wshExec.StdOut.ReadAll だけにしてみたらうまくいきました。 最初、このようにしなければならない理由が よく分からなかったのですが その後のchie65535さん頂いた回答で この理由が理解できました。 ありがとうございました。
お礼
エラーが発生した時だけ wshExec.StdErr.AtEndOfStream = False が「真」になると思い込んでいました。 教えていただきました方法で、 compコマンドの実行結果を正しく 取得することができました。 ありがとうございました。