1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📊連載第9回!初心者のためのExcel VBA入門:ファイル操作とフォルダ管理の基本テクニック🗂️ 初心者でも簡単✨

Last updated at Posted at 2025-04-12

Excel VBAにおけるファイル操作とフォルダ管理の基本

私はVBAの活用経験を通じて得た知識を整理し、共有する目的で記事を作成しているプログラミング歴1年半になるエンジニアです。前回は、Excel VBAにおけるFormulaとValueの使い分け、InputBox関数によるユーザー入力の取得、そして、Excelのワークシート関数をVBAで活用する方法について解説しました。今回は、Excel VBAでの実務における重要なテクニックとして、ファイル操作とフォルダ管理の基本について説明します。これらの知識を習得することで、ファイル選択ダイアログの表示、ファイルのオープン・保存、フォルダの作成・管理など、より実用的なVBAアプリケーションを開発できるようになります。

目次

はじめに
ファイル選択ダイアログの表示
ファイルを開く方法
ファイルの保存処理
フォルダ選択ダイアログの表示
フォルダの作成
ファイル名・フォルダ名の変更
まとめ

はじめに

Excel VBAでファイルやフォルダを操作することで、日々の業務をより効率的に自動化することができ、複雑なファイル管理も簡略化されます。この記事では、ユーザーがファイルを選択するためのダイアログの表示方法や、Excelファイルの開閉、データの保存方法、さらにはフォルダの作成と管理といった基本操作を解説します。VBAを駆使することで、Excelの操作が自動化され、業務効率が大幅に向上するでしょう。

ファイル選択ダイアログの表示

Excel VBAでは、Application.GetOpenFilename メソッドを使用することで、Windowsの標準的なファイル選択ダイアログを表示し、ユーザーにファイルを選択させることができます。このメソッドはファイルパスの取得のみを行い、実際にファイルを開くわけではありません。

基本構文

Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
引数 説明 デフォルト値
FileFilter ファイルの種類をフィルタリングするための設定
例: "Excel ファイル (*.xlsx), .xlsx,テキスト ファイル (.txt), *.txt"
"すべてのファイル(.),."
FilterIndex 使用するフィルタのインデックス 1
Title ダイアログボックスのタイトル "ファイルを開く"
ButtonText (Mac限定) ボタンに表示するテキスト "開く"
MultiSelect 複数のファイルを選択できるかどうか
True で複数選択可能
False
' ファイル選択ダイアログを表示し、選択されたファイルのパスを取得
Sub GetFilePath()
    ' 変数宣言
    Dim filePath As Variant
    
    ' ファイル選択ダイアログを表示
    filePath = Application.GetOpenFilename( _
        FileFilter:="Excelファイル (*.xlsx),*.xlsx,すべてのファイル (*.*),*.*", _
        Title:="処理するファイルを選択してください", _
        MultiSelect:=False)
    
    ' キャンセルされた場合
    If filePath = False Then
        MsgBox "ファイル選択がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' 選択されたファイルパスをメッセージボックスで表示
    MsgBox "選択されたファイル: " & filePath, vbInformation
End Sub

FileFilter引数の書式は「説明文1,拡張子1,説明文2,拡張子2,...」という形式です。説明文とその直後の拡張子がペアになっていることに注意してください。

複数ファイルの選択

MultiSelect引数をTrueに設定すると、ユーザーは複数のファイルを選択できるようになります。ファイルが選択された場合、戻り値はファイルパスを含む配列になります。キャンセルされた場合は、単一選択の場合と同様に単純な False 値(Boolean型)が返されます。

