たくさんあるハードディスクのフォルダ構成一覧を作成する

Office製品

 ふと、たくさんある外付けハードディスクのフォルダー構成を作って置いた方がよいと気づきました。

 フォルダ構成を見れば、どのフォルダにどんなファイルが入っているかは想像できます。ファイル一覧という考えも浮かびましたが、数万のファイル名を保存しても使い道がありません。ファイルを探すのならEverthingで簡単にできます。しかし、どのハードディスクに入っているかは接続してみるまで分からない。

昔はディレクトリ構成図をつくれる「ちょい便利屋アドイン」があった

 管理人の頭に浮かんだのは、「ちょい便利屋アドイン」という2007年ころリリースされたExcelアドインです。このアドインにはいくつかの機能があるのですが、「ディレクトリ構成図作成」という機能はなかなかの優れもの。

 下の画面のように、リストから「ディレクトリ構成図作成」を選ぶと、任意のディレクトリの構成図を生成してくれます。

 サンプルとして、下のようなフォルダ構成を作りました。これをエクセル上でいかにシンプルに再現できるかがポイントになります。

 「ちょい便利屋アドイン」を使います。

 できあがりが下の画像です。必要最小限の情報をコンパクトに表示してくれます。

 実は、このアドインは現在入手できません。更に、最新のWindows11、Officeでは動きません。

 えっ、動いているじゃん。これはOffice2019(64ビット版)でも動くように管理人が勝手に改造したから動いているだけです。

使えない「Relaxtools」

「ディレクトリ構成図作成」をネットで調べると、「Relaxtools」というアドインがヒットします。

 ダウンロードしてみると、昔、ちょっとだけ使ってみて使い物にならないアドインと分かったので削除したものでした。

 なぜ、使えないかは、下の画像を見れば分かります。

 こんなもの誰が使うのでしょうか。一番の問題は空白行があるため、無駄に巨大なツリーになること。ルート配下のサブフォルダーが数百もある場合、使い物になりません。とにかくコンパクトにツリーを生成することが求められます。

「自分で作ってみる」のは大変なので、AIにマクロを作らせる

最初は、「ちょい便利屋アドイン」を期待していました。昨年まで使っていたExcel2003では問題なく動いたのですが、Excel2019では全く動きません。よく分かりませんが、64ビットExcelではコードが違うので、32ビット用に書かれたマクロではエラーが出ます。ひとまず、Excel2019でも動くようにコードを書き換えて使ってみました。例えば、64ビットシステムに対応するために、BROWSEINFOタイプのデータ型をLongPtrに変更する必要があります。

 でも、出力結果がイメージしたものと少し違う。もっとシンプルでいい。改造するか迷ったのですが、ふと、AIなら簡単に作れるのではないかと気づきました。

CopilotにVBAを書かせる

 昔なら、自分でやったのですが、現在、こんなことに時間を使いたくない。そこで、CopilotにVBAをコーデングさせることにしました。AIが最も得意とする分野の1つです。

 言うのは簡単ですが、Copilotの性能を理解していないと時間ばかりかかり、全く時短になりません。

 要は、どのような出力イメージなのかを「ちょい便利屋アドイン」の生成結果をサンプル画像としてアップして、細部を具体的に指示していきます。最初はとても使い物にならないコーディングしかできません。不足する機能を順次追加していきます。

 一応、「ちょい便利屋アドイン」と同じような機能のマクロを64ビット版Excelでも動くように書くことができ、マクロ付きファイル(xlsm)に保存しました。

 作った結果が下のものです。とてもコンパクトで見やすいと思います。A列に全て入っているので、何かと使い勝手が良いと思います。

 このマクロ、結構使えます。

 では、このマクロの作り方と使い方を説明します。

フォルダ構造作成マクロ

 フォルダ構成作成マクロを、マクロの知識のない方でも作成し、使えるように説明します。マクロのセキュリティ関係は自分で調べてください。

1. Excelを起動します。新規作成で空白のシートを開いておきます。

2. [ALT]+[F11] で「Microsoft Visual Basic for Applications」画面を開きます。(Visual Basic Editor(VBE)画面)

 下の画像の画面になると思います。違う画面が表示された場合は、メニューバーの[表示] ⇒ [プロジェクト エクスプローラー]で開いてください。

 VBAを書き込むModuleを作ります。メニューの[挿入] ⇒ [標準モジュール]と進むと、左側のツリーに[Module1]が追加されます。

左ペインで[Module1]が選択された状態で、右ペインにVBAを書き込みます。実際には、Copilotが生成したVBAです。下のコードをコピーし、Module1の右の空欄に貼り付けます。

