VBA

フォルダーを選択するダイアログを開くマクロ【Excel VBA】

2019-11-17

フォルダを選んで、そのファイルに何らかの編集やマクロの適用などをしたいときに使うファイルダイアログについて解説します。

ダイアログを開く方法に加えて各種オプションの設定方法なども紹介していきます。

ソースコード

引数に行と列を指定することで特定のセルにダイアログで選択したフォルダのアドレスを出力します。

既にセルにアドレスがある場合は、そのフォルダを選択した状態でダイアログが開きます。ネットワークドライブでも有効なのでいちいちマイドキュメント等に戻される手間を回避できます。

※ボタンに登録するときには、’SelectFolder 2,2’のように指定します。

Option Explicit
Sub SelectFolder(ByVal wRow As Integer, ByVal wCol As Integer)
  Dim OpenFile As String
  Dim FSO      As New Scripting.FileSystemObject
  
  ThisWorkbook.ActiveSheet.Cells(wRow, wCol).Select
  OpenFile = ActiveCell.Value
  
  With Application.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    
    If FSO.FolderExists(OpenFile) = True Then
      .InitialFileName = OpenFile & Chr(13)
    End If
    
    If .Show = True Then
      ActiveCell.Value = .SelectedItems(1)
    End If
  End With
End Sub

各種オプション

単一ファイル選択または複数ファイル選択

通常はFalseにして単一ファイルを選択とします。

  With Application.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False    
  End With

初期選択フォルダを設定(前回のファイルを参照)

InitialFileNameにフルパスを指定することで、フォルダを選択した状態でダイアログを開くことができます。

さらにそのファイルのあるフォルダまで遷移した状態になります。

フルパス(前回の情報)をどこかに保存しておく必要がありますが、再選択にかかる時間を削減できるとても便利な機能です。

※ファイルが削除・移動などされている可能性を考慮し、FilesystemobjectのFolderExistsでファイルの存在を再確認しましょう。

  With Application.FileDialog(msoFileDialogFolderPicker)
    If FSO.FolderExists(OpenFile) = True Then
      .InitialFileName = OpenFile & Chr(13)
    End If
  End With

ですがこのオプション、実はフォルダ用には向きません。というのも普通にフォルダパス指定すると最下層フォルダをファイルとして誤判定してしまいます。

なので使用する際は止むを得ずですが、Chr(13)を入れることでそれを回避できます。

デメリットとしてフォルダを再選択する際は、表示されたダイアログをそのままOKすることはできずエラーになります。ですがフォルダの遷移自体は有効ですのでそのまま前回フォルダを再選択すればエラーとはなりません。

よりスマートな方法があればよいですが今のところ用意されていないようです。

選択したフォルダを取得する

ダイアログで選択したフォルダをセルへ出力するには以下のようにします。

Showでダイアログの表示を確認し、SelectedItemsから選択したファイル情報を取得します。

  With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = True Then
      ActiveCell.Value = .SelectedItems(1)
    End If
  End With

参照設定

使用の際には以下参照設定が必要となります。CreateObjectでも代用可能です。

(開発タブ>Visual Basic>ツール(T)>参照設定)

・Microsoft Scripting Runtime

クリックすると別ウィンドウで拡大表示

検証環境

Microsoft Office Excel 2010 および 2016で検証しています。

-VBA
-

© 2021 ReiCodeBlog