' 複数のファイルを選択できるダイアログを表示
Sub GetMultipleFilePaths()
    ' 変数宣言
    Dim filePaths As Variant
    Dim i As Long
    Dim fileList As String
    
    ' 複数ファイル選択可能なダイアログを表示
    filePaths = Application.GetOpenFilename( _
        FileFilter:="Excelファイル (*.xlsx;*.xls),*.xlsx;*.xls", _
        Title:="処理するファイルを選択してください", _
        MultiSelect:=True)
    
    ' キャンセルされた場合
    If TypeName(filePaths) = "Boolean" Then
        MsgBox "ファイル選択がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' 選択されたファイルの一覧を作成
    fileList = "選択されたファイル:" & vbCrLf & vbCrLf
    For i = LBound(filePaths) To UBound(filePaths)
        fileList = fileList & filePaths(i) & vbCrLf
    Next i
    
    ' 選択されたファイル一覧を表示
    MsgBox fileList, vbInformation
End Sub

複数ファイル選択時の注意点

MultiSelect = True の場合、戻り値は常に配列として返されるため、キャンセル判定には特別な処理が必要です。
キャンセル時は、単一選択の場合のように False が返されます。しかし、複数選択した場合は、配列が返されます。そのため、If filePaths = False Then のような単純な比較ではエラーが発生します。

image.png

正しくキャンセルを判定するには、まず TypeName 関数を使用して型を判定する必要があります。あるいは IsArray 関数で配列かどうかを確認する方法も有効です。(例:If Not IsArray(filePaths) Then

ファイルを開く方法

Excelブックを開くには、Workbooks コレクションの Open メソッドを使用します。Application.GetOpenFilename で取得したファイルパスを使用して、ファイルを開くことができます。

基本構文

Workbooks.Open(Filename, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended], [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru], [Local], [CorruptLoad])

主な引数

引数 説明
Filename 開くファイルの名前(パス)
ReadOnly Trueの場合、読み取り専用で開く
Password ファイルを開くためのパスワード
Origin テキストファイルの場合、ファイルの元の形式を指定(例: xlWindows, xlMacintosh)
Delimiter テキストファイルの場合、区切り文字を指定(例: カンマ "," やタブ等)

他の引数について知りたい方は、公式のWorkbooks.Open メソッド (Excel)をご覧ください。

基本的な使い方

' 基本的なファイルを開く処理
Sub OpenExcelFile()
    ' 変数宣言
    Dim filePath As Variant
    Dim wb As Workbook
    
    ' ファイル選択ダイアログを表示
    filePath = Application.GetOpenFilename( _
        FileFilter:="Excelファイル (*.xlsx),*.xlsx", _
        Title:="開くファイルを選択してください")
    
    ' キャンセルされた場合は処理を終了
    If filePath = False Then
        MsgBox "ファイル選択がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' 選択されたファイルを開く
    Set wb = Workbooks.Open(Filename:=filePath)
    
    ' 処理成功のメッセージを表示
    MsgBox "ファイルを開きました:" & wb.Name, vbInformation
End Sub

CSVファイルを開く場合

CSVファイルを開く場合は、区切り文字などの追加設定が必要になることがあります。

' CSVファイルを開く例
Sub OpenCSVFile()
    ' 変数宣言
    Dim filePath As Variant
    Dim wb As Workbook
    
    ' CSVファイル選択ダイアログを表示
    filePath = Application.GetOpenFilename( _
        FileFilter:="CSVファイル (*.csv),*.csv", _
        Title:="開くCSVファイルを選択してください")
    
    ' キャンセルされた場合は処理を終了
    If filePath = False Then
        MsgBox "ファイル選択がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' CSVファイルを開く(区切り文字はカンマ、元の形式はCSV)
    Set wb = Workbooks.Open(Filename:=filePath, _
                          Origin:=xlWindows, _ 
                          Delimiter:=",")
    
    ' ファイルを開いたことを通知
    MsgBox "CSVファイルを開きました:" & wb.Name, vbInformation
End Sub

Workbooks.Openメソッドで開いたWorkbookは変数に格納しておくと、後続の処理で参照できるため便利です。開いたワークブックに対して処理を行いたい場合は、変数に格納することが重要です。

エラーハンドリング

ファイルを開く処理は、様々な原因で失敗する可能性があります。例えば、指定したファイルパスにファイルが存在しない、ファイルが破損している、アクセス権限がない、ファイルが別のプログラムにて使用中でロックされている、などの状況が考えられます。
こうした状況に対処するためのエラーハンドリングについても考慮することが重要です。

