🚅

Excel VBAでファイル名を一括変更!「地味にツラい」作業を軽減す「excel-bulk-file-renamer」を開発した話

に公開

🎯 この記事の対象読者

  • 日々のファイル整理に時間を奪われているすべての自治体職員の皆さん
  • 「DXって言われても、何から始めればいいの?」と感じている方
  • 自治体の業務改善を身近なツールで実現したいと考えているエンジニアやDX推進担当者
  • 「マイクロDX」というキーワードにピンときた方

💡 この記事を読むと得られること

  • Excel VBAを使って、面倒なファイル名の一括変更や整理を自動化する具体的な方法
  • 明日から使えるファイル整理ツール「excel-bulk-file-renamer」の存在とその使い方
  • 大げさなシステム導入だけがDXじゃない、「マイクロDX」という考え方と、そのはじめの一歩を踏み出す勇気

🚀 はじめに:なぜこの記事を書いたか

「自治体のDX推進、まずは業務改革から!」「データ利活用が重要だ!」

最近、こんな言葉をよく耳にしませんか? まったくもってその通り。でも、思うんです。「で、現場の仕事、具体的に"楽"になってるかな?」って。

自治体の現場は、今も昔も「文書中心主義」。きっちり定められた文書分類ルールに従って、日々大量のドキュメントを管理しています。理想はわかる。でも現実は、ファイルサーバーに散らかった無数のファイルたちと格闘して業務を遂行する日々。誰かが右クリックでファイル名を一つひとつ直し、不要なファイルを一つひとつ削除する...。これって、本来やりたかった仕事じゃないですよね?

この「管理のための管理作業」に追われる状況、なんとかしたい。大げさなDXじゃなくていい。まずは、この地味だけど確実につらい作業をデジタルで置き換える「マイクロDX」から始められないか。

そんな想いから、使い慣れたExcelだけで、あの煩わしいファイル整理がサクッと終わるツールを作ってみました。この記事が、同じように感じているあなたの「小さな一歩」のきっかけになれば、最高に嬉しいです。


😫 課題:ファイルサーバーは無法地帯?地獄のファイル整理

皆さんの職場にもありませんか? 特定の人しかルールを理解していない、無法地帯と化した共有フォルダが。気づけばファイル名はバラバラ、何故異動した人の名字のフォルダが残っている?不要なファイルも溜まり放題...。年度末の大掃除は、まさに地獄です(絶望ライン工さん風)。

これまでのファイル整理は、こんな感じでした。

歴史あるフォルダのお掃除のお作法

この単純作業に一体どれだけの時間が溶けているのか...。本来、もっと住民サービスや業務効率を向上させるための企画やアイデア出しに使いたい時間なのに!


✨ 解決策:Excelで爆速リネーム!「excel-bulk-file-renamer」

そんな地獄のファイル整理を天国に変えるために開発したのが、この「excel-bulk-file-renamer」です!

項目 内容
ツール名 excel-bulk-file-renamer
概要 Excelシート上で、大量のファイル名の一括変更、一括削除、さらには新規フォルダの作成まで、直感的な操作で実現できるツールです。
利用シーン 年度末の文書整理、プロジェクト完了後のファイル棚卸し、日々のちょっとしたフォルダ整理など
GitHubリポジトリ https://github.com/HosoyaYusaku/excel-bulk-file-renamer

🛠️ 技術スタックと選定理由

特別なソフトは一切不要! 皆さんのPCに必ず入っている「あのソフト」だけで動きます。

技術 役割 選定理由
VBA (Visual Basic for Applications) 開発言語 自治体職員にとって最も身近で、特別な環境構築なしにすぐ使える「最強の相棒」だからです。普段の業務で使い慣れたExcelの延長線上で、強力な自動化を実現できる点にこだわりました。

📜 コードのハイライト

このツールの頭脳部分、入力された内容をチェックして「OK」「エラー」などを判断するValidateRow関数と、実際にファイル操作を行うExecuteChange関数のコードを少しだけお見せします。VBAでも、こうやって処理を部品(関数)に分けることで、複雑な処理もスッキリ書けるんです。

