今日、勉強させてもらったばかりですが、
With CreateObject("WScript.Shell")
With .Exec("%ComSpec% /c dir ""d:¥test¥"" /s/b")
Do While .Status = 0: Loop
Debug.Print .StdOut.ReadAll
End With
End With
こんな感じでコマンドプロンプトからDIRコマンドでファイル一覧を取得するような方法があります。
(かなり簡略化してます)
この時、出力量が多いと、Execメソッドがハングするそうです。
『Windows Script Host Laboratory』 の 過去ログ に
『2000/XPでは、ExecのStdOutに疑似パイプ(一時ファイル)ではなく、OSのpipeが使われているようです。
pipeには有限のメモリバッファがあり、溢れると書き込みがブロックされます』
とありました。
また、『運用 Windows管理者のためのWindows Script Host入門』には
『起動プログラムからの標準出力を処理する場合には、StdOutストリームの終端までを処理すれば、
Statusプロパティを意識することなく、実行が終了するまでの結果を読み込むことができる』
とあります。
...という事は、主要部分だけ簡単に書いてみると
こんな感じでできるようです。
また、Runメソッドを使って同期実行し、txt経由でシートに取り込むなら
これでもいいかも。
(エラー処理はあまり考えてないので参考程度に)
With CreateObject("WScript.Shell")
With .Exec("%ComSpec% /c dir ""d:¥test¥"" /s/b")
Do While .Status = 0: Loop
Debug.Print .StdOut.ReadAll
End With
End With
こんな感じでコマンドプロンプトからDIRコマンドでファイル一覧を取得するような方法があります。
(かなり簡略化してます)
この時、出力量が多いと、Execメソッドがハングするそうです。
『Windows Script Host Laboratory』 の 過去ログ に
『2000/XPでは、ExecのStdOutに疑似パイプ(一時ファイル)ではなく、OSのpipeが使われているようです。
pipeには有限のメモリバッファがあり、溢れると書き込みがブロックされます』
とありました。
また、『運用 Windows管理者のためのWindows Script Host入門』には
『起動プログラムからの標準出力を処理する場合には、StdOutストリームの終端までを処理すれば、
Statusプロパティを意識することなく、実行が終了するまでの結果を読み込むことができる』
とあります。
...という事は、主要部分だけ簡単に書いてみると
Sub try1() Const arg As String = "dir ""d:¥test¥"" /b/s" Dim Wsh As Object Dim ret As String Dim v() As String Set Wsh = CreateObject("WScript.Shell") ret = Wsh.Exec("%ComSpec% /c " & arg).StdOut.ReadAll v = Split(ret, vbCrLf) 'Excel2000は配列制限に注意。try2参考。 Sheets.Add.Cells(1).Resize(UBound(v) + 1).Value = Application.Transpose(v) Set Wsh = Nothing End Sub
こんな感じでできるようです。
また、Runメソッドを使って同期実行し、txt経由でシートに取り込むなら
Sub try2() Const wrk As String = "d:¥output.txt" '出力用。上書きに注意 Const arg As String = "dir ""d:¥test¥"" /b/s" Dim v() As String Dim x() As String Dim n As Long Dim i As Long CreateObject("WScript.Shell") _ .Run "%ComSpec% /c " & arg & ">" & wrk, 0, True n = FreeFile Open wrk For Input As #n v = Split(StrConv(InputB(LOF(n), #n), vbUnicode), vbCrLf) Close #n '1次元配列を2次元配列に。(Application.Transpose使えない場合) ReDim x(0 To UBound(v), 0 To 0) For i = 0 To UBound(x) x(i, 0) = v(i) Next Sheets.Add.Cells(1).Resize(UBound(x) + 1).Value = x End Sub
これでもいいかも。
(エラー処理はあまり考えてないので参考程度に)