Excelで、WScript.Shell、標準出力

このQ&Aのポイント
  • Excelで、WScript.Shellを使用して標準出力を経由してデータを取得する方法について解説します。
  • 標準出力のサイズ制限に関する問題について、解決策や制限を取り払う方法を模索しています。
  • 下記のコードを使用して標準出力の容量制限を確認しましたが、解決策が見つかっていません。どのように対処すればよいでしょうか?
回答を見る
  • ベストアンサー

Excelで、WScript.Shell、標準出力

Excelで、WScript.Shellを使って、標準出力を経由してデータを取得 Excelで、CreateObject("WScript.Shell")を使って、標準出力を経由してデータを取得したいと考えたのですが、サイズに制限がありそうです。 標準出力のサイズが4096バイトを超えると、DOS窓が閉じず、強制的に終了させると超えた分はどこかへ消えました。 下記のコードで確かめたのですが、何かこの容量の制限を取り払う方法はないでしょうか? Sub Sample1標準出力0() Dim WSH, wExec Dim sCmd As String Dim Result As String Set WSH = CreateObject("WScript.Shell") sCmd = "type D:\t.txt" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 DoEvents Loop Result = "" Result = wExec.StdOut.ReadAll Debug.Print Len(Result) MsgBox Result Set wExec = Nothing Set WSH = Nothing End Sub

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

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

申し訳、ございません。 完全な回答にはなっていないのですが、 Option Explicit Sub Test() Dim w, e As Object Dim c As String Dim r As Integer Set w = CreateObject("WScript.Shell") c = "type D:\t.txt" Set e = w.Exec("%ComSpec% /c " & c) r = 0 Do While e.Status = 0 r = r + 1 Cells(r, 1).Value = e.StdOut.ReadLine Loop Set e = Nothing Set w = Nothing End Sub と、1行ずつ読み込んでエクセルに書き出すと、かなりの量(4096バイトははるかに超えている)が書き出せたのですが、あと、何行か、残ってしまいました(私が読み込んだテキストデータに何か変な文字コードでも入っていた?)。 質問者のプログラムでしたら、「Do Wile・・・」の前に「Result = ""」とし、「Do While・・・Loop」の間に「Result = Result & wExec.StdOut.ReadLine & vbCrLf」とし、最後に「MsgBox Result」としてみてください。

tharch77
質問者

お礼

ReadLineメソッドを教えていただきありがとうございます。 その場合は、ループをAtEndOfStreamプロパティで回すようです。 (参考) http://www.atmarkit.co.jp/ait/articles/0907/29/news113.html ただし、1行が4096を超える場合は対応できないでしょう。(たとえばLFやCRが単独で改行となっている場合など)必要に応じて対応して行こうと考えています。 いずれにしても、一発でいける.ReadAllに頼っていました。手抜き、横着はほどほどに・・・ということですね。 ありがとうございました。

