【2026年8月最新】VBAでファイル名を取得する4つの方法|非エンジニアのためのDir関数・FileSystemObject入門
「請求書ファイルの名前だけをVBAで取り出したい」「フォルダの中の全ファイル名を一覧化したい」——経理・総務・営業事務の現場で、こうしたニーズは驚くほど頻繁に発生します。
VBA(Visual Basic for Applications)でファイル名を取得する方法は、実は1つではありません。「自分自身のファイル名を取りたいのか」「別のファイルパスから名前だけ抜き出したいのか」で使うべき関数が変わり、さらに存在チェックや一覧取得まで含めると、覚えるべきパターンは合計4種類にもなります。
この記事では、Excel VBAで日常的に使われる「ファイル名取得」の全パターンを、コード例つきで整理します。加えて、「そもそもVBAを書かなくても同じことができるのか」という、非エンジニアの経営者・管理職が本当に気にしているはずの問いにも、弊社(株式会社GENAI)の実運用データをもとにお答えします。
この記事を最後まで読むと、次の5つが明確になります。
01 GET OWN FILENAME 自分のファイル名をVBAで取得する マクロが書かれているファイル自身の名前を調べる
最も基本的なパターンは、「今このマクロが動いているExcelファイル自身のファイル名」を取得するケースです。請求書テンプレートや月次レポートのように、ファイル名にファイル自身の情報を埋め込みたいときによく使います。
📚 用語解説
VBA (Visual Basic for Applications):Excel・Word・AccessなどMicrosoft Office製品に組み込まれているプログラミング言語。「マクロ」と呼ばれる自動処理を、ボタン一つで実行できるようにするための仕組みです。プログラミング未経験者でも、決まった操作の繰り返し作業(転記・集計・ファイル整理など)を自動化する目的でよく使われます。
コードはシンプルです。ThisWorkbook.Nameを使うと、拡張子つきのファイル名(例:「見積書.xlsx」)が取得できます。
Sub GetOwnFileName()
Dim fileName As String
fileName = ThisWorkbook.Name ' 例: "見積書.xlsx"
MsgBox fileName
End Sub
ポイントはThisWorkbookとActiveWorkbookの違いです。ThisWorkbookは「このマクロが書かれているブック自身」を指すのに対し、ActiveWorkbookは「現在アクティブ(選択中)になっているブック」を指します。複数のExcelファイルを開いた状態でマクロを実行すると、この2つが別のファイルを指すケースがあるため注意が必要です。
ThisWorkbook.Nameは拡張子つきで返ってきます。拡張子を除きたい場合は、後述するInStrRev関数で最後の「.」の位置を調べ、そこより前の文字列だけを切り出します。
また、ファイル名だけでなく保存場所を含むフルパスが必要な場合は、ThisWorkbook.FullName(フルパス+ファイル名)やThisWorkbook.Path(フォルダパスのみ)を使います。
Sub GetFullPathInfo()
Debug.Print ThisWorkbook.FullName ' 例: "C:\Users\kohei\Documents\見積書.xlsx"
Debug.Print ThisWorkbook.Path ' 例: "C:\Users\kohei\Documents"
Debug.Print ThisWorkbook.Name ' 例: "見積書.xlsx"
End Sub
📚 用語解説
フルパス(絶対パス):ドライブ名(C:など)からファイルの場所までを省略せずに表記したパスのこと。「C:\Users\kohei\Documents\見積書.xlsx」のように、どのフォルダの何階層下にあるファイルかを一意に示します。対して「見積書.xlsx」のようにファイル名だけの表記は「相対パス」と呼ばれ、実行時のカレントフォルダによって指す場所が変わります。
02 EXTRACT FROM PATH ファイルパスからファイル名を取得する3つの方法 InStrRev・Dir・FileSystemObject、それぞれの特徴と使い分け
自分自身のファイルではなく、「このフルパスの文字列から、ファイル名の部分だけを抜き出したい」というケースも多く発生します。例えば「フォルダ内の全ファイルパスがセルに書かれたリストから、ファイル名だけを一覧にしたい」といった業務です。この場合、代表的な方法が3つあります。
2-1. InStrRev関数で文字列から切り出す
1つ目は、文字列操作だけで完結させる方法です。ファイルパスの最後の区切り文字「\」の位置をInStrRev関数で調べ、それより後ろの文字列をMid関数で取り出します。
📚 用語解説
InStrRev関数:文字列の中から、指定した文字を「後ろから」検索してその位置(何文字目か)を返す関数。通常のInStr関数は前から検索しますが、ファイルパスのように「最後の区切り文字」の位置を知りたい場合はInStrRevの方が確実です。
Sub GetFileNameByInStrRev()
Dim fullPath As String, fileName As String
fullPath = "C:\Users\kohei\Documents\report.xlsx"
fileName = Mid(fullPath, InStrRev(fullPath, "\") + 1)
MsgBox fileName ' -> "report.xlsx"
End Sub
この方法の利点は、ファイルが実在しなくても動く点です。次に紹介するDir関数はファイルシステムに実際にアクセスして存在確認をしますが、InStrRevは純粋な文字列処理なので、単に「セルに書かれたパスの文字列を整形したい」だけの場合に向いています。
2-2. Dir関数でファイル名を取得する
2つ目はDir関数を使う方法です。Dir関数にフルパスを渡すと、そのファイルが実在する場合にファイル名だけを返し、存在しない場合は空文字("")を返します。
📚 用語解説
Dir関数:Windowsのファイルシステムに実際に問い合わせて、指定した条件に合うファイル・フォルダの名前を返すVBAの組み込み関数。単体のファイル名取得だけでなく、存在チェックやフォルダ内の一覧取得にも使える多機能な関数です。
Sub GetFileNameByDir()
Dim fileName As String
fileName = Dir("C:\Users\kohei\Documents\report.xlsx")
If fileName <> "" Then
MsgBox fileName & " は存在します"
Else
MsgBox "ファイルが見つかりません"
End If
End Sub
Dir関数の強みは、「ファイル名の取得」と「存在チェック」を同時に行える点です。ファイルが本当に存在するかを確認しながら名前を扱いたい場合は、InStrRevよりDir関数の方が安全です。
2-3. FileSystemObjectを使う方法
3つ目はFileSystemObject(略称FSO)というオブジェクトを使う方法です。VBAの標準機能ではなく、Microsoft Scripting Runtime(scrrun.dll)という別のライブラリが提供するオブジェクトを呼び出して使います。
📚 用語解説
FileSystemObject (FSO):ファイル・フォルダの操作をオブジェクト指向的に扱えるようにする仕組み。VBA単体の関数よりも高機能で、ファイル名だけでなく拡張子の取得・削除、フォルダのコピー、ファイルの読み書きまで幅広く扱えます。VBAコードの中ではCreateObject("Scripting.FileSystemObject")で呼び出すのが一般的です。
Sub GetFileNameByFSO()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fullPath As String
fullPath = "C:\Users\kohei\Documents\report.xlsx"
Debug.Print fso.GetFileName(fullPath) ' -> "report.xlsx"(拡張子あり)
Debug.Print fso.GetBaseName(fullPath) ' -> "report"(拡張子なし)
End Sub
FileSystemObjectの最大の利点は、GetBaseNameのように拡張子を除いたファイル名を1行で取得できる点です。InStrRevやDir関数では拡張子を除くのに追加のコードが必要ですが、FSOならメソッドを呼ぶだけで済みます。
CreateObjectを使う書き方は「実行時バインディング(レイトバインディング)」と呼ばれ、事前設定なしでそのまま動きます。もし入力補完(インテリセンス)を効かせたい場合は、VBEの「ツール」→「参照設定」から「Microsoft Scripting Runtime」にチェックを入れる「事前バインディング(アーリーバインディング)」という方法もありますが、社内で配布するファイルではCreateObject方式の方がトラブルが少なくおすすめです。
3つの方法を一覧で比較すると、以下のようになります。
| 方法 | 実在チェック | 拡張子なし取得 | 難易度 | 向いているケース |
|---|---|---|---|---|
| InStrRev + Mid | 不可(文字列処理のみ) | 別途コードが必要 | やや高い(文字位置の計算) | セル内の文字列を整形したいだけの場合 |
| Dir関数 | 可能(存在すれば名前を返す) | 別途コードが必要 | 普通 | ファイルの存在確認も同時にしたい場合 |
| FileSystemObject | 別メソッドで可能 | GetBaseNameで1行 | 普通〜やや高い(オブジェクトの概念) | 拡張子の有無を頻繁に扱う・高機能な操作もしたい場合 |
03 MASTER DIR FUNCTION Dir関数を使いこなす(存在チェック・一覧取得) フォルダ内の全ファイルを取得するワイルドカード活用法
Dir関数は単体のファイル名取得だけでなく、フォルダの存在チェックやワイルドカードを使った一括取得にも対応しています。実務で最もよく使われるのが、この「フォルダ内の全ファイル名を一覧化する」パターンです。
3-1. フォルダの存在をチェックする
Dir関数の第2引数にvbDirectoryという属性を指定すると、検索対象にフォルダを含めることができます。ただし注意が必要です。vbDirectoryは「フォルダだけ」を検索対象にする指定ではなく、通常のファイルは属性指定に関わらず常に検索対象へ含まれます。そのため、確認したいフォルダと同じ名前の通常ファイルが存在する場合、Dir(path, vbDirectory)は実際のフォルダの有無に関わらず非空文字列を返してしまい、誤って「フォルダが存在する」と判定する可能性があります。
Sub CheckFolderExists()
Dim folderPath As String
folderPath = "C:\Users\kohei\Documents\請求書"
Dim attr As Long
On Error Resume Next
attr = GetAttr(folderPath)
Dim errNum As Long
errNum = Err.Number
On Error GoTo 0
' GetAttrが成功し(=パスが存在し)、かつvbDirectoryビットが立っている場合のみ「フォルダ」と判定
If errNum = 0 And (attr And vbDirectory) = vbDirectory Then
MsgBox "フォルダは存在します"
Else
MsgBox "フォルダが見つかりません"
End If
End Sub
vbDirectoryは検索対象にフォルダを追加する指定であり、通常ファイルを除外するものではありません。確認したいパスと同名の通常ファイルが存在すると、Dir(path, vbDirectory)は非空文字列を返してしまい、フォルダが実在しなくても「存在する」と誤判定します。確実にフォルダかどうかを判定したい場合は、上記コードのようにGetAttr関数の戻り値をvbDirectoryとAnd演算し、ビットが立っているかで確認してください。
Dir関数に渡せる属性(第2引数)は複数あり、目的に応じて使い分けます。
| 定数 | 値 | 対象 |
|---|---|---|
| vbNormal | 0 | 通常のファイル(属性指定なしと同じ、既定値) |
| vbReadOnly | 1 | 読み取り専用ファイルも含める |
| vbHidden | 2 | 隠しファイルも含める |
| vbSystem | 4 | システムファイルも含める |
| vbDirectory | 16 | フォルダ(ディレクトリ)を検索対象にする |
| vbArchive | 32 | アーカイブ属性のファイルも含める |
3-2. ワイルドカードでファイル一覧を取得する
Dir関数はワイルドカード(あいまい検索の記号)に対応しています。「フォルダ内の全Excelファイルの名前を一覧化したい」というときによく使うパターンです。
📚 用語解説
ワイルドカード:「任意の文字列」を表す特殊記号のこと。VBAのDir関数では「*」(アスタリスク)が0文字以上の任意の文字列、「?」(クエスチョン)が任意の1文字を表します。例えば「*.xlsx」は「拡張子がxlsxなら何でも一致」という意味になります。
Sub ListAllExcelFiles()
Dim fileName As String
Dim folderPath As String
folderPath = "C:\Users\kohei\Documents\請求書\"
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir() ' 引数なしで呼ぶと「次に見つかったファイル」を返す
Loop
End Sub
ここでの注意点は、2回目以降のDir呼び出しでは引数を書かないことです。最初の呼び出しで検索条件(フォルダとワイルドカード)を指定したら、以降はDir()を引数なしで呼ぶことで、前回の続きから次のファイルを返してくれます。
Dir(フォルダ+"*.xlsx")
で検索条件を指定
Dir()を引数なしで
繰り返し呼ぶ
戻り値が""に
なったらループ終了
3-3. サブフォルダの中まで取得したい場合
Dir関数はサブフォルダの中までは自動的に潜ってくれません。1階層のみが対象です。サブフォルダの中身まで含めて全ファイルを取得したい場合は、再帰処理(自分自身を呼び出す処理)を書くか、より高機能なFileSystemObjectのSubFoldersプロパティを使う必要があります。
Dir関数は内部で1つの検索状態しか保持できません。あるDirループの途中で、別のDir呼び出しを重ねて実行すると、検索結果が混ざって正しく動作しなくなることがあります。フォルダを再帰的に処理したい場合は、Dir関数の代わりにFileSystemObjectのSubFoldersプロパティを使う方が安全です。
04 COMMON PITFALLS つまずきやすいエラーと注意点 公開前に知っておきたい落とし穴
VBAでファイル名を扱う処理は、一見単純に見えて環境依存のエラーが起きやすい領域でもあります。よくあるつまずきポイントを整理します。
4-1. パスの文字数制限
Windowsの標準的なファイルパスには、伝統的に260文字という上限がありました。深い階層のフォルダに長いファイル名を保存していると、この上限に引っかかってDir関数やFileSystemObjectがエラーを返すことがあります。近年のWindowsでは設定変更によりこの上限を緩和できますが、社内の共有PCではその設定がされていないケースも多く、想定しておくべき注意点です。
4-2. 拡張子の扱い(xlsx / xlsm / xls)
マクロが有効なブック(.xlsm)を通常のブック(.xlsx)だと想定してコードを書いてしまうと、想定外の拡張子でファイル名の切り出しがずれることがあります。なお、InStrRev(fileName, ".")は文字列を後ろから検索するため、「2026.04月次報告.xlsx」のようにファイル名自体に複数の「.」が含まれるケースでも、最後の「.」(拡張子の区切り)を正しく検出できます。注意すべきは、前方から検索するInStr関数を誤って使ってしまったり、単純に「.」でSplitして先頭の要素だけを使うような実装をした場合で、これらは最初の「.」の位置で意図せず切れてしまいます。
InStrRevを正しく使えば拡張子の除去自体は問題なく行えますが、毎回「.」の位置を計算するコードを書くのは手間です。FileSystemObjectのGetBaseNameメソッドを使えば、同じ結果を1行で、位置計算のコードを書かずに取得できます。
4-3. 「ファイルが見つからない」エラーの典型パターン
特に「全角スペースの混入」は見た目では気づきにくく、原因調査に時間がかかりがちです。ファイル名を扱うマクロでエラーが出た場合は、Debug.Printで実際に取得された文字列をイミディエイトウィンドウに出力し、目視で確認する癖をつけると原因特定が早くなります。
05 GENAI CASE STUDY 【独自データ】VBA運用の限界とAI移行の実際 マクロ資産のブラックボックス化と、弊社が実際に切り替えた範囲
ここからは弊社(株式会社GENAI)の実データをもとに、「VBAでの自動化」と「AIでの自動化」を比較します。VBAは非常に優れた技術ですが、運用が長期化すると特有の課題が出てくることも事実です。
5-1. VBAマクロが抱えがちな運用課題
弊社がこれまでに複数の企業様のマクロ資産を拝見してきた中で、共通して見られる課題が以下の3つです。
こうした課題は、VBAという技術そのものの欠陥ではなく、「決まった手順をコードで固定する」という自動化の性質上、避けにくい構造的な問題です。同じことは、より新しい自動化ツールでも一定程度発生します。
5-2. 弊社での実運用: Claude Codeによるファイル操作の自動化
弊社では、Claude Code(Anthropic社のAIエージェント)を使って、経理・秘書業務・開発など幅広い業務にAIを組み込んでいます。Max 20xプラン(月額$200・約30,000円)を全社契約し、コードを書く代わりに日本語で指示するだけのファイル操作・整理タスクを日常的に処理しています。
| 項目 | 内容 |
|---|---|
| 契約プラン | Claude Max 20x(月$200 / 約30,000円) |
| 利用開始 | 2025年後半〜 |
| 利用部署 | 経営・営業・広告・開発・経理・秘書業務・個人業務まで全社 |
| ファイル操作系の用途例 | 請求書ファイルの一括リネーム・フォルダ整理・命名規則チェック・重複ファイルの検出 |
特に経理業務では、請求書チェック・経費仕訳・freee連携などの処理で月40時間 → 月5時間まで作業時間が圧縮できている肌感です(あくまで弊社での概算値です)。ファイル名の整形・一覧化といった、かつてVBAマクロで対応していた作業の多くも、この削減効果に含まれています。
上記は弊社の肌感ベースの数値であり、業種・業態・既存のマクロ資産の複雑さによって効果は変動します。「VBAを完全に廃止すべき」という主張ではなく、あくまで選択肢の一つとしてご覧ください。
5-3. VBAとAI、両方を使い分ける現実解
誤解してほしくないのは、「VBAはもう不要」という話ではないという点です。すでに安定稼働しているマクロを無理に置き換える必要はありません。弊社の実運用でも、以下のような使い分けをしています。
そのまま維持
(無理に置き換えない)
複雑なマクロ
AIに仕様を説明して
再設計・引き継ぎ
ファイル操作業務
最初からAIに
日本語で指示
06 GETTING STARTED WITH AI 非エンジニアがAIでファイル管理を自動化する3ステップ VBAが書けなくても、日本語で指示するだけで実現できる
「VBAのコードを読むだけでも一苦労」という方も多いはずです。ここでは、プログラミング未経験の方が、AI(Claude Code)を使ってファイル名取得・整理を自動化するまでの流れを3ステップで紹介します。
ステップ1: 具体的な作業を日本語でそのまま伝える
最初のステップは、VBAのように「関数を選ぶ」必要が一切ないという点です。「このフォルダの中にあるExcelファイルの名前を全部一覧にして」「ファイル名に日付が入っていないものだけ教えて」といった、普段使っている言葉のまま指示するだけで処理が実行されます。
「デスクトップの請求書フォルダにあるファイル名を、拡張子なしで一覧にしてExcelに出力して」——この一文だけで、VBAでいうところのDir関数によるループ処理・FileSystemObjectによる拡張子除去が、コードを書かずに実行されます。
ステップ2: 結果を確認し、条件を追加で伝える
VBAであれば「条件を1つ追加する」だけでもコードの修正が発生しますが、AIに指示する場合は会話の続きで条件を足すだけです。「2026年4月以降に更新されたファイルだけに絞って」「ファイル名の末尾に"_確定"がついているものは除外して」といった追加条件も、その場で反映されます。
ステップ3: 定型業務として繰り返し使えるようにする
毎週・毎月など定期的に発生する作業であれば、指示の流れをそのまま繰り返し使えるパターンとして保存しておけます。これにより、担当者が変わってもコードを読み解く必要がなく、業務手順書を見ながら同じ指示を出すだけで同じ結果が再現できます。
日本語で
やりたいことを伝える
結果を見て
条件を追加する
定型業務として
繰り返し使う
07 QUICK GUIDE VBAで自分で書く vs AIに任せる 早見表 あなたの状況に合わせた選び方
最後に、状況別の判断基準を1枚の表にまとめます。
| あなたの状況 | おすすめ | 理由 |
|---|---|---|
| すでに安定稼働しているマクロがある | VBAのまま維持 | 動いているものを無理に置き換える必要はない |
| マクロを書ける担当者が1人しかいない | AIへの移行を検討 | 属人化リスクの解消が急務 |
| 単発・一度きりのファイル整理をしたい | AIに直接依頼 | コードを書く工数の方が高くつく |
| プログラミングを学ぶ目的も兼ねている | VBAを学習 | 構造化された学習には手を動かす経験が有効 |
| 複数業務(経理・営業・広告等)を横断で自動化したい | AI(Claude Code)を軸に据える | VBAは基本Excel内に閉じるが、AIは業務横断で使える |
迷ったときの目安は「その処理を1年後も同じ人がメンテナンスできるか」です。答えが「わからない」であれば、AIへの移行を検討する価値があります。
08 CONCLUSION まとめ ── ファイル名取得の先にある「業務自動化」 VBAとAI、それぞれの正しい使い方
この記事では、VBAでファイル名を取得する4つのパターン(自分のファイル名/InStrRev/Dir関数/FileSystemObject)と、よくあるエラー対処、そしてAIによる代替手段までを整理しました。最後にポイントを振り返ります。
ThisWorkbook.Nameで取得できる(拡張子つき)InStrRev・Dir関数・FileSystemObjectの3種類Dir関数が便利だが、多重ループには注意FileSystemObjectのGetBaseNameが確実VBAは今なお現場で強力なツールですが、「誰が保守するのか」という属人化の問題は避けて通れません。ファイル名取得のような小さな処理であっても、積み重なれば大きな運用コストになります。
「うちのマクロ、実は担当者しかわからない」「新しく仕組みを作るなら、コードを書かない方法も検討したい」——そう感じた方は、ぜひ以下からAI鬼管理にご相談ください。
「担当者しか触れないマクロ」を、AI鬼管理が一緒に棚卸しします
VBAで積み上げてきた自動化資産を無理に捨てる必要はありません。
属人化リスクのある部分だけをAIに置き換える、現実的な移行プランをご提案します。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. VBAで自分のファイル名だけを取得する一番簡単な方法は?
A. ThisWorkbook.Nameを使うのが最も簡単です。1行で拡張子つきのファイル名(例:「見積書.xlsx」)が取得できます。拡張子を除きたい場合は、InStrRev関数で最後の「.」の位置を調べて切り出すか、FileSystemObjectのGetBaseNameメソッドを使うとより確実です。
Q. Dir関数とFileSystemObject、結局どちらを使えばいいですか?
A. 単純な存在チェックやフォルダ内一覧の取得ならDir関数で十分です。一方、拡張子の有無を頻繁に扱う、フォルダのコピーなど高度な操作もしたい、という場合はFileSystemObjectの方が機能面で有利です。迷った場合はFileSystemObjectを使っておくと後から機能追加がしやすくなります。
Q. Dir関数でファイル一覧を取得しようとするとループが止まらなくなります。原因は?
A. 多くの場合、2回目以降の呼び出しでも引数を渡してしまっていることが原因です。Dir関数は最初の呼び出しだけ検索条件(フォルダとワイルドカード)を渡し、2回目以降は引数なしのDir()を呼ぶ仕様になっています。この仕様を誤解していると無限ループや意図しない結果になります。
Q. サブフォルダの中のファイルまで一括で取得することはできますか?
A. Dir関数単体では1階層分しか取得できないため、サブフォルダの中身まで扱うには再帰処理を自分で書くか、FileSystemObjectのSubFoldersプロパティを使う必要があります。Dirループを多重にネストさせると検索状態が混ざって誤動作するため、階層をまたぐ処理はFileSystemObjectの利用をおすすめします。
Q. VBAを使わずに、AIだけでファイル名の一覧化はできますか?
A. できます。Claude CodeのようなAIエージェントであれば、「このフォルダのファイル名を一覧にして」と日本語で指示するだけで、VBAのDir関数やFileSystemObjectに相当する処理をコードなしで実行できます。条件の追加や変更も会話ベースで対応できるため、非エンジニアの方でも扱いやすい方法です。
Q. 長年使ってきたVBAマクロは、AI導入後に全部捨てるべきですか?
A. いいえ、その必要はありません。すでに安定して動いているマクロは維持し、属人化して誰もメンテナンスできない部分や、これから新規に作る業務フローだけをAIに置き換えるのが現実的です。弊社でもすべてを一度に置き換えるのではなく、リスクの高い部分から段階的に見直す進め方を推奨しています。
Q. ファイル名に日本語や全角スペースが含まれる場合、VBAで注意すべき点はありますか?
A. 全角スペースは見た目では半角スペースと区別がつきにくく、パス指定のミスマッチでファイルが見つからないエラーの原因になりやすいです。エラーが出た場合は、Debug.Printで実際に取得された文字列をイミディエイトウィンドウに出力し、目視で余分な文字が混入していないか確認する方法が有効です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AIBPO by AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




