title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Application.FileDialog property (Word) |
vbawd10.chm158335426 |
vbawd10.chm158335426 |
word |
Word.Application.FileDialog |
ef478a81-db1d-4bf4-a146-3ff7dd84116b |
06/08/2017 |
medium |
Application.FileDialog property (Word)
Returns a FileDialog object which represents a single instance of a file dialog box.
Syntax
expression. FileDialog
( _FileDialogType_
)
expression Required. A variable that represents an Application object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
FileDialogType | Required | MsoFileDialogType | The type of dialog. |
Example
This example displays the Save As dialog box.
Sub ShowSaveAsDialog() Dim dlgSaveAs As FileDialog Set dlgSaveAs = Application.FileDialog( _ FileDialogType:=msoFileDialogSaveAs) dlgSaveAs.Show End Sub
This example displays the Open dialog box and allows a user to select multiple files to open.
Sub ShowFileDialog() Dim dlgOpen As FileDialog Set dlgOpen = Application.FileDialog( _ FileDialogType:=msoFileDialogOpen) With dlgOpen .AllowMultiSelect = True .Show End With End Sub
See also
Application Object
[!includeSupport and feedback]
Often in VBA we need to ask the users to select files or directories before we execute the actual functionality of our macro. Welcome to the VBA Open file dialog post. Today we will learn how to use the Application.FileDialog, to understand the various msoFileDialogFilePicker file dialog picking options and how to properly manage these dialogs.
Here is a simple example of a VBA File Dialog:
Dim fDialog As FileDialog Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 'Show the dialog. -1 means success! If fDialog.Show = -1 Then Debug.Print fDialog.SelectedItems(1) 'The full path to the file selected by the user End If
Application FileDialog function
Before we start let’s understand the Application.FileDialog function.
The Application.FileDialog has the following syntax:
Application.FileDialog( fileDialogType as MsoFileDialogType )
Parameter
MsoFileDialogType
An enumeration defining the type of file dialog to open. It has the following values:
Value | Description |
---|---|
msoFileDialogOpen | Open dialog box |
msoFileDialogSaveAs | Save As dialog box |
msoFileDialogFilePicker | File picker dialog box |
msoFileDialogFolderPicker | Folder picker dialog box |
Properties and functions
FileDialog properties
Property | Description |
---|---|
AllowMultiSelect | Allow to select more than one file or folder |
ButtonName | Text displayed on the action button of a file dialog box |
DialogType | Change the MsoFileDialogType (see above) |
Filter | Set a file filter to filter file types user can select |
InitialFileName | The initial path to be opened e.g. C: |
InitialView | The initial file view. Can be one of the following:
|
SelectedItems | Collection of type FileDialogSelectedItems with all selected items |
Title | Title of the Open file dialog window |
Select files – msoFileDialogFilePicker
The msoFileDialogFilePicker dialog type allows you to select one or more files.
Select single files
The most common select file scenario is asking the user to select a single file. The code below does just that:
Dim fDialog As FileDialog, result As Integer Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 'Optional: FileDialog properties fDialog.AllowMultiSelect = False fDialog.title = "Select a file" fDialog.InitialFileName = "C:" 'Optional: Add filters fDialog.Filters.Clear fDialog.Filters.Add "Excel files", "*.xlsx" fDialog.Filters.Add "All files", "*.*" 'Show the dialog. -1 means success! If fDialog.Show = -1 Then Debug.Print fDialog.SelectedItems(1) End If 'Result: C:somefile.xlsx
Select multiple files
Quite common is a scenario when you are asking the user to select one or more files. The code below does just that. Notice that you need to set AllowMultiSelect to True.
Dim fDialog As FileDialog, result As Integer Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 'IMPORTANT! fDialog.AllowMultiSelect = True 'Optional FileDialog properties fDialog.title = "Select a file" fDialog.InitialFileName = "C:" 'Optional: Add filters fDialog.Filters.Clear fDialog.Filters.Add "Excel files", "*.xlsx" fDialog.Filters.Add "All files", "*.*" 'Show the dialog. -1 means success! If fDialog.Show = -1 Then For Each it In fDialog.SelectedItems Debug.Print it Next it End If 'Results: 'C:somefile.xlsx 'C:somefile1.xlsx 'C:somefile2.xlsx
Select folder – msoFileDialogFilePicker
Selecting a folder is more simple than selecting files. However only a single folder can be select within a single dialog window.
Select folder example
The dialog below will ask the user to select a folder:
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker) 'Important we use msoFileDialogFolderPicker instead of (...)FilePicker 'Optional: Properties fDialog.title = "Select a folder" fDialog.InitialFileName = "C:" If fDialog.Show = -1 Then Debug.Print fDialog.SelectedItems(1) End If
The msoFileDialogFolderPicker dialog allows you to only select a SINGLE folder and obviously does not support file folders
Open file – msoFileDialogOpen
Opening files is much more simple as it usually involves a single file. The only difference between the behavior between Selecting and Opening files are button labels.
Open file example
The dialog below will ask the user to select a file to open:
Dim fDialog As FileDialog, result As Integer, it As Variant Set fDialog = Application.FileDialog(msoFileDialogOpen) 'Optional: FileDialog properties fDialog.title = "Select a file" fDialog.InitialFileName = "C:" 'Optional: Add filters fDialog.Filters.Clear fDialog.Filters.Add "All files", "*.*" fDialog.Filters.Add "Excel files", "*.xlsx" If fDialog.Show = -1 Then Debug.Print fDialog.SelectedItems(1) End If
Save file – msoFileDialogSaveAs
Saving a file is similarly easy, and also only the buttons are differently named.
The save file dialog will in fact not save any files! It will just allow the user to select a filename for the file. You need to open the files for reading / writing yourself. Check out my post on how to write files in VBA
Save file example
The dialog below will ask the user to select a path to which a files is to be saved:
Dim fDialog As FileDialog, result As Integer, it As Variant Set fDialog = Application.FileDialog(msoFileDialogSaveAs) 'Optional: FileDialog properties fDialog.title = "Save a file" fDialog.InitialFileName = "C:" If fDialog.Show = -1 Then Debug.Print fDialog.SelectedItems(1) End If
The msoFileDialogSaveAs dialog does NOT support file filters
FileDialog Filters
One of the common problems with working with the Application.FileDialog is setting multiple file filters. Below some common examples of how to do this properly. To add a filter for multiple files use the semicolor ;:
Dim fDialog As FileDialog Set fDialog = Application.FileDialog(msoFileDialogOpen) '... 'Optional: Add filters fDialog.Filters.Clear fDialog.Filters.Add "All files", "*.*" fDialog.Filters.Add "Excel files", "*.xlsx;*.xls;*.xlsm" fDialog.Filters.Add "Text/CSV files", "*.txt;*.csv" '...
Be sure to clear your list of filters each time. The FileDialog has its nuisances and often filters are not cleared automatically. Hence, when creating multiple dialogs you might see filters coming from previous executed dialogs if not cleared and re-initiated properly.
The open file dialog will in fact not open any files! It will just allow the user to select files to open. You need to open the files for reading / writing yourself. Check out my posts:
- Read file in VBA
- Write file in VBA
A file dialog is a window that allows a user to manually select a directory or files. The FileDialog class defined in the Office Object Library can be used by certain Office applications to create a file dialog window. In applications where the FileDialog class is not available, Windows API functions can be used to create a file dialog.
FileDialog Class
The FileDialog class can be used to create a file dialog window to select elements of the file system and return a path string. The FileDialog class can be accessed as a property of the Application object in Excel, Word, Access, PowerPoint, and Publisher. The FileDialog class is not available in Outlook, Project, or Visio. The FileDialog class has flexible properties that can be set to configure the file dialog for specific situations. The FileDialog property takes a required argument from the MsoFileDialogType enum to create a specific type of file dialog. The various properties of the FileDialog object can be set to tailor the dialog to a specific use and then the Show method can be called to launch the window:
Member | Description |
---|---|
Execute | Executes a user’s action after the Show method is called when an Open or SaveAs dialog box is used. |
Show | Shows the file dialog window and returns -1 if the action button is clicked and 0 if cancel is clicked. |
AllowMultiSelect | When set to True, multiple files can be selected. Does not work for the folder picker dialog or the save as dialog. |
Application | Returns the Application object for the application containing the FileDialog object. |
ButtonName | Sets the text on the action button. |
Creator | Returns a 32-bit integer representing the application containing the FileDialog object. |
DialogType | Returns the MsoFileDialogType representing the type of dialog. |
FilterIndex | Sets the starting filter from the Filters collection for when the dialog window opens. |
Filters | A FileDialogFilters collection object containing FileDialogFilter objects representing file type filters for the FileDialog object. |
InitialFileName | Sets the initial path when the dialog window opens. |
InitialView | A MsoFileDialogView representing the initial view type when the dialog window opens. |
Item | Returns the text associated with the object. |
Parent | Returns the parent object of the FileDialog object. |
SelectedItems | A FileDialogSelectedItems collection object containing the selected file paths as strings. |
Title | Sets the title text of the dialog window. |
Select a Single File
Return the value at the first index of the SelectedItems collection.
Public Sub SelectSingleFile()
Dim FD As Office.FileDialog
Set FD = Application.FileDialog(msoFileDialogFilePicker)
With FD
.AllowMultiSelect = False
.ButtonName = "Select File"
.Filters.Clear
.Filters.Add "All Files", "*.*"
.Filters.Add "Excel Files", "*.xl*"
.FilterIndex = 1
.InitialFileName = Environ$("USERPROFILE") & "Desktop"
.InitialView = msoFileDialogViewDetails
.Title = "Select a single file"
If .Show = -1 Then
Debug.Print .SelectedItems(1)
Else
Debug.Print "No file selected."
End If
End With
End Sub
Select Multiple Files
Hold the Ctrl key to select multiple files.
Public Sub SelectMultipleFiles()
Dim FD As Office.FileDialog
Set FD = Application.FileDialog(msoFileDialogFilePicker)
With FD
.AllowMultiSelect = True
.ButtonName = "Select File(s)"
.Filters.Clear
.Filters.Add "All Files", "*.*"
.Filters.Add "Excel Files", "*.xl*"
.FilterIndex = 1
.InitialFileName = Environ$("USERPROFILE") & "Desktop"
.InitialView = msoFileDialogViewDetails
.Title = "Select files(s)"
If .Show = -1 Then
Dim i As Long
For i = 1 To .SelectedItems.Count
Debug.Print .SelectedItems(i)
Next i
Else
Debug.Print "No files selected."
End If
End With
End Sub
Select a Folder
Properties that only pertain to selecting files do not apply to the folder picker dialog.
Public Sub SelectFolder()
Dim FD As Office.FileDialog
Set FD = Application.FileDialog(msoFileDialogFolderPicker)
With FD
.ButtonName = "Select Folder"
.InitialFileName = Environ$("USERPROFILE") & "Desktop"
.InitialView = msoFileDialogViewDetails
.Title = "Select a Folder"
If .Show = -1 Then
Debug.Print .SelectedItems(1)
Else
Debug.Print "No folder selected."
End If
End With
End Sub
Open/SaveAs
Call the Execute method after using the Show method to execute the action of the dialog.
Public Sub OpenExcelFiles()
Dim FD As Office.FileDialog
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
.AllowMultiSelect = True
.ButtonName = "Select Excel File"
.Filters.Clear
.Filters.Add "Excel Files", "*.xl*"
.FilterIndex = 1
.InitialFileName = Environ$("USERPROFILE") & "Desktop"
.InitialView = msoFileDialogViewDetails
.Title = "Select Excel files to open"
If .Show = -1 Then
.Execute
Else
Debug.Print "No file selected."
End If
End With
End Sub
Windows API
The OpenFileNameA function or the GetSaveFileNameA function can be used to open a file dialog window and select a file path. Both functions take the OpenFileName struct as a parameter. If the user selects a file path and click OK the functions will return a nonzero value. If the user cancels or an error occurs the functions will return zero. To get detailed error information when the functions do not work as expected use the CommDlgExtendedError function. Setting the values of the OpenFileName struct members and returning errors from these functions requires detailed implementation so it is best to use wrapper functions to call these functions and hide implementation details from the user.
Option Explicit
Public Sub Example()
On Error GoTo HandleError
Dim FileName As String
FileName = GetOpenFileNameWinAPI()
Debug.Print FileName
Exit Sub
HandleError:
If Err.Number - (vbObjectError + 512) = 2 Then
Debug.Print "No file selected."
Else
Err.Raise _
Number:=Err.Number, _
Description:=Err.Description
End If
End Sub
Option Explicit
#If VBA7 = 1 Then
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As LongPtr
hInstance As LongPtr
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
'#if (_WIN32_WINNT >= 0x0500)
pvReserved As LongPtr
dwReserved As Long
FlagsEx As Long
'#endif // (_WIN32_WINNT >= 0x0500)
End Type
Private Declare PtrSafe Function GetOpenFileName _
Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" ( _
pOpenfilename As OPENFILENAME) As Long
Private Declare PtrSafe Function CommDlgExtendedError _
Lib "comdlg32.dll" () As Long
#Else
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
'#if (_WIN32_WINNT >= 0x0500)
pvReserved As Long
dwReserved As Long
FlagsEx As Long
'#endif // (_WIN32_WINNT >= 0x0500)
End Type
Private Declare Function GetOpenFileName _
Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" ( _
pOpenfilename As OPENFILENAME) As Long
Private Declare Function CommDlgExtendedError _
Lib "comdlg32.dll" () As Long
#End If
Private Const OFN_READONLY = &H1
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_NOCHANGEDIR = &H8
Private Const OFN_SHOWHELP = &H10
Private Const OFN_ENABLEHOOK = &H20
Private Const OFN_ENABLETEMPLATE = &H40
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
Private Const OFN_NOVALIDATE = &H100
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXTENSIONDIFFERENT = &H400
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_CREATEPROMPT = &H2000
Private Const OFN_SHAREAWARE = &H4000
Private Const OFN_NOREADONLYRETURN = &H8000&
Private Const OFN_NOTESTFILECREATE = &H10000
Private Const OFN_NONETWORKBUTTON = &H20000
Private Const OFN_NOLONGNAMES = &H40000 ' force no long names for 4.x modules
Private Const OFN_EXPLORER = &H80000 ' new look commdlg
Private Const OFN_NODEREFERENCELINKS = &H100000
Private Const OFN_LONGNAMES = &H200000 ' force long names for 3.x modules
Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHARENOWARN = 1
Private Const OFN_SHAREWARN = 0
Private Const CDERR_DIALOGFAILURE = &HFFFF&
Private Const CDERR_GENERALCODES = &H0
Private Const CDERR_STRUCTSIZE = &H1
Private Const CDERR_INITIALIZATION = &H2
Private Const CDERR_NOTEMPLATE = &H3
Private Const CDERR_NOHINSTANCE = &H4
Private Const CDERR_LOADSTRFAILURE = &H5
Private Const CDERR_FINDRESFAILURE = &H6
Private Const CDERR_LOADRESFAILURE = &H7
Private Const CDERR_LOCKRESFAILURE = &H8
Private Const CDERR_MEMALLOCFAILURE = &H9
Private Const CDERR_MEMLOCKFAILURE = &HA
Private Const CDERR_NOHOOK = &HB
Private Const CDERR_REGISTERMSGFAIL = &HC
Public Function GetOpenFileNameWinAPI() As String
Const MAX_BUFFER As Long = 255
Dim OFN As OPENFILENAME
With OFN
'.hwndOwner
'.hInstance
.lpstrFilter = "All Files" & vbNullChar & "*.*" & String$(2, vbNullChar)
'.lpstrCustomFilter
'.nMaxCustFilter
.nFilterIndex = 1
.lpstrFile = String$(MAX_BUFFER - 1, " ") & vbNullChar
.nMaxFile = Len(.lpstrFile)
.lpstrFileTitle = String$(MAX_BUFFER - 1, " ") & vbNullChar
.nMaxFileTitle = Len(.lpstrFileTitle)
.lpstrInitialDir = "C:" & vbNullChar
'.lpstrTitle
.flags = OFN_FILEMUSTEXIST Or OFN_PATHMUSTEXIST
'.nFileOffset
'.nFileExtension
'.lpstrDefExt
'.lCustData
'.lpfnHook
'.lpTemplateName
'.pvReserved
'.dwReserved
'.FlagsEx
.lStructSize = LenB(OFN)
End With
Dim Result As Long
Result = GetOpenFileName(OFN)
If Result <> 0 Then
GetOpenFileNameWinAPI = Trim$(Replace(OFN.lpstrFile, vbNullChar, " "))
Else
Dim CDErr As Long
CDErr = CommDlgExtendedError()
Dim UDErr As Long
Dim ErrMsg As String
Select Case CDErr
Case CDERR_DIALOGFAILURE
UDErr = 1
ErrMsg = "DIALOG FAILURE"
Case CDERR_GENERALCODES
UDErr = 2
ErrMsg = "GENERAL CODES"
Case CDERR_STRUCTSIZE
UDErr = 3
ErrMsg = "STRUCT SIZE"
Case CDERR_INITIALIZATION
UDErr = 4
ErrMsg = "INITIALIZATION"
Case CDERR_NOTEMPLATE
UDErr = 5
ErrMsg = "NO TEMPLATE"
Case CDERR_NOHINSTANCE
UDErr = 6
ErrMsg = "NO HINSTANCE"
Case CDERR_LOADSTRFAILURE
UDErr = 7
ErrMsg = "LOAD STR FAILURE"
Case CDERR_FINDRESFAILURE
UDErr = 8
ErrMsg = "FIND RES FAILURE"
Case CDERR_LOADRESFAILURE
UDErr = 9
ErrMsg = "LOAD RES FAILURE"
Case CDERR_LOCKRESFAILURE
UDErr = 10
ErrMsg = "LOCK RES FAILURE"
Case CDERR_MEMALLOCFAILURE
UDErr = 11
ErrMsg = "MEM ALLOC FAILURE"
Case CDERR_MEMLOCKFAILURE
UDErr = 12
ErrMsg = "MEM LOCK FAILURE"
Case CDERR_NOHOOK
UDErr = 13
ErrMsg = "NO HOOK"
Case CDERR_REGISTERMSGFAIL
UDErr = 14
ErrMsg = "REGISTER MSG FAIL"
Case Else
UDErr = 15
ErrMsg = "Unknown Error"
End Select
Err.Raise _
Number:=vbObjectError + 512 + UDErr, _
Description:=ErrMsg
End If
End Function
Содержание
- 1 Displays a dialog box that allows the user to select a directory. The selected directory name (or «Canceled») is then displayed by using the MsgBox function.
- 2 FileDialogFilters
- 3 FileDialog with JPG file filter
- 4 Get selected paths
- 5 Open File Open Dialog and get the selection (Dialog Types Used with the FileDialog Object)
- 6 Set the AllowMultiSelect property of the dialog box to allow multiple selections in the dialog box
- 7 The FileDialog Object
- 8 User selects path to save HTML files
- 9 Use the SelectedItems property of the FileDialog object to return the FileDialogSelectedItems collection.
- 10 You can use the Add method of the FileDialogFilters collection object to create your own list of filter
Displays a dialog box that allows the user to select a directory. The selected directory name (or «Canceled») is then displayed by using the MsgBox function.
<source lang="vb"> Sub GetAFolder() With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = Application.DefaultFilePath & "" .Title = "Please select a location for the backup" .Show If .SelectedItems.Count = 0 Then MsgBox "Canceled" Else MsgBox .SelectedItems(1) End If End With End Sub </source>
FileDialogFilters
<source lang="vb"> Private Sub cmdGetFile_Click() Dim fd As FileDialog Dim ffs As FileDialogFilters Dim vItem On Error GoTo Problem Set fd = Application.FileDialog(msoFileDialogOpen) With fd Set ffs = .Filters With ffs .clear .add "Pictures", "*.jpg" End With .AllowMultiSelect = True If .show = False Then Exit Sub For Each vItem In .SelectedItems Debug.Print vItem Next vItem End With Exit Sub
Problem:
MsgBox "That was not a valid picture" End Sub </source>
FileDialog with JPG file filter
<source lang="vb"> Private Sub cmdGetFile_Click() Dim fd As FileDialog Dim ffs As FileDialogFilters On Error GoTo Problem Set fd = Application.FileDialog(msoFileDialogOpen) With fd Set ffs = .Filters With ffs .clear .add "Pictures", "*.jpg" End With .AllowMultiSelect = False If .show = False Then Exit Sub Image1.Picture = LoadPicture(.SelectedItems(1)) End With Exit Sub
Problem:
MsgBox "That was not a valid picture" End Sub </source>
Get selected paths
<source lang="vb">
Public Sub ShowFileDialog()
Dim fd As FileDialog Dim selectedPaths() As String Dim I As Integer Set fd = Application.FileDialog(msoFileDialogOpen) With fd "Configure dialog box .AllowMultiSelect = True .FilterIndex = 2 .Title = "Select Excel File(s)" .InitialFileName = "" "Show the dialog and collect file paths selected by the user If .Show = -1 Then "User clicked Open ReDim selectedPaths(.SelectedItems.Count - 1) "Store file paths for later use. For I = 0 To .SelectedItems.Count - 1 selectedPaths(I) = .SelectedItems(I + 1) Next I End If .Execute "Open selected files End With Set fd = Nothing
End Sub
</source>
Open File Open Dialog and get the selection (Dialog Types Used with the FileDialog Object)
<source lang="vb">
Dialog Type VBA Constant (FileDialogType)
Open msoFileDialogOpen
Save msoFileDialogSaveAs
File Picker msoFileDialogFilePicker
Folder Picker msoFileDialogFolderPicker
Sub openDlg()
Dim fc As FileDialogFilters Dim ff As FileDialogFilter Set fc = Application.FileDialog(msoFileDialogOpen).Filters Set ff = fc.Item(1) MsgBox ff.Description & ff.Extensions "Displays "AllFiles" and *.*
End Sub
</source>
Set the AllowMultiSelect property of the dialog box to allow multiple selections in the dialog box
<source lang="vb">
Sub OpenDialog()
Dim dlgOpen As FileDialog Set dlgOpen = Application.FileDialog( _ DialogType:=msoFileDialogOpen) With dlgOpen .AllowMultiSelect = True .Show End With msgBox dlgOpen.SelectedItems(1)
End Sub
</source>
The FileDialog Object
<source lang="vb">
Sub SaveDialog()
Dim dlgSaveAs As FileDialog Set dlgSaveAs = Application.FileDialog(DialogType:=msoFileDialogSaveAs) dlgSaveAs.Show msgBox dlgSaveAs.SelectedItems(1)
End Sub
</source>
User selects path to save HTML files
<source lang="vb">
Private Sub cmdChangePath_Click()
Dim fd As FileDialog Dim I As Integer Set fd = Application.FileDialog(msoFileDialogFolderPicker) With fd .AllowMultiSelect = False "Allow only one selection .Title = "Select Folder" .InitialFileName = "" If .Show = -1 Then MsgBox .SelectedItems(1) End If End With Set fd = Nothing
End Sub
</source>
Use the SelectedItems property of the FileDialog object to return the FileDialogSelectedItems collection.
<source lang="vb">
Sub selected()
Dim si As FileDialogSelectedItems Set si = Application.FileDialog(msoFileDialogOpen).SelectedItems
End Sub
</source>
You can use the Add method of the FileDialogFilters collection object to create your own list of filter
<source lang="vb">
Sub fileDlg()
Dim fd As FileDialog Dim imagePath As String Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .AllowMultiSelect = False .Filters.Clear .Filters.Add "All files", "*.*" .Filters.Add "Image", "*.jpg", 1 .FilterIndex = 1 .InitialFileName = "" .Title = "Select JPEG file" If .Show = -1 Then "User pressed action button imagePath = .SelectedItems(1) End If End With
End Sub
</source>
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип/расширение выбираемого файла)
Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает также, только служит для вывода диалогового окна выбора папки.
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Sub ПримерИспользования_GetFolderPath()
ПутьКПапке = GetFolderPath("Заголовок окна", ThisWorkbook.Path) ' запрашиваем имя папки
If ПутьКПапке = "" Then Exit Sub ' выход, если пользователь отказался от выбора папки
MsgBox "Выбрана папка: " & ПутьКПапке, vbInformation
End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
Optional ByVal InitialPath As String = "c:", _
Optional ByVal FilterDescription As String = "Книги Excel", _
Optional ByVal FilterExtention As String = "*.xls*") As String
' функция выводит диалоговое окно выбора файла с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
' для фильтра можно указать описание и расширение выбираемых файлов
On Error Resume Next
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
.Filters.Clear: .Filters.Add FilterDescription, FilterExtention
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
End With
End Function
Sub ПримерИспользования_GetFilePath()
ИмяФайла = GetFilePath("Выберите файл Word", , "Документы Word", "*.doc") ' запрашиваем имя файла
If ИмяФайла = "" Then Exit Sub ' выход, если пользователь отказался от выбора файла
MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
Ниже представлены функции для вызова диалоговых окон выбора файлов и папок средствами VBA.
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и типрасширение выбираемого файла)
Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.
Function GetFileName(Optional ByVal Title As String = "Выберите файл для обработки", _
Optional ByVal InitialPath, _
Optional ByVal MyFilter As String = "Книги Excel (*.xls*),") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
If Not IsMissing(InitialPath) Then
On Error Resume Next: ChDrive Left(InitialPath, 1)
ChDir InitialPath ' выбираем стартовую папку
End If
res = Application.GetOpenFilename(MyFilter, , Title, "Открыть") ' вывод диалогового окна
GetFileName = IIf(VarType(res) = vbBoolean, "", res) ' пустая строка при отказе от выбора
End Function
Sub ПримерИспользования_GetFileName()
ИмяФайла = GetFileName("Заголовок окна", ThisWorkbook.Path) ' запрашиваем имя файла
' ===================== другие варианты вызова функции =====================
' текстовые файлы, стартовая папка не указана
' ИмяФайла = GetFileName("Выберите текстовый файл", , "Текстовые файлы (*.txt),")
' файлы любого типа из папки "C:Windows"
' ИмяФайла = GetFileName(, "C:Windows", "")
' ==========================================================================
If ИмяФайла = "" Then Exit Sub ' выход, если пользователь отказался от выбора файла
MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Sub ПримерИспользования_GetFolderPath()
ПутьКПапке = GetFolderPath("Заголовок окна", ThisWorkbook.Path) ' запрашиваем имя папки
' ===================== другие варианты вызова функции =====================
' стартовая папка не указана, заголовок окна по умолчанию
' ПутьКПапке = GetFolderPath
' обзор папок начинается с папки "Рабочий стол"
' СтартоваяПапка = CreateObject("WScript.Shell").SpecialFolders("Desktop")
' ПутьКПапке = GetFolderPath("Выберите папку на рабочем столе", СтартоваяПапка)
' ==========================================================================
If ПутьКПапке = "" Then Exit Sub ' выход, если пользователь отказался от выбора папки
MsgBox "Выбрана папка: " & ПутьКПапке, vbInformation
End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
Optional ByVal InitialPath As String = "c:", _
Optional ByVal FilterDescription As String = "Книги Excel", _
Optional ByVal FilterExtention As String = "*.xls*") As String
' функция выводит диалоговое окно выбора файла с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
' для фильтра можно указать описание и расширение выбираемых файлов
On Error Resume Next
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
.Filters.Clear: .Filters.Add FilterDescription, FilterExtention
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
End With
End Function
Sub ПримерИспользования_GetFilePath()
ИмяФайла = GetFilePath("Выберите файл Word", , "Документы Word", "*.doc") ' запрашиваем имя файла
' ===================== другие варианты вызова функции =====================
' текстовые файлы, стартовая папка не указана
' ИмяФайла = GetFilePath("Выберите текстовый файл", , "Текстовые файлы", "*.txt")
' файлы любого типа из папки "C:Windows"
' ИмяФайла = GetFilePath(, "C:Windows", , "*")
' ==========================================================================
If ИмяФайла = "" Then Exit Sub ' выход, если пользователь отказался от выбора файла
MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
Function GetFilenamesCollection(Optional ByVal Title As String = "Выберите файлы для обработки", _
Optional ByVal InitialPath As String = "c:") As FileDialogSelectedItems
' функция выводит диалоговое окно выбора нескольких файлов с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает массив путей к выбранным файлам, или пустую строку в случае отказа от выбора
With Application.FileDialog(3) ' msoFileDialogFilePicker
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
Set GetFilenamesCollection = .SelectedItems
End With
End Function
Sub ПримерИспользования_GetFilenamesCollection()
Dim СписокФайлов As FileDialogSelectedItems
Set СписокФайлов = GetFilenamesCollection("Заголовок окна", ThisWorkbook.Path) ' выводим окно выбора
' ===================== другие варианты вызова функции =====================
' стартовая папка не указана, заголовок окна по умолчанию
Set СписокФайлов = GetFilenamesCollection
' обзор файлов начинается с папки "Рабочий стол"
СтартоваяПапка = CreateObject("WScript.Shell").SpecialFolders("Desktop")
Set СписокФайлов = GetFilenamesCollection("Выберите файлы на рабочем столе", СтартоваяПапка)
' ==========================================================================
If СписокФайлов Is Nothing Then Exit Sub ' выход, если пользователь отказался от выбора файлов
For Each File In СписокФайлов
Debug.Print File
Next
End Sub
Ещё один вариант кода (который я использую) для выбора файла
Его отличие — функция запоминает папку, из которой последний раз выбирался файл,
и при повторном запуске диалогового окна выбора файла,
обзор папок будет начат с той папки, откуда последний раз был взят файл.
Sub AttachFile_test() ' пример использования
Filename$ = GetFilePath()
If Filename$ = "" Then Exit Sub
MsgBox "Выбран файл: " & Filename$
End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
Optional ByVal InitialPath As String = "c:", _
Optional ByVal FilterDescription As String = "Файлы счетов", _
Optional ByVal FilterExtention As String = "*.*") As String
On Error Resume Next
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = "Выбрать": .Title = Title:
.InitialFileName = GetSetting(Application.Name, "GetFilePath", "folder", InitialPath)
.Filters.Clear: .Filters.Add FilterDescription, FilterExtention
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1)
folder$ = Left(.SelectedItems(1), InStrRev(.SelectedItems(1), ""))
SaveSetting Application.Name, "GetFilePath", "folder", folder$
End With
End Function
- 138056 просмотров