Sub SelectFolderAndList()
    Dim folderPath As String
    Dim includeSubfolders As VbMsgBoxResult
    
    folderPath = SelectFolder()
    
    If folderPath <> "" Then
        includeSubfolders = MsgBox("下位階層まで出力しますか?", vbYesNo + vbQuestion, "確認")
        ListFolders folderPath, (includeSubfolders = vbYes)
    Else
        MsgBox "フォルダが選択されませんでした。"
    End If
End Sub

Function SelectFolder() As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "フォルダを選択してください"
        .AllowMultiSelect = False
        If .Show <> -1 Then GoTo NextCode
        sItem = .SelectedItems(1)
    End With
NextCode:
    SelectFolder = sItem
    Set fldr = Nothing
End Function

Sub ListFolders(folderPath As String, includeSubfolders As Boolean)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add
    ws.Cells.Clear
    
    ' ヘッダー行を追加
    ws.Cells(1, 1).Value = "フォルダ構成"
    ws.Cells(1, 1).Font.Bold = True
    ws.Cells(1, 1).Font.Size = 12
    
    Dim row As Long
    row = 2
    
    ws.Cells(row, 1).Value = folderPath
    ws.Cells(row, 1).Font.Size = 10
    ListSubFolders folderPath, ws, row, 1, includeSubfolders
    
    ' 列幅を自動調整
    ws.Columns("A:A").AutoFit
End Sub

Sub ListSubFolders(folderPath As String, ws As Worksheet, ByRef row As Long, indentLevel As Integer, includeSubfolders As Boolean)
    Dim fso As Object
    Dim folder As Object
    Dim subFolder As Object
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    For Each subFolder In folder.SubFolders
        row = row + 1
        ws.Cells(row, 1).Value = String(indentLevel * 4, " ") & "┣ " & subFolder.Name
        ws.Cells(row, 1).Font.Size = 10
        If includeSubfolders Then
            ListSubFolders subFolder.Path, ws, row, indentLevel + 1, includeSubfolders
        End If
    Next subFolder
End Sub

 貼り付けたら、画面左上の[X]をクリックしてエディターを閉じます。

 エクセルの画面に戻るので、ブックを保存します。このブックをフォルダ構成一覧を作成する専用のマクロ付きファイルとして保存します。

 保存には、[ファイル] ⇒ [名前をつけて保存] ⇒ [参照]と進み、保存したい場所を選び、名前をつけて、ファイルの種類を[Excelマクロ有効ブック(*.xlsm)]で保存します。

 Excelで作成した通常のファイルの拡張子は「xlsx」ですが、マクロ付きファイルは「xlsm」になります。

 次に、実際に使ってみます。

 Excelのメニューの[開発]タブ ⇒ [マクロ]と進みます。

 [開発]タブはデフォルトでは非表示です。[ファイル] ⇒ [その他] ⇒ [オプション] ⇒ [リボンのユーザ設定]、を開いて、右側にある「開発」のチェックを入れると開発タブが表示されるようになります。

 [マクロ]ボタンをクリックすると下のウインドウが開くので、[実行]ボタンをクリック。後は画面の指示に従い、ディレクトリ構成を作成したいフォルダを選択します。

アドイン化

 このブックをアドインにしようと思ったのですが、挫折しました。

 理由は、Excelの挙動がおかしいことです。

 登録したアドインを使うには、メニューの[アドイン]ボタンをクリックし、リストから登録されているアドインを選んで使うのですが、これがうまく機能しない。

 今回のマクロをアドインにしたときの画像です。リストに「Select Folder and List」が二重表示されています。これがどうやっても消せない。

 更に、登録したアドインが表示されなくなる。最悪なのは、[アドイン]タブ自体が消えてしまい、どうやっても表示できない。

 ネットで探しても解決策は皆無。当たり前のことしか書かれていません。Officeを再インストールしても結果は同じ。設定ファイルが残っていて、それが壊れているのではないかと思いますが、分からない。

 everythingを起動し、Excelのアドインを変更したとき、どのファイルが変更されるのかも調べましたが、解決には至りません。

 これは、Excelのバグなのか。それとも・・・。

 何となく心当たりがあります。このような不具合は、何か別のソフトと競合しているため発生しているのではないか、と感じました。たぶん、GeForceかProess Lassoあたりが怪しい。

 いずれにしろ、[アドイン]タブが消えてしまったのでは、アドイン化の作業はできません。このため、作業は止めました。たぶん動くと思うのですが、作動の確認ができません。

現実問題として、アドインを作っても使い道がありません。マクロ付きブックで十分です。