関連するQ&A

  • ipconfig /all を環境変数へ代入方法

    http://d.hatena.ne.jp/necoyama3/20081218/1229604217 にて、ipconfigコマンドを実行して標準出力を取得する方法があり、下記VBSで きちんと動くのですが、 ------------------------------- Dim objShell Dim wExec Dim sCmd Set objShell = CreateObject("WScript.Shell") ' コマンド生成 sCmd = "ipconfig" ' コマンド実行 Set wExec = objShell.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 Loop Result = wExec.StdOut.ReadAll MsgBox Result Set wExec = Nothing Set objShell = Nothing ----------------------------------- sCmdを下記に差し替えると、動かなくなります。 sCmd = "ipconfig /all" もしくは sCmd = "systeminfo" これらコマンドに差し替えてもVBSを動かす方法は ありますでしょうか。 直接、コマンドラインで ipconfig /all や systeminfoを入力する場合は きちんと出力されます。

  • Windows Script Hostは、スクリプ

    Windows Script Hostは、スクリプト言語なのでしょうか? Sub Sample() Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") Debug.Print WSH.SpecialFolders("Favorites") Set WSH = Nothing End Sub このようなコードでVBAでWSHを使っていますが WSHが何なのかわからないまま使っています。

  • 10分おきに自動でバックアップファイルを作成する

    エクセルファイルで 「10分おきに自動でバックアップファイルを作成する」 ということは可能ですか? Sub バックアップ作成() Dim myFSO As Object Dim MyFile As Object Dim WSH As Variant Dim strdate As String Set myFSO = CreateObject("Scripting.FileSystemObject") Set WSH = CreateObject("Wscript.Shell") strdate = Format(Now, "yyyy年mm月dd日hh時mm分") myFSO.CopyFile ActiveWorkbook.FullName, "D:\backup\" & strdate & ".xlsm" Set MyFile = Nothing Set myFSO = Nothing Set WSH = Nothing End Sub これでバックアップは作成できるのですが 「10おきに」というのはどうすればいいのでしょうか?

  • (VBA) Dir 関数で取得するファイル一覧の順序

    タイトルの通り、下記のサンプルコードを実行して取得するファイル一覧の順序についての質問です。 Public Sub Test1() Dim WSH As Object Dim MyPath As String Dim MyFileName As String Set WSH = CreateObject("WScript.Shell") MyPath = WSH.SpecialFolders("MyDocuments") MyFileName = Dir(MyPath & "\" & "*.*") Do Until MyFileName = "" MsgBox MyFileName MyFileName = Dir Loop Set WSH = Nothing End Sub (質問) ファイル名の昇順では取得できないようですが、もしファイル名の昇順に並べ替えるとしたら、 どのように処理したらよいのでしょうか?

  • エクセルVBA:perlで作成したexeが失敗する

    VBAプログラムで詰まってしまったので質問します。 perlにて自作したexeファイルをexcelのボタンから開きたいのですが、 実行の途中で止まってしまうようなのです。 止まってしまうexeファイルは、自分でダブルクリックして起動すると正常動作する為、 原因がわかりません。 'Declare Function ShellExecute Lib "shell32.dll" _ 'Alias "ShellExecuteA" ( _ 'ByVal hwnd As Long, _ 'ByVal lpOperation As String, _ 'ByVal lpFile As String, _ 'ByVal lpParameters As String, _ 'ByVal lpDirectory As String, _ 'ByVal nShowCmd As Long) As Long 'lRet = ShellExecute(0, "open", sPASS, vbNull, vbNull, SW_NORMAL) 'With CreateObject("Wscript.Shell") ' .Run "***********************", 5 'End With 'MsgBox "vbCrLf & CurDir & vbCrLf" 'Shell "**********************", 1 'With CreateObject("Wscript.Shell") ' .Run "..************", 5 'End With 'Dim ret As Long 'With CreateObject("Wscript.Shell") ' ret = .Run("*************", 7, True) 'End With 'If ret <> 0 Then MsgBox "失敗しました": Exit Sub 'Shell "*****************************" 'Dim WSH 'Set WSH = CreateObject("Wscript.Shell") 'WSH.Run "*************************", 3 'Set WSH = Nothing 'Dim file As Variant 'file = Application.GetOpenFilename 'file = "****************** " + file 'Shell (file) 'On Error GoTo errline 'ret = ShellExecute(0, "open", "***************", "", Path, 1) 'errline: 'Err = 0 'Dim ファイルのあるフォルダ As String 'Dim ファイルの名前 As String 'Dim プログラムのパス As String 'Dim 拡張子 As String 'ファイルのあるフォルダ = Worksheets("Sheet1").Cells(1, 1) 'ファイルの名前 = Worksheets("Sheet1").Cells(2, 1) 'プログラムのパス = Worksheets("Sheet1").Cells(3, 1) '拡張子 = Worksheets("Sheet1").Cells(4, 1) 'Dim ファイルのパス As String 'ファイルのパス = ファイルのあるフォルダ & "\" & ファイルの名前 & "." & 拡張子 'Dim AppFp As String 'AppFp = プログラムのパス & " """ & ファイルのパス & """" '前の""はスペース空ける '「"」が特殊文字であるため、スキップするための文字(エスケープ文字)「"」を前につける 'Dim a As Integer 'a = Shell(AppFp, vbNormalFocus) '上記プログラム全部× Const vbHide = 0 'ウィンドウを非表示 Const vbNormalFocus = 1 '通常のウィンドウ、かつ最前面のウィンドウ Const vbMinimizedFocus = 2 '最小化、かつ最前面のウィンドウ Const vbMaximizedFocus = 3 '最大化、かつ最前面のウィンドウ Const vbNormalNoFocus = 4 '通常のウィンドウ、ただし、最前面にはならない Const vbMinimizedNoFocus = 6 '最小化、ただし、最前面にはならない 'Dim objWShell 'Set objWShell = CreateObject("WScript.Shell") 'できたが×途中で終了している模様 'フォルダ「C:\happy」を開きます 'objWShell.Run "rundll32.exe url.dll" & _ ' ",**************", vbNormalFocus, False 'WScript.Echo "**********を実行しました!" 'Set objWShell = Nothing どうにかVBAから起動したいのですが、方法は無いでしょうか??

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

  • VBAでコマンドプロンプトの結果を変数に代入

    コマンドラインソフトのffmpegを使って、動画の再生時間などを取得したいのですが VBAでコマンドプロンプトの結果を変数に代入する方法について教えてください。 "D:\xxxx\ffmpeg\bin\ffmpeg" -i "d:\xxxx\aaff.mp4" 2>&1 | grep Duration これをコマンドプロンプトで実行すると d:\xxxx\aaff.mp4の再生時間などがコマンドライン上に表示されます。 これを変数に代入するために、 http://officetanaka.net/excel/vba/tips/tips27.htm このページを参考にして Sub Sample1() Dim WSH, wExec, sCmd As String, Result As String Set WSH = CreateObject("WScript.Shell") ''(1) sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) ''(3) Do While wExec.Status = 0 ''(4) DoEvents Loop Result = wExec.StdOut.ReadAll ''(5) MsgBox Result Set wExec = Nothing Set WSH = Nothing End Sub を実行しました。 しかしResultには何の文字列も代入されませんでした。 恐らく、このページのタイトルにもあるように「MS-DOSコマンドの標準出力を取得する」 とあるので、標準出力しか取得できないのではないかと思います。 それでは一般的なコマンドラインソフトの実行結果を変数に代入するにはどうしたら良いでしょうか?

  • VBAでDOS プロンプトを使いたいのですが・・・

    デスクトップの\dataフォルダに、名前を付け替えたいファイルが多数あります。 それらのファイル名(旧名)と、変更したい名前(新名)は、エクセル上の2列に 入力済みです。VBAを使って、dosプロンプトのRENを実行しようとしましたが、 多くのファイル名にスペースが含まれるせいか、大半が変更できませんでした。 良い方法があれば、教えてください。どうかよろしくお願いします。 ※作成したプロシージャは以下の通りです。 Sub ファイル名変更() Dim カウンタ As Integer For カウンタ = 2 To 1000 Dim wsh As Object, wexec As Object, cmd As String Dim 旧名 As String, 新名 As String Set wsh = CreateObject("wscript.shell") 旧名 = Cells(カウンタ, 1).Value     '旧名はA列にある 新名 = Cells(カウンタ, 2).Value    '新名はB列にある cmd = "ren c:\users\me\desktop\data\" & 旧名 & " " & 新名 Set wexec = wsh.Exec("%comspec% /c " & cmd) Set wexec = Nothing Set wsh = Nothing Next End Sub

  • Object型じゃない型で宣言したいです。

    Function MyDesktop() Dim WSH Set WSH = CreateObject("Wscript.Shell") MyDesktop = WSH.SpecialFolders("Desktop") Set WSH = Nothing End Function このコードの Dim WSH に、ちゃんと変数の宣言をしてあげたいのですが 何で変数の宣言をして、どこに参照設定をすればいいのでしょうか? Object型じゃない型で宣言したいです。

  • コマンドプロンプトの出力をVBScript内の変数に代入する

    VBScriptからコマンドプロンプトのver | findstr 5.1を実行し、その出力結果をVBScript内の変数に代入したいのですが、どうすればいいでしょうか? Dim WShell Dim result Set WShell = WScript.CreateObject("WScript.Shell") WShell.Run "cmd /c (ver | findstr XP > " & result & ")" MsgBox result とやってもresultには何も入っていませんでした。

専門家に質問してみよう