【VBA】ファイル名を取得する3つの神技!初心者も5分でマスターする完全ガイド
毎日のファイル整理作業に30分かかっている。。。手作業でファイル一覧を作るのが面倒。。。
こんな問題は
『ファイル名を取得するVBA』の導入
で解決することができます。
『ファイル名を取得するVBA』があれば、
100個のファイル処理が数秒で完了させる。月20時間の作業時間を短縮させる
なんて処理が可能です。
この記事では、
Dir関数・FileSystemObject・ThisWorkbookプロパティという3つの『ファイル名を取得するVBA』
を初心者でも理解できるよう丁寧に解説しています。
手間のかかるファイル操作はVBAを使って自動化しちゃいましょう。
VBAでファイル名を取得する基本知識と重要性
『ファイル名を取得するVBA』を導入すると
ファイル管理や集計作業、レポート作成など、あらゆるエクセル業務の効率をアップさせる
ことができます。
実際に私が勤めていた職場でも、
手作業で行っていたファイル整理作業をVBAで自動化することで、3時間以上かかっていた作業をたったの30分に短縮
することができました。
『ファイル名を取得するVBA』を導入して、あなたの職場のエクセル業務の効率をアップさせちゃいましょう。
ファイル名取得が業務効率化に与える3つのメリット
『ファイル名を取得するVBA』導入のメリットがこちら
- ファイルのリスト化作業の時間短縮
- ヒューマンエラーの完全防止
- ルーティーン作業の完全自動化
2時間以上かけて100個以上あるファイルの名前を手作業でリスト化している。しかも、このような作業を定期的に行っている。
こんな状況で作業しているなら、絶対に『ファイル名を取得するVBA』を導入すべきです。
ファイル名のリスト化なら、ほんの数秒で処理(マクロを実行するだけ!)ができ、編集ミスが発生する心配もありません。
さらに、
一度設定したVBAは半永久的に使用することができるので作業内容の変更がない限りマクロを使い続けることができます。
VBA初心者が知っておくべき基本用語と概念
『ファイル名を取得するVBA』のコードを書く前に、基本的な用語を理解しておきましょう。
ファイルパスとは、
コンピュータ内でのファイルの住所のような概念で、「C:\Users\Documents\sample.xlsx」のような形で表現
されます。
このパスは「ドライブ名+フォルダ名+ファイル名」で構成されており、VBAではこれらを個別に取得することができます。
また、
ワイルドカードという特殊な記号を使うことで、複数のファイルを一度に検索することが可能です。
たとえば、
「*.xlsx」と指定すれば、すべてのExcelファイルを対象にできる
ということです。
これらの基本概念を押さえておけば、どんな複雑なファイル操作も簡単に理解できるようになります。
ファイル名取得でよくある失敗パターンと対策
VBA初心者がファイル名取得で最もつまずきやすいポイントは、
存在しないファイルやフォルダを指定してしまうエラー
です。
このような問題を避けるためには、まずファイルやフォルダの存在確認を行う習慣をつけることが重要です。
また、日本語ファイル名や特殊文字(&、%、#など)を含むファイルで予期しない動作が起こることも考慮しておきましょう。
たとえば、
「売上データ&分析.xlsx」のようなファイル名では、&記号が原因でエラーが発生する
ことがあります。
さらに、パスが長すぎる場合(255文字を超える)もエラーが発生することが多いので注意してください。
これらの失敗を防ぐために、
事前のエラーハンドリングと適切な文字列処理を組み込むこと
に注意しましょう。
関連記事「エラーを無視するResume Nextの使い方」では、効率的なエラーハンドリングの方法が解説されています。
【神技1】Dir関数を使った基本的なファイル名取得方法
Dir関数は、VBAでファイル名を取得する最も基本的で強力な方法です。
Dir関数を自由に扱えるようになれば、
フォルダ内のファイル一覧取得から特定条件でのファイル検索まで、幅広い操作が可能
になります。
Dir関数の最大の魅力は、
シンプルな構文で複雑なファイル操作ができること
です。
あらゆるエクセル業務で応用できる関数なので、「Dir関数を使ってファイル名を取得する方法」をマスターしておきましょう。
Dir関数の基本構文と使い方を3分で理解
Dir関数の基本的な使い方は驚くほどシンプルで、たった1行のコードでファイル名を取得できます。
最も基本的な構文がこちら
Dir("ファイルパス")
指定したパスにあるファイル名を文字列として返します。
Dir関数を使ってテキストファイルを取得するサンプルコードがこちら
vbaSub BasicDirExample()
Dim fileName As String
fileName = Dir("C:\MyFolder\sample.txt")
MsgBox fileName '結果:sample.txt
End Sub
このコードは、
指定したパスにsample.txtが存在すれば「sample.txt」が返され、存在しなければ空文字列が返される
という内容です。
Dir関数は大文字小文字を区別せず、ファイルが見つからない場合は自動的に空文字列を返すためエラーハンドリングも簡単。
この基本パターンを理解すれば、より複雑なファイル操作をするマクロも作れるようになります。
関連記事「Dir関数の使い方」では、Dir関数の使い方やサンプルコードが紹介されています。
Dir関数の理解を深めたい方は併せてチェックしてみてください。
ワイルドカードを活用した効率的なファイル検索テクニック
ワイルドカードを使いこなすことで、Dir関数の検索能力は飛躍的に向上します。
「*」は0文字以上の任意の文字列を表す
「?」は任意の1文字を表す
これらを組み合わせることで、柔軟なファイル検索が可能になります。
たとえば、
Excelファイルのみを検索したい場合は「*.xlsx」、特定の文字で始まるファイルを探したい場合は「売上*.xlsx」
と指定します。
ワイルドカードを使ったサンプルコードがこちら
Sub WildcardExample()
Dim fileName As String
fileName = Dir("C:\Reports\売上*.xlsx")
Do While fileName <> ""
Debug.Print fileName '売上で始まるExcelファイルを表示
fileName = Dir()
Loop
End Sub
上記のコードは、
Reportsフォルダ内の「売上」で始まるエクセルファイル名を全て取得する
という内容です。
Dir関数とワイルドカードの組み合わせを使えば
数百個のファイルから必要なものだけを効率的に抽出
できるようになります。
Dir関数でフォルダ内の全ファイル名を一括取得するコード例
Dir関数を使ってフォルダ内の全ファイルを一括取得するには、ループ処理を組み合わせることが効果的です。
Dir関数は最初の呼び出しでパスを指定し、その後は引数なしで呼び出すことで次のファイル名を順次取得できるという特徴があります。
この仕組みを活用すれば、フォルダ内の全ファイル名を自動的に収集できます。
Dir関数を使ってフォルダ内のファイル名をまとめて取得するサンプルコードがこちら
Sub GetAllFileNames()
Dim folderPath As String
Dim fileName As String
Dim i As Integer
folderPath = "C:\MyDocuments\"
fileName = Dir(folderPath & "*.*")
i = 1
Do While fileName <> ""
Cells(i, 1).Value = fileName
fileName = Dir()
i = i + 1
Loop
MsgBox "ファイル一覧取得完了!"
End Sub
上記のコードは
指定フォルダ内の全ファイル名をA列に表示する
という内容です。
大量にあるファイルを瞬時にリスト化することができます。
【神技2】FileSystemObjectで高度なファイル名操作
FileSystemObjectは、Dir関数よりも高機能なファイル操作を可能にする上級者向けのツールです。
FileSystemObjectを使えば、
ファイルの詳細情報取得、サブフォルダの再帰的検索、そして複雑な文字列操作まで、
あらゆるファイル操作の自動化が可能。
特に大規模なファイル管理システムを構築の際に利用され、複雑なファイル操作が可能になります。
FileSystemObjectとは?Dir関数との違いを徹底比較
Dir関数が単純なファイル名検索に特化しているのに対し、FileSystemObjectはファイルの作成日時、サイズ、属性などの詳細情報まで取得することができます。
最大の違いは、
FileSystemObjectはファイルやフォルダをオブジェクトとして扱えるため、より直感的で読みやすいコードにできる
という点です。
FileSystemObjectを使ってファイル情報を取得するサンプルコードがこちら
Sub FileSystemObjectExample()
Dim fso As Object
Dim file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.GetFile("C:\sample.xlsx")
MsgBox "ファイル名: " & file.Name & vbCrLf & _
"サイズ: " & file.Size & " bytes"
End Sub
上記のコードは
オブジェクトとしてsample.xlsxファイルを格納し、ファイルの名前とサイズを取得する
という内容です。
このように、Dir関数では不可能な詳細情報の取得が簡単に行えるのがFileSystemObjectの最大の利点です。
GetFileName・GetBaseName・GetExtensionNameの使い分け
FileSystemObjectの文字列操作メソッドは、ファイル名の各部分を正確に分離できる優れた機能です。
「GetFileName」「GetBaseName」「GetExtensionName」の違いがこちら
GetFileName・・・フルパスからファイル名部分のみを取得
GetBaseName・・・拡張子を除いたファイル名を取得
GetExtensionName・・・拡張子のみを取得
これらのメソッドを適切に使い分けることで、複雑な文字列処理を簡単に実現できるのです。
たとえば、
ファイル名を用途別に分類し、拡張子によって処理を分岐させる
といった処理条件にすることができます。
「GetFileName」「GetBaseName」「GetExtensionName」を比較するサンプルコードがこちら
Sub FileNameParsing()
Dim fso As Object
Dim fullPath As String
Set fso = CreateObject("Scripting.FileSystemObject")
fullPath = "C:\Documents\売上レポート2024.xlsx"
Debug.Print "フルファイル名: " & fso.GetFileName(fullPath) '売上レポート2024.xlsx
Debug.Print "ベース名: " & fso.GetBaseName(fullPath) '売上レポート2024
Debug.Print "拡張子: " & fso.GetExtensionName(fullPath) 'xlsx
End Sub
処理内容によって使い分けてください。
関連記事「ファイル情報を取得するマクロ」では、
FileSystemObjectを使ったファイル名を取得・編集するマクロが設定されたエクセルファイルをダウンロード
することができます。
めちゃくちゃシンプルなコードが設定されているのでアレンジも簡単。
サブフォルダまで含めた再帰的ファイル名取得の実装方法
FileSystemObjectの真の威力は、サブフォルダを含めた再帰的なファイル検索にあります。
Dir関数では困難な階層構造の深い検索も、FileSystemObjectなら簡潔なコードで処理可能です。
再帰処理を使うことで、指定フォルダ以下のすべてのサブフォルダを自動的に探索し、全ファイルを漏れなく取得できます。
再帰処理を使うサンプルコードがこちら
Sub FileNameParsing()
Dim fso As Object
Dim fullPath As String
Dim folder As String
folder = "H:\ブログ関係\Excel"
Set fso = CreateObject("Scripting.FileSystemObject")
Call RecursiveFileSearch(folder)
End Sub
Sub RecursiveFileSearch(folderPath As String)
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim subFolder As Object
Dim i As Long
Dim LastColumns As Long
i = 1
LastColumns = Cells(1, Columns.Count).End(xlToLeft).Column
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
'現在フォルダのファイルを処理
For Each file In folder.Files
Cells(i, LastColumns + 1) = file.Name
i = i + 1
Next file
'サブフォルダを再帰的に処理
For Each subFolder In folder.SubFolders
RecursiveFileSearch subFolder.Path
Next subFolder
End Sub
実行結果がこちら
ファイル数が多くて表示しきれませんでした。
フォルダによっては最大で4階層ありましたが、全てのファイル名をリスト化することができます。
【神技3】実行中ファイル自身の名前を取得する裏技
VBAでは、現在実行中のExcelファイル自身の名前を取得することも可能です。
『実行中ファイル自身の名前を取得するVBA』は、
動的なファイル名生成やログ記録、バックアップファイル作成など、高度な自動化システムを構築する
という場面での利用が便利です。
複数のExcelファイルで同じマクロを使い回す、ファイル名に基づいて処理内容を変更したい、
というときに使用しましょう。
ThisWorkbook.Nameプロパティの効果的な活用法
ThisWorkbook.Nameプロパティは、現在実行中のExcelファイルの名前を瞬時に取得できる最もシンプルな方法です。
このプロパティの優れた点は、
ファイルがどの場所に保存されていても、また名前が変更されても、常に正確な現在のファイル名を返してくれる
ことです。
実際の業務では、
レポートの自動生成やログファイルの命名、バックアップファイルの作成時にファイル名を動的に組み込む
という場面で活用されます。
ThisWorkbook.Nameプロパティを使ったサンプルコードがこちら
Sub GetCurrentFileName()
Dim currentFileName As String
Dim baseFileName As String
currentFileName = ThisWorkbook.Name '拡張子付きファイル名
baseFileName = Left(currentFileName, InStrRev(currentFileName, ".") - 1)
MsgBox "現在のファイル名: " & currentFileName & vbCrLf & _
"ベース名: " & baseFileName
End Sub
上記のコードは
currentFileName(拡張子付き)のファイル名とbaseFileName(拡張子なし)のファイル名を取得する
という内容です。
ファイルパスから拡張子なしのファイル名だけを抽出する方法
ファイルパスから拡張子を除いたファイル名のみを取得する技術は、ファイル名ベースの処理システムを構築する際の重要なスキルです。
この処理には複数のアプローチがありますが、最も確実で効率的な方法は文字列操作関数を組み合わせることです。
特に、InStrRev関数を使って後ろから文字を検索し、適切な位置で文字列を切り出すテクニックは、汎用性が高いので自由に扱えるようにしておきましょう。
拡張子の位置を特定すし、名前を取得するVBAのサンプルコードがこちら
Sub ExtractFileNameWithoutExtension()
Dim fullPath As String
Dim fileName As String
Dim baseName As String
Dim dotPosition As Integer
fullPath = ThisWorkbook.FullName 'フルパス取得
fileName = ThisWorkbook.Name 'ファイル名部分取得
'拡張子の位置を特定
dotPosition = InStrRev(fileName, ".")
If dotPosition > 0 Then
baseName = Left(fileName, dotPosition - 1)
Else
baseName = fileName '拡張子がない場合
End If
MsgBox "拡張子なしファイル名: " & baseName
End Sub
この方法により、どんな複雑なファイル名でも確実に拡張子を除去できます。
InStrRev関数を使った文字列操作テクニック
InStrRev関数は、
文字列を後ろから検索する関数
です。
通常のInStr関数が前から検索するのに対し、InStrRevは後ろから検索するため、パス区切り文字(\)や拡張子区切り文字(.)の最後の位置を確実に特定することができます。
この特性を活用すれば、複雑なパス構造やファイル名でも正確な文字列操作が可能になります。
たとえば、
「C:\Folder.Name\File.backup.xlsx」のような複雑な名前でも適切な処理
が可能です。
InStrRev関数を使ったVBAのサンプルコードがこちら
Sub AdvancedStringManipulation()
Dim fullPath As String
Dim folderPath As String
Dim fileName As String
Dim baseName As String
Dim extension As String
fullPath = "C:\Projects\Data.Analysis\Report.Final.xlsx"
'最後の\の位置を取得
Dim lastBackslash As Integer
lastBackslash = InStrRev(fullPath, "\")
'最後の.の位置を取得
Dim lastDot As Integer
lastDot = InStrRev(fullPath, ".")
'パスの各部分を抽出
folderPath = Left(fullPath, lastBackslash - 1)
fileName = Mid(fullPath, lastBackslash + 1)
baseName = Mid(fullPath, lastBackslash + 1, lastDot - lastBackslash - 1)
extension = Mid(fullPath, lastDot + 1)
Debug.Print "フォルダパス: " & folderPath
Debug.Print "ファイル名: " & fileName
Debug.Print "ベース名: " & baseName
Debug.Print "拡張子: " & extension
End Sub
上記のコードは
文字列を切り出す関数を使って「フォルダのパス」「ファイル名」「ベース名」「拡張子」を別々に取得する
という内容です。
文字列を切り出す関数を使えば、どんな複雑なファイル名でも自由自在に操作できるようになります。
関連記事「文字列を切り出す関数の使い方」では、拡張子を消すために利用されるInstr関数の使い方が紹介されています。
VBAでエクセル業務の効率化を実現
VBAを活用することで、エクセルでの日常業務を劇的に効率化できます。
VBAを使えば、
繰り返し作業の自動化によって人的ミスを削減し、作業時間を大幅に短縮する
ことが可能です。
毎日行っているデータ集計やレポート作成を自動化すれば、数時間かかっていた作業がボタン一つで数分で完了します。
エクセル作業が多い環境ではVBAの導入は必須事項である!といっても過言ではありません。
マクロを導入するメリット
マクロを導入する最大のメリットは、作業時間の短縮と品質の向上を同時に実現できることです。
人間が時間をかけて行う単純作業をコンピュータが正確かつ高速に処理することができます。
たとえば、手作業で1時間かかっていたデータ整理が、マクロなら数秒で完了し、さらに計算ミスや入力間違いも完全に防げます。
また、一度作成したマクロは何度でも使い回せるため、長期的な業務効率化投資としても非常に価値があります。
結果として、マクロ導入は時間コストの削減と業務品質の向上という二重のメリットをもたらします。
VBA学習の始め方
VBA学習の最も効果的な始め方は、実際の業務課題から出発することです。
目的が明確な学習は記憶定着率が高く、モチベーションも維持しやすいのは間違いありません。
たとえば、毎週行っているデータ集計作業を自動化することを目標に設定し、必要な機能から順番に覚えていけば実践的なスキルがすぐに身につきます。
基本的な変数の使い方から始まり、ループ処理、条件分岐、配列など、段階的にレベルアップしていくことで、確実にVBAをマスターできます。
関連記事「VBA初心者必見!マクロの作り方」では、コードを書く画面の開き方や書いたコードの実行方法が図やサンプルコードを使って紹介されています。
マクロの開発を外注依頼する
業務内容に合わせた効率化マクロを導入したいけど、VBAコードを開発する時間がない。。。どうやってプログラムを組めばいいかわからない。。。
このような方は、マクロ開発を外注に依頼しちゃいましょう。
外注依頼することで本業に集中しながら高品質なマクロを即座に導入することができます。
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
効率化マクロを導入してエクセル業務の効率をアップさせましょう。