mail mail

Вывод диалоговых окон выбора файла и папки средствами VBA (выбрать файл или папку)

Ниже представлены функции для вызова диалоговых окон выбора файлов и папок средствами 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

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

У меня, к счастью (именно, к счастью), тоже нет мака.

Написал небольшую примитивную базку (сам не программист, просто немного умею и быстро учусь при необходимости).

Попросили оптимизировать под мак, т.к. у одного из пользователей яблочный друг. На Windows всё прекрасно работает, а вот на маке форма открывается, на лист данные заносятся без проблем, но эта кнопка не работает, диалоговое окно не открывает, наверняка, и папки не создаёт.

Может из-за того, что там стартовая папка указана "C:\"?

По самому коду есть нарекания, явные ошибки?

Существуют ли альтернативные команды создания директорий и вывода диалоговых окон?

Спасибо!

Здравствуйте, Виктор.
К сожалению, помочь в этом вопросе не смогу, - ибо не являюсь счастливым обладателем Mac-а, и, соответственно, протестировать код на Макинтоше нет никакой возможности.

Доброго времени!

Интересует вопрос, как этот код оптимизировать под Office for mac?

Кнопка открывает диалоговое окно, в нём выбирается нужный файл, при нажатии "открыть", по предустановленному шаблону создаётся папка, в неё копируется выбранный файл, диалоговое окно закрывается. Этот код работает на Windows.

Private Sub Photoprot_bef_oper_but_Click()

File_Path = GetFilePath

St = ActiveWorkbook.Path

SrcFile = File_Path
DestFile = St & "\" & "MRI_CT_Rtg" & "\" & Name_.Text & "_" & Date_hospit.Text & "\" & "6. Фото-видеопротокол" & "_" & Photoprot_bef_oper.Text & "\"

On Error Resume Next