'======================================================================================
' 入力内容を検証する関数(ツールの頭脳部分)
'======================================================================================
Private Function ValidateRow(ByVal ws As Worksheet, ByVal row As Long, ByVal parentFolder As String, ByVal fso As Object) As Object
    Set ValidateRow = CreateObject("Scripting.Dictionary")
    
    Dim userInput As String: userInput = Trim(CStr(ws.Cells(row, COL_NEW_NAME).Value))
    Dim itemID As String: itemID = CStr(ws.Cells(row, COL_NUM).Value)
    Dim status As String: status = ""
    Dim cellColor As Long: cellColor = COLOR_NONE
    
    If userInput <> "" Then
        If UCase(userInput) = DELETE_KEYWORD Then
            If IsNumeric(itemID) Then ' 既存のアイテムかチェック
                status = "OK: 削除します"
                cellColor = COLOR_DELETE
            Else
                status = "エラー: 新規行は削除できません"
                cellColor = COLOR_ERROR
            End If
        Else
            Dim newBaseName As String: newBaseName = SanitizeBaseName(userInput, fso)
            Dim finalNewName As String
            
            ' 新しい名前が既存のファイル/フォルダと重複しないかチェック
            If ws.Cells(row, COL_TYPE).Value = "File" Then
                finalNewName = newBaseName & "." & ws.Cells(row, COL_EXTENSION).Value
            Else
                finalNewName = newBaseName
            End If

            If itemID = "" Then ' 新規作成の場合
                If fso.FolderExists(fso.BuildPath(parentFolder, finalNewName)) Then
                    status = "エラー: フォルダが既に存在"
                    cellColor = COLOR_ERROR
                Else
                    status = "OK: 新規フォルダ作成"
                    cellColor = COLOR_OK
                End If
            Else ' 既存アイテムの名称変更の場合
                If fso.FileExists(fso.BuildPath(parentFolder, finalNewName)) Or fso.FolderExists(fso.BuildPath(parentFolder, finalNewName)) Then
                    status = "エラー: 名前が既に存在"
                    cellColor = COLOR_ERROR
                Else
                    status = "OK: 名称変更"
                    cellColor = COLOR_OK
                End If
            End If
        End If
    End If
    
    ' 結果をDictionaryオブジェクトに格納して返す
    With ValidateRow
        .Add "status", status
        .Add "color", cellColor
        .Add "isDelete", (UCase(userInput) = DELETE_KEYWORD)
        ' ... 他のプロパティも追加 ...
    End With
End Function

'======================================================================================
' 検証結果に基づき、実際のファイル操作を実行する
'======================================================================================
Private Sub ExecuteChange(ByVal result As Object, ByVal parentFolder As String, ByVal fso As Object)
    If result("isDelete") Then
        ' 削除操作
        If result("itemType") = "File" Then
            fso.DeleteFile result("originalPath"), True
        ElseIf result("itemType") = "Folder" Then
            fso.DeleteFolder result("originalPath"), True
        End If
        Exit Sub
    End If

    ' リネームまたは新規作成操作
    Dim finalNewName As String
    If result("itemType") = "File" And result("isNew") = False Then
        finalNewName = result("newBaseName") & "." & result("originalExtension")
    Else
        finalNewName = result("newBaseName")
    End If
    
    Dim newPath As String: newPath = fso.BuildPath(parentFolder, finalNewName)
    
    If result("isNew") Then
        fso.CreateFolder newPath
    Else
        If result("itemType") = "File" Then
            fso.MoveFile result("originalPath"), newPath
        ElseIf result("itemType") = "Folder" Then
            fso.MoveFolder result("originalPath"), newPath
        End If
    End If
End Sub

💻 使い方

このツールは、完成品のExcelファイルとして提供されているわけではありません。VBAのコード部品モジュール)をご自身のExcelファイルに組み込んでセットアップすることで、どんなExcelファイルでもあなた専用のファイル整理ツールに変身させることができます。

少しだけ手順が必要ですが、一度設定すれば、あとはボタン操作だけで快適に利用できます。丁寧に解説しますので、ぜひ挑戦してみてください!

① 準備編:自分のExcelにツールをセットアップする