' エラーハンドリングを含むファイルを開く処理
Sub OpenExcelFileWithErrorHandling()
    ' 変数宣言
    Dim filePath As Variant
    Dim wb As Workbook

    ' エラーハンドリング
    On Error GoTo ErrorHandler  
    
    ' ファイル選択ダイアログを表示
    filePath = Application.GetOpenFilename( _
        FileFilter:="Excelファイル (*.xlsx),*.xlsx", _
        Title:="開くファイルを選択してください")
    
    ' キャンセルされた場合は処理を終了
    If filePath = False Then
        MsgBox "ファイル選択がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' 選択されたファイルを開く
    Set wb = Workbooks.Open(Filename:=filePath)
    
    ' 処理成功のメッセージを表示
    MsgBox "ファイルを開きました:" & wb.Name, vbInformation
    Exit Sub  ' 正常終了時はここでサブプロシージャを終了
    
ErrorHandler:
      ' エラーの内容を表示
        MsgBox "ファイルを開けませんでした。" & vbCrLf & _
               "エラー番号: " & Err.Number & vbCrLf & _
               "エラー内容: " & Err.Description, vbExclamation
End Sub

エラー処理

エラーハンドリングの基本的な方法には On Error Resume Next(エラーを無視して続行)と On Error GoTo ラベル名(エラー発生時に特定の処理へジャンプ)があります。VBAで処理を安定させるためには、エラーハンドリングを適切に行うことが重要です。
エラー処理については、下記で解説しておりますので、ぜひご覧ください。

第4回: Excel VBAにおけるシート操作の基本とエラー処理

GetSaveFilenameメソッド

ファイルを保存する際のパスを取得するには、Application.GetSaveFilenameメソッドを使用します。使い方はGetOpenFilenameとほぼ同じです。

' 保存先を選択するダイアログを表示
Sub GetSaveFilePath()
    ' 変数宣言
    Dim saveFilePath As Variant
    
    ' 保存ダイアログを表示
    saveFilePath = Application.GetSaveFilename( _
        FileFilter:="Excelブック (*.xlsx),*.xlsx,Excel 97-2003 ブック (*.xls),*.xls", _
        Title:="ファイルの保存先を選択してください", _
        InitialFileName:="レポート_" & Format(Date, "yyyymmdd") & ".xlsx")
    
    ' キャンセルされた場合
    If saveFilePath = False Then
        MsgBox "保存がキャンセルされました。", vbInformation
        Exit Sub
    End If
    
    ' 選択されたパスを表示
    MsgBox "保存先: " & saveFilePath, vbInformation
End Sub

追加の引数

引数 説明
InitialFileName 初期表示の保存するファイル名 "レポート.xlsx"

ファイルの保存処理

Excel VBAでは、ワークブックを保存するためにWorkbook.SaveAsメソッドを使用します。新規保存だけでなく、別名保存や異なる形式での保存もこのメソッドで行うことができます。

' アクティブなワークブックを別名で保存する
Sub SaveWorkbookAs()
    ' 変数宣言
    Dim saveFilePath As Variant
    
    ' 保存ダイアログを表示
    saveFilePath = Application.GetSaveFilename( _
        FileFilter:="Excelブック (*.xlsx),*.xlsx,Excel 97-2003 ブック (*.xls),*.xls", _
        Title:="ファイルの保存先を選択してください", _
        InitialFileName:="新しいレポート.xlsx")
    
    ' キャンセルされた場合
    If saveFilePath = False Then Exit Sub
    
    ' ファイルを保存
    ActiveWorkbook.SaveAs _
        Filename:=saveFilePath, _
        FileFormat:=xlOpenXMLWorkbook, _
        CreateBackup:=False
    
    MsgBox "ファイルが保存されました: " & saveFilePath, vbInformation
End Sub

SaveAsメソッドの主な引数

