goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■WshShellオブジェクト.Execメソッド

2008-03-11 23:45:00 | VBA Tips
今日、勉強させてもらったばかりですが、

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

これでもいいかも。
(エラー処理はあまり考えてないので参考程度に)

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■[共有フォルダ]の情報取得 | TOP | ■グラフ[負の値を反転する] »
最新の画像もっと見る

Recent Entries | VBA Tips