まずは、ツールの心臓部であるVBAモジュールを手に入れ、ご自身のExcelに組み込む作業から始めましょう。

  1. マクロの部品(.basファイル)をダウンロード
    はじめに、以下のGitHubリポジトリにアクセスします。

    ページが開いたら、フォルダ一覧から vba_module をクリックし、次に BulkRenamer.bas をクリックします。

    コードが表示されたら、右上にある Raw ボタンを右クリックし、「名前を付けてリンク先を保存」または「リンク先を別名で保存」を選択して、BulkRenamer.bas ファイルをPCの分かりやすい場所(デスクトップなど)に保存します。

  2. マクロ有効Excelブックを準備
    次に、Excelを起動して新しい空のブックを開きます。そして、最も重要なこととして、このブックを「マクロ有効ブック (.xlsm)」形式で保存します。
    「ファイル」タブ → 「名前を付けて保存」を選び、ファイルの種類で「Excel マクロ有効ブック (*.xlsm)」を選択してください。ファイル名は何でも構いません(例: ファイル整理ツール.xlsm)。

  3. VBAモジュールをインポート
    いよいよ、ダウンロードした部品をExcelに組み込みます。
    Excelの画面で Alt + F11 キーを同時に押して、VBE(Visual Basic Editor)という専門家っぽい画面を開きます。

    画面の左側にある「プロジェクト エクスプローラー」で、VBAProject (あなたのファイル名.xlsm) と書かれた部分を右クリックし、「ファイルのインポート」を選択します。

    ファイル選択ダイアログが表示されたら、手順1で保存した BulkRenamer.bas ファイルを選んで「開く」をクリックします。
    プロジェクト エクスプローラーの「標準モジュール」フォルダの中に BulkRenamer が追加されれば、インポートは成功です。

  4. 魔法の呪文で操作ボタンを作成
    最後の準備です。シート上に便利な操作ボタンを作成します。
    Excelのシート画面に戻り、Alt + F8 キーを同時に押してください。マクロの一覧が表示されます。

    一覧の中から Macro1_CreateControlButtons を選択し、「実行」ボタンをクリックします。

    「操作用ボタンをシート上に作成しました。」というメッセージが表示され、シートの右側に3つのボタンが自動で作成されたら、セットアップはすべて完了です!

② 実践編:ボタンを使ってファイルを整理する

お疲れ様でした! あとは、作成されたボタンを使って直感的に操作するだけです。

  1. [ボタン1] 整理したいフォルダを選択する
    1. フォルダを選ぶ (一覧表示) ボタンをクリックします。フォルダ選択画面が表示されるので、整理したいフォルダを選んでください。選択したフォルダの中にあるファイルとサブフォルダの一覧が、シートに自動で読み込まれます。

  2. 変更内容を入力する
    D列 (新しい名前) に、実行したい操作に合わせて内容を入力します。

    • 名前を変えたいとき: 新しいファイル名・フォルダ名を入力します。(拡張子は不要です)
    • 削除したいとき: DELETE と半角大文字で入力します。
    • 新しくフォルダを作りたいとき: 一覧の空いている行のD列に、作成したいフォルダ名を入力します。
  3. [ボタン2] 変更をプレビュー&実行する
    入力が終わったら、2. 変更をプレビュー&確定 ボタンをクリックします。
    すると、まずプレビューとして各行が色分けされます(緑: OK, 赤: エラー, オレンジ: 削除)。ここで内容に間違いがないか確認できます。

    問題がなければ、表示される確認メッセージで「はい」をクリックすると、実際のファイル操作が一括で実行されます。

  4. [ボタン3] 表示をリセットする
    入力内容やプレビュー結果をクリアして、もう一度やり直したい場合は、3. クリア ボタンを押してください。シートの状態がリセットされます。

③ 出力結果(Before / After)

【Before】右クリック連打で消耗していたあの頃...

  • 議事録_20250715.docx
  • (コピー)議事録_20250715.docx
  • 資料1(修正版).pptx
  • 写真 001.jpg
  • 名称未設定フォルダ

