2024年7月8日月曜日

VBAでDOSコマンドを使う方法なんだが、フォルダの階層構造を書き出す課題で実験してみた(その一) ー WScript.Shell(VBAマクロ)

         
パソコンにWindowsが登場する以前は、DOS起動が最初に必要になりました。
ディスクオペレーティングシステムですが、画面表示は文字だけで殺風景です。

立ち上がりで日付と時刻の表示に続けて、コマンドプロンプトの”C:¥>”が登場。
ここから、実行させるコマンドを入力して、Lotus1-2-3なんかを動かしました。

もっとも、”Autoexec.bat”の自動実行ファイルにタイプすれば、連続起動です。
プロンプトから入力なんて不要になりましたが、今回の話は、DOSのコマンド。

よく使ったのは、”Dirでしてファイル名やサイズの一覧を出力して参照しました。
ただ、問題なのは、引数で”/P”を忘れると、画面が一時停止しないで流れます。

それで今回取り上げたのは、コマンドの”Tree”なんだけれど、表示が問題だな。
出力した画面が一時停止する引数がなく、走馬灯のように画面が表示し続ける。

ドライブ配下のフォルダー階層と含まれるファイルが一覧できると便利なのに。
つまり、ファイルの詳細ができなかったりしましたが、それも懐かしいお話だ。

NECはHDDがAドライブ
         
それで、こういったコマンドが忘れ去られたかというと、どっこいしぶといの。
ウインドウズでも、このコマンド入力のできる”CMD”ウインドウズがあるんだ。

”Dir”も、この”Tree”コマンドも出力はできますが、ツリー表示は走馬灯のまま。
だから、VBAでDOSコマンドを実行して、その結果をワークシートに書き出す。

まあ、こうすればデータが残されて、後から参照したり編集したりもできるな。
なので、そのサンプルコードを書きあげてみましたが、ネットの引用で大改造。

みんなは、引用元が同じと思われるコードを紹介していて、単なる使い回しだ。
コードの内容を理解しているとも思えず、ならばと一つのプロシージャに集約。

というわけで、下記に紹介しておきますので使ってみたい人はご自由にどうぞ。
一方、引用元が同じと思われたコードでは、プロシージャから関数プロシージャを呼出す構造で、しかも調べるフォルダーパスをブーリアン変数で真偽を調べるなど、少し蛇足なのではないかと思ったのでした。

※サンプルコード
Sub DrvFldrTreeShow()
Dim arr As Variant, DosCmnd As String
Dim WSH
  Cells.ClearContents
    Set WSH = CreateObject("WScript.Shell")
      DosCmnd = ""
        DosCmnd = DosCmnd & "cmd /c tree "
          DosCmnd = DosCmnd & "ここに検索先のパスを入れる"
        DosCmnd = DosCmnd & " /f" ’引数、/fは、ファイル名の表示
      DosCmnd = DosCmnd & ""
    Application.ScreenUpdating = False '実行速度を上げるので画面表示停止
  arr = Split(WSH.exec(DosCmnd).stdout.readall, vbCrLf)
Range("A1").Resize(UBound(arr)+1) = WorksheetFunction.Transpose(arr)
    Application.ScreenUpdating = True  '表示停止を解除して画面表示
End Sub

解説:
’取得情報が長いければ、wExec.stdout.readalldeでフリーズ回避
'ツリー構造を配列(横方向)に格納して、Transposeで縦(行)方向に変換
'Resize(UBound(arr) + 1)分の行範囲にサイズ変更(要素は、”0”ゼロスタートなので、個数的に1を追加)



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