引数 説明
Filename 保存するファイル名(フルパス) "C:\Reports\Report.xlsx"
FileFormat ファイル形式を指定する定数 xlOpenXMLWorkbook (xlsx形式)
Password ファイルを開くためのパスワード "SecretPassword"
WriteResPassword 書き込み保護のパスワード "EditPassword"
ReadOnlyRecommended 読み取り専用を推奨するか True/False
CreateBackup バックアップファイルを作成するか True/False

主なFileFormat定数

定数 説明
xlOpenXMLWorkbook 51 Excel 2007以降の標準形式 (.xlsx)
xlExcel8 56 Excel 97-2003形式 (.xls)
xlCSV 6 CSVファイル形式 (.csv)
xlTextPrinter 36 テキストファイル形式 (.txt)
xlOpenXMLWorkbookMacroEnabled 52 マクロ有効ブック (.xlsm)
xlPDF 57 PDFファイル形式 (.pdf)

SaveAsメソッドを実行すると、保存先に同名のファイルが既に存在する場合は上書きされます。必要に応じて、事前にファイルの存在確認と確認ダイアログの表示を検討してください。

既存のワークブックの保存

既存のワークブックを上書き保存する場合は、単にWorkbook.Saveメソッドを使用します。

' アクティブなワークブックを上書き保存する
Sub SaveCurrentWorkbook()
    ' 未保存の新規ワークブックかどうか確認
    If ActiveWorkbook.Path = "" Then
        ' 一度も保存されていない場合はSaveAsを使用
        Dim saveFilePath As Variant
        saveFilePath = Application.GetSaveFilename( _
            FileFilter:="Excelブック (*.xlsx),*.xlsx", _
            Title:="新規ファイルの保存先を選択してください")
        
        If saveFilePath = False Then Exit Sub
        
        ActiveWorkbook.SaveAs Filename:=saveFilePath
    Else
        ' 既存のファイルは単に上書き保存
        ActiveWorkbook.Save
    End If
    
    MsgBox "ファイルが保存されました。", vbInformation
End Sub

現在のブックと同じ場所に保存

VBAでは、現在実行中のブックと同じフォルダに別のファイルを保存したい場合があります。そのような場合は、ThisWorkbook.Path プロパティを使うと便利です。このプロパティは、現在のマクロが格納されているブックのフォルダパスを取得します。

' 現在のブックと同じフォルダにファイルを保存
Sub SaveToSameFolder()
    ' 変数宣言
    Dim currentPath As String
    Dim newFileName As String
    Dim fullPath As String
    
    ' 現在のブックが保存されているフォルダのパスを取得
    currentPath = ThisWorkbook.Path
    
    ' 新しいファイル名を設定(例:元のファイル名_YYYYMMDD.xlsx)
    newFileName = "データバックアップ_" & Format(Date, "YYYYMMDD") & ".xlsx"
    
    ' フルパスを作成(パスとファイル名を結合)
    fullPath = currentPath & "\" & newFileName
    
    ' アクティブなワークブックを新しい名前で保存
    ActiveWorkbook.SaveAs _
        Filename:=fullPath, _
        FileFormat:=xlOpenXMLWorkbook, _
        CreateBackup:=False
    
    ' 保存完了メッセージを表示
    MsgBox "以下の場所にファイルを保存しました:" & vbCrLf & fullPath, vbInformation
End Sub

ポイント

  • ThisWorkbook.Path
    現在のファイルが保存されているパスを取得します。例えば、ファイルが C:\MyDocuments\ に保存されている場合、ThisWorkbook.PathC:\MyDocuments になります。

  • 同じフォルダに保存
    新しいファイルを同じフォルダ内に保存する場合は、ThisWorkbook.Path の後にファイル名を追加してパスを指定します。

現在のブックの1つ上のフォルダに保存

現在のブックがあるフォルダの親フォルダ(1つ上のフォルダ)に保存したい場合もあります。このような場合は、FileSystemObject(参照設定が必要: 次回以降の記事で解説します)を使用するか、文字列操作で親フォルダのパスを取得できます。