【After】ツールで一括変換!美しく整った世界!

  • 250715_定例会議議事録.docx
  • 250715_参考資料.pptx
  • 250715_会議風景.jpg
  • 【新規フォルダ】配布資料

Excelの関数(CONCATENATEなど)を使えば、連番を振ったり、日付を統一したりするのも自由自在。もう、手作業でポチポチする日々とはおさらばです!

④ 活用例:Excel関数で賢く一括命名

このツールの真価は、Excelの関数と組み合わせられる点にあります。
例えば、「20250712_イベント写真_001.jpg」「20250712_イベント写真_002.jpg」...のように、連番付きの統一されたファイル名を付けたい場合も、手作業は不要です。

  1. D列 (新しい名前) の最初のセルに、="20250712_イベント写真_" & TEXT(A2, "000") のような数式を入力します。(A2は連番が振られているセル)
  2. そのセルのフィルハンドル(右下の■)をダブルクリックするか、下までドラッグします。
  3. これだけで、すべてのファイルに対して、一瞬で規則性のある新しい名前を生成できます。

あとは「2. 変更をプレビュー&確定」ボタンを押すだけ。手作業での地道なコピー&ペーストや打ち間違いから、完全に解放されます!


🧗 開発でつまづいた点と解決策

開発は順風満帆...とは言えませんでした。特に苦労したのはこの2点です。

  • 課題1:目に見えない「改行コード」との戦い

    • 原因・解決策: ファイル名に、見た目ではわからない改行コードや特殊なスペースが含まれていると、うまくリネームできない問題が発生しました。そこで、AIにコーディングをアシストしてもらう「Vibe Coding」の際に、3人の異なる専門家(ベテランプログラマ、品質保証エンジニア、若手開発者)の視点でAIにコードレビューさせ、自分では気づけなかったケースを洗い出し、堅牢な処理を実装することができました。
  • 課題2:「誰でも使える」の敷居を極限まで下げる

    • 原因・解決策: いくら便利でも、使うのが難しければ意味がありません。「自治体の誰もが、説明書なしで直感的に使える」ことをゴールにしました。そのために、操作の起点をすべてシート上の大きなマクロボタンに集約。あとは使い慣れたExcelのセルに文字を入力するだけ、というシンプルなUIに徹底的にこだわりました。結果、PC操作が苦手な方でも使えるツールになったと自負しています!

🔭 今後の展望と野望

このツールはまだ完成形ではありません。私の頭の中には、こんな野望が渦巻いています。

それは、LLM(大規模言語モデル)との連携です。

最近話題の「Dify」のようなプラットフォーム上に、「ドキュメント整理の専門家AI」を構築します。そして、このExcelツールからAPI経由でそのAIを呼び出すんです。そうすれば、ファイルの中身をAIが読み取って、

  • 「このファイル名は『250715_XX委員会報告書』が最適ですよ」とレコメンドしてくれる機能
  • ファイル名だけでなく、適切な分類フォルダまで提案してくれる機能

なんてものが実現できると確信しています。そうなれば、もはや「整理」という作業自体が過去のものになるかもしれません。整然とカテゴリや時点情報を含めて整然と役所内の全データが整理整頓された世界から産声をあげる役所の仕事、なんかワクワクしませんか?


🔚 おわりに:小さな一歩が、大きな変化を生むと信じて

DXというと、どうしても大きな予算や専門的な知識が必要な、壮大なプロジェクトを想像しがちです。でも、私は思うんです(毎回飽きずに繰り返します)。DXの本質は、テクノロジーの力で「現場の一人ひとりが、もっと創造的で、価値ある仕事に集中できる環境を作ること」だと。

今回作ったツールは、そのための本当にささやかな「マイクロDX」の一例に過ぎません。でも、このツールで生まれた「5分の余裕」が、新しい住民サービスを考える時間に変わるかもしれない。ファイル整理のストレスから解放された職員の笑顔が、職場全体の雰囲気を明るくするかもしれない。

その小さな一歩が、やがて大きな変化を生む。

私はそう信じています。ぜひ、このツールをあなたの職場で試してみてください。一緒に、身近なところから「働く」をDXしていきましょう!

Discussion