• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでdosのcompコマンドの実行結果を得たい)

VBAでdosのcompコマンドの実行結果を得たい

このQ&Aのポイント
  • Excel2010のVBAで、MS-DOSのcompコマンドの実行結果を取得する方法を教えてください。
  • 現在、file1とfile2のパスを指定してcompコマンドを実行していますが、うまくいきません。
  • どのようにすれば正しくcompコマンドの実行結果を取得できるでしょうか?

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

  • ベストアンサー
回答No.2

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コマンドが終了しない」です。

yam2012
質問者

お礼

エラーが発生した時だけ wshExec.StdErr.AtEndOfStream = False が「真」になると思い込んでいました。 教えていただきました方法で、 compコマンドの実行結果を正しく 取得することができました。 ありがとうございました。

その他の回答 (2)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

私が調べたサイトでは、以下のようになっていました。 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」が実行され、その結果までの内容が格納されています。

yam2012
質問者

お礼

上記のコードを試してみました。 コマンドプロンプトの画面は開いた状態のままで Do~Loopの所で x.Status = 0 の条件が満たされずに ループし続けていますので、 その後の MsgBox r は実行されず 結果は表示されませんでした。 なお、f272さん、chie65535さんから 頂きました方法で解決できました。 ありがとうございました。

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

If wshExec.StdErr.AtEndOfStream = False Then で分けなくてもいいんじゃないの? 単に,コマンドを command = "echo n | comp " & file1 & " " & file2 これにして result = wshExec.StdOut.ReadAll これだけ

yam2012
質問者

お礼

result = wshExec.StdOut.ReadAll だけにしてみたらうまくいきました。 最初、このようにしなければならない理由が よく分からなかったのですが その後のchie65535さん頂いた回答で この理由が理解できました。 ありがとうございました。