' 文字列操作で親フォルダにファイルを保存
Sub SaveToParentFolder()
    ' 親フォルダのパスを格納する変数
    Dim parentPath As String

    ' 保存するファイルの名前を格納する変数
    Dim newFileName As String

    ' 完全なファイルパス(フォルダパス+ファイル名)を格納する変数
    Dim fullPath As String
    
    ' 最後の「\」の位置を探して、親フォルダのパスを取得
    parentPath =Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\"))
    
    ' 新しいファイル名を設定(例:親フォルダ保存_YYYYMMDD.xlsx)
    newFileName = "\親フォルダ保存_" & Format(Date, "YYYYMMDD") & ".xlsx"
    
    ' フルパスを作成(親パスとファイル名を結合)
    fullPath = parentPath & newFileName
    
    ' アクティブなワークブックを新しい名前で保存
    ActiveWorkbook.SaveAs Filename:=fullPath
    
    ' 保存完了メッセージを表示
    MsgBox "親フォルダに保存しました:" & vbCrLf & fullPath, vbInformation
End Sub

ポイント

  • 1つ上のフォルダの取得
    InStrRev を使用して、最後のフォルダ区切り文字(\)を見つけ、さらにその1つ上のフォルダまでのパスを取得します。(InStrRev: 指定した文字を右から(末尾から)検索し、最初に見つかった位置を返す関数)

  • パスの操作
    Left 関数と InStrRev 関数を組み合わせて、1つ上のフォルダパスを動的に取得しています。

ThisWorkbook.Path を活用することで、ユーザーに保存場所を毎回指定させることなく、適切な場所にファイルを保存できるようになります。これは特に定期的なバックアップやレポート生成などの自動処理に役立ちます。

フォルダ選択ダイアログの表示

ファイル選択だけでなく、フォルダを選択させたい場合もあります。例えば、複数のファイルを一括処理する対象フォルダや、処理結果の保存先フォルダをユーザーに選ばせたい場合などです。

その場合は、Application.FileDialog を使用します。Application.GetOpenFilename と似ていますが、こちらはファイルではなくフォルダを選択するために使用します。

FileDialogオブジェクトとは

FileDialog オブジェクトは、Microsoft Officeアプリケーションで利用できる、ファイルを開いたり、保存したり、フォルダを選択したりするためのダイアログボックスをプログラムから制御するためのオブジェクトです。FileDialog オブジェクトを使用すると、Windowsの標準的なファイル選択ダイアログやフォルダ選択ダイアログを表示し、ユーザーに選択させることができます。

基本構文

Application.FileDialog(msoFileDialogType)

msoFileDialogType には、以下のいずれかの定数を指定します。

定数 説明
msoFileDialogOpen ファイルを開くためのダイアログを表示します
msoFileDialogSaveAs ファイルを保存するためのダイアログを表示します
msoFileDialogFilePicker ファイルを選択するためのダイアログを表示します
msoFileDialogFolderPicker フォルダを選択するためのダイアログを表示します

今回は、フォルダを選択したいので、msoFileDialogFolderPicker を使用します。

Sub SelectFolder()
    Dim folderPath As String ' フォルダのパスを格納する変数
    
    ' フォルダを選択するダイアログを表示
    With Application.FileDialog(msoFileDialogFolderPicker)
        ' ダイアログがOKで閉じられなかった場合は終了
        If .Show <> True Then Exit Sub
        ' 選択されたフォルダのパスを取得
        folderPath = .SelectedItems(1)
    End With
    
    ' 選択されたフォルダのパスをメッセージボックスで表示
    MsgBox "選択したフォルダ: " & folderPath, vbInformation
End Sub

プロパティの説明

プロパティ名 説明
Title ダイアログボックスのタイトルバーに表示するテキスト .Title = "処理対象フォルダを選択"
ButtonName 選択ボタンに表示するテキスト(環境によって対応していない場合あり) .ButtonName = "選択"
InitialFileName 初期表示するフォルダのパス .InitialFileName = "C:\Data"
InitialView ファイルやフォルダの表示形式 .InitialView = msoFileDialogViewDetails
AllowMultiSelect 複数選択を許可するかどうか(フォルダ選択では常にFalse) .AllowMultiSelect = False