MkDir (St & "\" & "MRI_CT_Rtg" & "\")
MkDir (St & "\" & "MRI_CT_Rtg" & "\" & Name_.Text & "_" & Date_hospit.Text & "\")
MkDir (St & "\" & "MRI_CT_Rtg" & "\" & Name_.Text & "_" & Date_hospit.Text & "\" & "6. Фото-видеопротокол" & "_" & Photoprot_bef_oper.Text)

Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFile SrcFile, DestFile

End Sub

Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _
Optional ByVal InitialPath As String = "C:\") As String

On Error Resume Next

With Application.FileDialog(msoFileDialogOpen)

.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1): PS = Application.PathSeparator

End With

End Function

Необходимо, что бы работало как на винде, так и на мак.

Спасибо!

Сам на свой вопрос ответил )

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim NameRateFile As String
    Dim AskMsg, StyleAskMsg, TitleAskMsg, HelpAskMsg, CtxtAskMsg, ResponseAskMsg, MyStringAskMsg
    Dim AskMsg1, StyleAskMsg1, TitleAskMsg1, HelpAskMsg1, CtxtAskMsg1, ResponseAskMsg1, MyStringAskMsg1

    Dim NewFileName As String
    Dim fso As FileSystemObject
    Dim f1, f2 As File
     If Target.Cells.Count > 1 Then Exit Sub
     If Not Application.Intersect(Range("C9:C10"), Target) Is Nothing Then
         UserForm1.Show
     End If
     If Not Application.Intersect(Range("C17:C17"), Target) Is Nothing Then
        'MsgBox "Âûäåëåíà ÿ÷åéêà: "
        NameRateFile = GetFileName("Çàãîëîâîê îêíà", ThisWorkbook.Path)   ' çàïðàøèâàåì èìÿ ôàéëà
       If NameRateFile = "" Then
            NewFileName = ActiveSheet.Name
            Range("C17:C18") = ""
            AskMsg = "Ñîçäàòü ôàéë " + NewFileName + " â òåêóùåé äèðåêòîðèè ?"    ' Define message.
           StyleAskMsg = vbYesNo + vbQuestion + vbDefaultButton2    ' Define buttons
           TitleAskMsg = "Ôàéë íå íàéäå"    ' Define title.
           HelpAskMsg = "DEMO.HLP"    ' Define Help file.
           CtxtAskMsg = 1000    ' Define topic
           ResponseAskMsg = MsgBox(AskMsg, StyleAskMsg, TitleAskMsg, HelpAskMsg, CtxtAskMsg)
           
            AskMsg1 = "Ïåðåçàïèñàòü ñóùåñòâóþùèé ôàéë " + NewFileName + " â òåêóùåé äèðåêòîðèè ?"    ' Define message.
           StyleAskMsg1 = vbYesNo + vbCritical + vbDefaultButton2    ' Define buttons
           TitleAskMsg1 = "ÏÅÐÅÇÀÏÈÑÜ ÔÀÉËÀ"    ' Define title.
           HelpAskMsg1 = "DEMO.HLP"    ' Define Help file.
           CtxtAskMsg1 = 1000    ' Define topic
           
            If ResponseAskMsg = vbYes Then    ' User chose Yes.
               Set fso = CreateObject("Scripting.FileSystemObject")
                On Error Resume Next: ResponseAskMsg1 = MsgBox(AskMsg1, StyleAskMsg1, TitleAskMsg1, HelpAskMsg1, CtxtAskMsg1)
                If ResponseAskMsg1 = vbYes Then
                    Set f2 = fso.CreateTextFile(NewFileName + ".txt", True)
                End If
                If ResponseAskMsg1 = vbNo Then
                    MsgBox "Ôàéë íå âûáðàí è íå ñîçäàí !"
                    Exit Sub
                End If

                Set f1 = fso.CreateTextFile(NewFileName + ".txt", False)
                f1.Close
                NameRateFile = ThisWorkbook.Path + "\" + NewFileName + ".txt"
            Else    ' User chose No.
               MsgBox "Ôàéë íå âûáðàí è íå ñîçäàí !"
                Exit Sub
            End If
        End If ' âûõîä, åñëè ïîëüçîâàòåëü îòêàçàëñÿ îò âûáîðà ôàéëà
   MsgBox "Âûáðàí ôàéë: " & NameRateFile, vbInformation
    Range("C17:C17") = NameRateFile
    End If
End Sub

А можно ли сделать так, что если пользователь ввёл в поле "имя файла" что-то сам, а такого файла нет в данной папке, то он создавался автоматически??? Спасибо.

Добрый день!

Все чудесно работает для Excel 2007 и 2003. А как сделать выбор файла (именно файла, а не папки) для Excel 97? Если использовать BrowseForFolder, то какой должен быть синтаксис? У Павла Климова я этого не нашел.

Спасибо!

Спасибо.
Программа с вызовом BrowseForFolder уже есть )) Она дает создавать новую папку.
Но хотелось бы еще иметь возможность
- поиска папки по имени
- задания стартовой папки
подскажите, пожалуйста, можно ли это сделать в 2000

что посоветуете для Excel 2000 ?

Павел Климов на своём сайте msoffice.nm.ru уже дал совет - остаётся лишь процитировать:

Объект FileDialog впервые появился в Microsoft Excel XP
Для выбора папки в более ранних версиях Excel (97, 2000) используйте следующий код:

Sub test()
    Set wshell = CreateObject("Shell.Application")
    On Error Resume Next 'игнорируем ошибку, если нажата Cancel
   Set iPath = wshell.BrowseForFolder(&H0, " Выберите папку....", &H1, 17)
   
    If Not iPath Is Nothing Then
        'FolderPath = iPath.Self.Path 'вариант для WINNT
       FolderPath = iPath.Items.Item.Path    'универсальный вариант для WIN9х/NT
   Else
       Exit Sub 'нажата Cancel
   End If
   
    MsgBox "Выбрана папка: " & FolderPath, vbInformation
End Sub

Добрый день!
В Excel 2000 на оператор

With Application.FileDialog(msoFileDialogFolderPicker)

выдается ошибка 438.
нужно диалоговое окно выбора папки с возможностью
- поиска по имени
- создания новой папки
- задания стартовой папки
что посоветуете для Excel 2000 ?

с диалогами работал, но здесь более элегантно реализовано

функция GetFileName отлично работает. Спасибо.
вместо MsgBox вставил у себя Application.Workbooks.Open ИмяФайла и порядок.
----------
Excel 2007

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
3 + 1 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.