VBA_FileDialog_ファイル選択と値出力

### やること
今回はファイルダイアログを表示して、選択したファイルのフォルダパスとファイル名をセルに出力します。
ファイルが1件の場合、複数件の場合、出力方法ごとに書いていきます。

### イメージ
ボタン「選択」にマクロを割り当てています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552400/dac6857d-4bd9-9be4-159d-941db8f88386.png)

### 手順
・ボタン「選択」押下（手動）
・ダイアログを表示
・ファイルを選択し、ボタン「開く」押下（手動）
・セルに値をセット

### 使うもの
Application.FileDialog(msoFileDialogFilePicker)
<b>Application</b>オブジェクトの<b>FileDialog</b>プロパティの<b>msoFileDialogFilePicker</b>を指定します。
FileDialogプロパティはファイルダイアログを表示するものです。
これを使用することでファイルの選択や保存ができます。
| 定数 | 説明 |
| ---- | ---- |
| msoFileDialogFolderPicker　　　 | フォルダを選択　　　 |
| msoFileDialogFilePicker | ファイルを選択 |
| msoFileDialogOpen | ファイルを開く |
|msoFileDialogSaveAs| ファイルを保存 |

### ダイアログのプロパティ、メソッド指定
#### ダイアログのタイトルを設定
<b>Title</b>：ダイアログのタイトルを設定できる。何のダイアログなのかユーザーが分かるものを設定。
```
Application.FileDialog(msoFileDialogFilePicker).Title = "ファイルを選択してください"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552400/262ef8be-1cb4-4ee7-3f11-9171a19569ac.png)

#### 選択できるファイル形式の指定
<b>Filters</b>：特定のファイル形式を指定することで、ユーザーが選択できるファイルを制限できる。
```
Application.FileDialog(msoFileDialogFilePicker).Filters.Add "すべてのファイル", "*.*"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552400/5411d887-240f-cd14-c9e2-9f063b83f2cd.png)

#### ファイルの複数選択可否
<b>AllowMultiSelect</b>：複数のファイルを選択できるかどうかを指定できる。True に設定すると、複数のファイルを選択可能。（デフォルトはFalse）
```
Application.FileDialog(msoFileDialogFilePicker).AllowMultiSelect = False
```

#### ダイアログ表示
<b>Show</b>：ダイアログボックスを表示するメソッド。返す値は下記の通り。
・-1：ダイアログ上のボタン「OK（開く）」が押された場合。（vbok）
・ 0：ダイアログ上のボタン「キャンセル」が押された場合。（vbCancel）

#### 選択されたファイルのパス取得
<b>SelectedItems</b>：取り出し方は下記の通り。
```
Dim fullpath  As String
fullpath = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
```

### サンプル
#### ファイル1件のみ、指定セル有り
``` 
Sub SelectFile()
    Dim strFilePath     As String
    Dim strFolderPath   As String
    Dim strFileName     As String
    
    'ファイル選択ダイアログを表示
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "ファイルを選択してください"
        .Filters.Clear
        .Filters.Add "すべてのファイル", "*.*"
        .AllowMultiSelect = False 'ファイル複数選択不可
        
        'ファイルが選択された場合
        If .Show = -1 Then
            strFilePath = .SelectedItems(1)
            strFolderPath = Left(strFilePath, InStrRev(strFilePath, "\") - 1) 'フォルダパスを取得
            strFileName = Mid(strFilePath, InStrRev(strFilePath, "\") + 1) 'ファイル名を取得
            
            ' フォルダパス出力
            ThisWorkbook.Sheets("Sample1").Range("B2").Value = strFolderPath
            ' ファイル名出力
            ThisWorkbook.Sheets("Sample1").Range("B3").Value = strFileName
        End
    End With
End Sub
```
出力結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552400/48fef0c7-eb4d-3d67-b591-0939e9108a1c.png)

#### ファイル複数件、対応セルに出力
```
Sub SelectMultiFile()
    Dim strFilePath       As String
    Dim strFolderPath     As String
    Dim strFileName       As String
    Dim intCnt            As Integer
    
    'ファイル選択ダイアログを表示
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "ファイルを選択してください"
        .Filters.Clear
        .Filters.Add "すべてのファイル", "*.*"
        .AllowMultiSelect = True 'ファイル複数選択可
        
        'ファイルが選択された場合
        If .Show = -1 Then
            '値出力
            For intCnt = 1 To .selectedItems.Count
                strFilePath = .selectedItems.Item(intCnt)
                strFolderPath = Left(strFilePath, InStrRev(strFilePath, "\") - 1) 'フォルダパスを取得
                strFileName = Mid(strFilePath, InStrRev(strFilePath, "\") + 1) 'ファイル名を取得
                
                ' フォルダパス出力
                ThisWorkbook.Sheets("Sample2").Cells(intCnt + 1, 1).Value = strFolderPath
                ' ファイル名出力
                ThisWorkbook.Sheets("Sample2").Cells(intCnt + 1, 2).Value = strFileName
            Next intCnt
        End If
    End With
End Sub
```
出力結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552400/724d0bce-f921-87ee-6eb8-3382896f6436.png)

### おわりに
このダイアログを表示する処理は、配置場所を考慮し設置することで、開発者以外のユーザーがExcelマクロファイルを使用する場合でも、視覚的に使用方法が分かりやすくなるのではないかと思います。


参考：
https://learn.microsoft.com/ja-jp/office/vba/api/excel.application(object)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.filedialog


エンジニアファーストの会社 [株式会社CRE-CO](https://www.cre-co.jp/#top)　S.K