InitialView プロパティ

  • msoFileDialogViewDetails: 詳細表示(ファイル名、サイズ、日付など)
  • msoFileDialogViewLargeIcons: 大きいアイコン表示
  • msoFileDialogViewSmallIcons: 小さいアイコン表示
  • msoFileDialogViewList: リスト表示
  • msoFileDialogViewPreview: プレビュー表示
  • msoFileDialogViewProperties: プロパティ表示
  • msoFileDialogViewThumbnail: サムネイル表示
  • msoFileDialogViewWebView: Web表示
  • msoFileDialogViewTiles: タイル表示

初期表示フォルダを指定

特定のフォルダを初期表示したい場合があります。例えば、ドキュメントフォルダや特定のプロジェクトフォルダを最初に開くように設定することで、ユーザーエクスペリエンスを向上させることができます。

初期表示フォルダを指定するには、InitialFileName プロパティを使用します。

Sub SelectFolderWithInitialView()
    ' 選択されたフォルダのパスを格納する変数
    Dim folderPath As String 

    ' 初期表示したいフォルダのパスを格納する変数
    Dim initialFolder As String 

    ' 初期表示したいフォルダのパスを設定
    initialFolder = "C:\Users\ユーザー名\Documents"  ' 例:ドキュメントフォルダ

    ' フォルダを選択するダイアログを表示
    With Application.FileDialog(msoFileDialogFolderPicker) 
        .Title = "フォルダを選択してください"          ' ダイアログのタイトルを設定
        .AllowMultiSelect = False                    ' 複数選択を禁止
        .InitialFileName = initialFolder             ' 初期表示フォルダを指定

        ' ダイアログを表示し
        If .Show <> True Then 

           ' キャンセルされた場合は処理を終了
           Exit Sub 
        End If

        ' 選択されたフォルダのパスを取得
        folderPath = .SelectedItems(1) 
        
        ' 選択されたフォルダのパスをメッセージボックスに表示
        MsgBox "選択されたフォルダ: " & folderPath
    End With
End Sub

フォルダの作成

フォルダを作成するには、MkDirステートメントを使用します。

基本構文

MkDir path

pathは作成するフォルダの絶対パスまたは相対パスです。

基本的な使い方

Sub CreateFolder()
    ' 作成したいフォルダのパスを設定
    Dim newFolderPath As String
    newFolderPath = "C:\Users\ユーザー名\Documents\新しいフォルダ"
    
    ' エラーハンドリングを導入(フォルダが既に存在する場合に備えて)
    On Error Resume Next
    
    ' MkDirステートメントを用いて新規フォルダを作成
    MkDir newFolderPath
    
    ' エラーチェック:エラーが発生していないか調べ、メッセージを表示
    If Err.Number = 0 Then
        MsgBox "フォルダが作成されました: " & newFolderPath
    Else
        ' エラー番号を確認し、既に存在する場合のメッセージを設定
        If Err.Number = 75 Then ' エラー番号75は特に「フォルダが既に存在する」など
            MsgBox "フォルダは既に存在しています。: " & newFolderPath
        Else
            MsgBox "フォルダ作成中にエラーが発生しました。エラー番号: " & Err.Number
        End If
    End If

    ' エラーハンドリングの終了
    On Error GoTo 0
End Sub

入れ子フォルダの作成

親フォルダが存在しない場合、そのサブフォルダを直接作成しようとするとエラーが発生します。入れ子フォルダを作成する場合は、親フォルダから順に作成する必要があります。

