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

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

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

- [第1回: Excel VBAの基礎知識とセキュリティ設定](https://qiita.com/CodeLeaf/items/2d3e3185a725480fecc3)
- [第2回: Excel VBAの基本操作とオブジェクトの理解](https://qiita.com/CodeLeaf/items/c65d2531908aaf53649d)
- [第3回: Excel VBAにおける変数と定数の基本](https://qiita.com/CodeLeaf/items/3b36eddf7b5a8b5c5d99)
- [第4回: Excel VBAにおけるシート操作の基本とエラー処理](https://qiita.com/CodeLeaf/items/573fb7c61a756aa123ea)
- [第5回: Excel VBAにおける条件分岐](https://qiita.com/CodeLeaf/items/8be52d682baa097a65c1)
- [第6回: Excel VBAにおける繰り返し処理の基本](https://qiita.com/CodeLeaf/items/5bc6c961a090e550bca9)
-  [第7回: Excel VBAにおける配列とFor Eachの活用](https://qiita.com/CodeLeaf/items/bdd8d488e49086219663)
- [第8回: Excel VBAにおけるFormulaとValueの使い分けとユーザー入力の取得](https://qiita.com/CodeLeaf/items/ecf312a53f7ede91bce9)
- 第9回: Excel VBAにおけるファイル操作とフォルダ管理の基本（本記事）
- [第10回: Excel VBAにおけるFileSystemObjectを活用した高度なファイル操作](https://qiita.com/CodeLeaf/items/a78e9c7dd2b7e68f1d9e)
- [第11回: Excel VBAにおけるFileSystemObjectを活用した高度なファイル操作 応用編](https://qiita.com/CodeLeaf/items/4607db0151dddfb7f458)
- [第12回: Excel VBAにおけるStrConv関数の活用と応用テクニック](https://qiita.com/CodeLeaf/items/4f6358548bced6c047e0)
- [第13回: Excel VBAにおけるワークブックの安全な操作と管理テクニック](https://qiita.com/CodeLeaf/items/cf136898dd41c7dd5d9f)
- [第14回: Excel VBAにおけるFunction（関数）の作成と活用テクニック](https://qiita.com/CodeLeaf/items/a299f465bdcb1957e2be)
- [第15回: Excel VBAにおける配列を返す関数の作成と活用テクニック](https://qiita.com/CodeLeaf/items/711a93ac86b5c4150e13)
- [第16回: Excel VBAにおけるコレクションの活用と応用テクニック](https://qiita.com/CodeLeaf/items/6a28c65d5f8d19964664)
- [第17回: Excel VBAにおける辞書型（Dictionary）の活用と応用テクニック](https://qiita.com/CodeLeaf/items/5f85b2029e8d51eaa788)
- [第18回: Excel VBAにおけるEnum型を活用した関数設計と実装テクニック](https://qiita.com/CodeLeaf/items/3e91ef9556799d96aeea)
- [第19回: Excel VBAにおけるユーティリティ関数の作成と活用テクニック](https://qiita.com/CodeLeaf/items/bc156b6a9cadd7b10601)
- [第20回: Excel VBAにおける正規表現を活用したファイル名解析テクニック](https://qiita.com/CodeLeaf/items/86284498dee42aab731e)


## 目次

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

## はじめに

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


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

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

### 基本構文

```vb
Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
```

| 引数 | 説明 | デフォルト値 |
|------|------|-------------|
| FileFilter | ファイルの種類をフィルタリングするための設定 <br> 例: "Excel ファイル (*.xlsx), *.xlsx,テキスト ファイル (*.txt), *.txt" | "すべてのファイル(*.*),*.*" |
| FilterIndex | 使用するフィルタのインデックス | 1 |
| Title | ダイアログボックスのタイトル | "ファイルを開く" |
| ButtonText | (Mac限定) ボタンに表示するテキスト | "開く" |
| MultiSelect | 複数のファイルを選択できるかどうか <br> True で複数選択可能| False |

```vb
' ファイル選択ダイアログを表示し、選択されたファイルのパスを取得
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
```

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

### 複数ファイルの選択

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

```vb
' 複数のファイルを選択できるダイアログを表示
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
```

:::note warn
#### 複数ファイル選択時の注意点

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818373/c25e0ec9-925f-4c83-b28f-d60440971bf5.png)

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

## ファイルを開く方法

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

### 基本構文

```vb
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)](https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbooks.open)をご覧ください。

### 基本的な使い方

```vb
' 基本的なファイルを開く処理
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ファイルを開く場合は、区切り文字などの追加設定が必要になることがあります。

```vb
' 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
```

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

### エラーハンドリング

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

```vb
' エラーハンドリングを含むファイルを開く処理
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
```

:::note info 
#### エラー処理

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

[第4回: Excel VBAにおけるシート操作の基本とエラー処理](https://qiita.com/CodeLeaf/items/573fb7c61a756aa123ea)
:::


### GetSaveFilenameメソッド

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

```vb
' 保存先を選択するダイアログを表示
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`メソッドを使用します。新規保存だけでなく、別名保存や異なる形式での保存もこのメソッドで行うことができます。

```vb
' アクティブなワークブックを別名で保存する
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) |

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

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

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

```vb
' アクティブなワークブックを上書き保存する
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` プロパティを使うと便利です。このプロパティは、現在のマクロが格納されているブックのフォルダパスを取得します。

```vb
' 現在のブックと同じフォルダにファイルを保存
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.Path` は `C:\MyDocuments` になります。

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

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

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

```vb
' 文字列操作で親フォルダにファイルを保存
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の標準的なファイル選択ダイアログやフォルダ選択ダイアログを表示し、ユーザーに選択させることができます。

### 基本構文

```vb
Application.FileDialog(msoFileDialogType)
```

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

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

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

```vb
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`         |

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

### 初期表示フォルダを指定

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

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

```vb
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`ステートメントを使用します。

### 基本構文

```vb
MkDir path
```

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

### 基本的な使い方

```vb
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
```

### 入れ子フォルダの作成

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

```vb
' 複数階層のフォルダを作成
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
```

:::note info
#### Dir関数について
`Dir(path, [attributes])`関数は、指定されたパスにあるファイルやフォルダを検索します。
- 第1引数`path`には検索するパスを指定します
- 第2引数`attributes`には検索するファイルの属性を指定します（vbDirectoryはフォルダを意味します）
- フォルダが存在しない場合は空の文字列("")を返します
:::

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

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

```vb
' 日付を含むフォルダを作成する例
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
```

:::note warn
#### MkDirを使用する際の注意点

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

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

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

### 基本構文

```vb
Name 古いパス As 新しいパス
```

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

### ファイル名の変更

```vb
' ファイル名を変更する基本的な例
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` ステートメントを使用します。

```vb
' フォルダ名を変更する例
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
```

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

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

## まとめ

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

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

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

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

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