' 複数階層のフォルダを作成
Sub CreateNestedFolders()
    ' 作成する階層的なフォルダパスを指定
    Dim basePath As String
    Dim year As String
    Dim month As String
    Dim fullPath As String
    
    ' 基本となるパスを設定
    basePath = "C:\ReportData"
    
    ' 年月のフォルダ名を作成
    year = "2023年"
    month = "10月"
    
    ' フォルダのパスを組み立て
    Dim yearPath As String
    Dim monthPath As String
    yearPath = basePath & "\" & year
    monthPath = yearPath & "\" & month
    
    ' 基本フォルダが存在しなければ作成
    If Dir(basePath, vbDirectory) = "" Then
        MkDir basePath
    End If
    
    ' 年フォルダが存在しなければ作成
    If Dir(yearPath, vbDirectory) = "" Then
        MkDir yearPath
    End If
    
    ' 月フォルダが存在しなければ作成
    If Dir(monthPath, vbDirectory) = "" Then
        MkDir monthPath
    End If
    
    MsgBox "以下のフォルダ構造を作成しました:" & vbCrLf & _
           monthPath, vbInformation
End Sub

Dir関数について

Dir(path, [attributes])関数は、指定されたパスにあるファイルやフォルダを検索します。

  • 第1引数pathには検索するパスを指定します
  • 第2引数attributesには検索するファイルの属性を指定します(vbDirectoryはフォルダを意味します)
  • フォルダが存在しない場合は空の文字列("")を返します

日付を含むフォルダ名の作成

業務では日付のフォルダを作成することがよくあります。以下の例では現在の日付を使用したフォルダを作成します。

' 日付を含むフォルダを作成する例
Sub CreateDateFolder()
    ' 基本となるパスを設定
    Dim basePath As String
    basePath = "C:\Backups"
    
    ' 現在の日付を取得してフォルダ名に使用(例:20231015)
    Dim todayFolder As String
    todayFolder = Format(Date, "yyyymmdd")
    
    ' 完全なパスを組み立て
    Dim fullPath As String
    fullPath = basePath & "\" & todayFolder
    
    ' ベースフォルダが存在するか確認
    If Dir(basePath, vbDirectory) = "" Then
        ' ベースフォルダが存在しない場合は作成
        MkDir basePath
    End If
    
    ' 日付フォルダが存在するか確認
    If Dir(fullPath, vbDirectory) = "" Then
        ' 日付フォルダが存在しない場合は作成
        MkDir fullPath
        MsgBox "今日の日付のフォルダを作成しました: " & fullPath, vbInformation
    Else
        ' 既に存在する場合はメッセージを表示
        MsgBox "今日の日付のフォルダは既に存在します: " & fullPath, vbExclamation
    End If
End Sub

MkDirを使用する際の注意点

  • 作成しようとするパスの親フォルダが存在しない場合、エラーが発生します
  • 既に存在するフォルダを作成しようとするとエラーになります
  • Dir関数を使用して事前にフォルダの存在確認をすることをお勧めします
  • ネットワークドライブにフォルダを作成する場合、適切なアクセス権があることを確認してください

ファイル名・フォルダ名の変更

ファイルやフォルダの名前を変更する方法として、Name ステートメントを使用します。この Name ステートメントを活用することで、手動でファイル名を変更する手間を減らし、自動化することができます。

基本構文

Name 古いパス As 新しいパス

古いパス には現在のファイル/フォルダのパスを、新しいパス には変更後のパスを指定します。

ファイル名の変更

' ファイル名を変更する基本的な例
Sub RenameFile()
    ' 変数宣言
    Dim oldPath As String
    Dim newPath As String
    
    ' 変更前と変更後のファイルパスを設定
    oldPath = "C:\Data\古いファイル.xlsx"
    newPath = "C:\Data\新しいファイル.xlsx"
    
    ' エラーハンドリングを設定
    On Error Resume Next
    
    ' Nameステートメントでファイル名を変更
    Name oldPath As newPath
    
    ' エラーチェック
    If Err.Number = 0 Then
        ' エラーがなければ成功メッセージを表示
        MsgBox "ファイル名を変更しました。" & vbCrLf & _
               "変更前: " & oldPath & vbCrLf & _
               "変更後: " & newPath, vbInformation
    Else
        ' エラーが発生した場合はエラーメッセージを表示
        MsgBox "ファイル名の変更に失敗しました。" & vbCrLf & _
               "エラー: " & Err.Description, vbExclamation
    End If
    
    ' エラーハンドリングを終了
    On Error GoTo 0
End Sub

フォルダ名の変更

フォルダ名の変更も同様に Name ステートメントを使用します。

' フォルダ名を変更する例
Sub RenameFolder()
    ' 変数宣言
    Dim oldFolderPath As String
    Dim newFolderPath As String
    
    ' 変更前と変更後のフォルダパスを設定
    oldFolderPath = "C:\Data\古いフォルダ"
    newFolderPath = "C:\Data\新しいフォルダ"
    
    ' フォルダが存在するか確認
    If Dir(oldFolderPath, vbDirectory) = "" Then
        ' 存在しない場合はメッセージを表示して終了
        MsgBox "変更対象のフォルダが見つかりません: " & oldFolderPath, vbExclamation
        Exit Sub
    End If
    
    ' 変更先のフォルダが既に存在するか確認
    If Dir(newFolderPath, vbDirectory) <> "" Then
        ' 既に存在する場合はメッセージを表示して終了
        MsgBox "変更先のフォルダ名は既に存在します: " & newFolderPath, vbExclamation
        Exit Sub
    End If
    
    ' エラーハンドリングを設定
    On Error Resume Next
    
    ' フォルダ名を変更
    Name oldFolderPath As newFolderPath
    
    ' エラーチェック
    If Err.Number = 0 Then
        ' 成功した場合はメッセージを表示
        MsgBox "フォルダ名を変更しました。" & vbCrLf & _
               "変更前: " & oldFolderPath & vbCrLf & _
               "変更後: " & newFolderPath, vbInformation
    Else
        ' エラーが発生した場合はメッセージを表示
        MsgBox "フォルダ名の変更に失敗しました。" & vbCrLf & _
               "エラー: " & Err.Description, vbExclamation
    End If
    
    ' エラーハンドリングを終了
    On Error GoTo 0
End Sub

Nameステートメントを使用する際の注意点

  • 変更先に同名のファイルやフォルダが既に存在する場合はエラーになります
  • ファイルが開かれている(使用中)の場合は変更できません
  • 異なるドライブ間ではNameステートメントでの移動はできません(例:CドライブからDドライブへ)
  • ファイルの権限によっては変更できない場合があります

まとめ

ファイル操作とフォルダ管理は、Excel VBAを活用した効率的な業務自動化に不可欠な要素です。この記事で紹介したファイル選択ダイアログの表示、ファイルの開閉、保存方法、そしてフォルダの作成・管理などの基本操作を身につけることで、より実用的なVBAアプリケーションを開発することが可能になります。

実務では、エラー処理を適切に組み込むことも非常に重要です。ファイルが存在しない、アクセス権がない、同名ファイルが既に存在するなど、様々な状況に対応できるよう、エラーハンドリングを考慮したコーディングを心がけましょう。また、ユーザーが操作しやすいインターフェースを提供するための初期フォルダ設定や、適切なフィルタ設定なども重要なポイントです。

これらのファイル操作技術を、前回までに解説した配列や条件分岐、繰り返し処理などと組み合わせることで、より高度で実用的なExcel VBAアプリケーションを開発することができます。例えば、特定フォルダ内のすべてのExcelファイルを開いて集計し、結果を新しいファイルに保存するといった複雑な処理も、今回紹介した技術を組み合わせることで実現可能です。

もし記事の内容で不明な点や、より詳しく知りたい部分がありましたら、コメントでお知らせください。また、実務でのファイル操作の活用例や、より効率的な実装方法など、皆様のノウハウもぜひ共有していただければ幸いです。

次回は、FileSystemObject(FSO)を使った高度なファイル操作について解説する予定です。ファイルの読み書き、フォルダ内のファイル一覧取得、テキストファイルの操作など、より柔軟で強力なファイル管理テクニックをご紹介します。どうぞお楽しみに!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?