Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Стандартный диалог выбора файлов Application.GetOpenFilename

    Выбор файлов в VBA Excel. Стандартный диалог Application.GetOpenFilename. Стартовая папка диалога выбора файлов.

    Открытие диалога выбора файлов

    Открытие диалога для выбора любого файла и записи его полного имени в ячейку «A1»:

    В процессе выполнения этого кода VBA Excel открывается диалог с заголовком по умолчанию «Открытие файла» и возможностью выбора любого файла. При нажатии на кнопку «Открытие» полное имя выбранного файла запишется в ячейку «A1». При нажатии на кнопку «Отмена» или кнопку закрытия формы в ячейку «A1» запишется строка «Ложь».

    Открытие диалога с заголовком «Выбор файла»:

    Открытие диалога выбора файлов с указанием одного фильтра:

    Фильтр в этом коде VBA Excel представляет из себя пару: наименование фильтра и строка из знака подстановки «*» с расширением отбираемых файлов, разделенных «,». В данном случае в открытом диалоге будут видны файлы с расширением «.xls». Таких пар может быть несколько, как в следующем примере.

    Открытие диалога выбора файлов с указанием трех фильтров файлов:

    Выбрать один из фильтров можно из раскрывающегося списка диалога выбора файлов «Тип файлов».

    Для справки:

    Application.GetOpenFilename («Фильтры», номер, «Заголовок диалога»)

    Аргумент номер — это номер по порядку фильтра в списке, отображаемого по умолчанию. Если номер отсутствует или превышает количество фильтров, то по умолчанию отображается первый в списке.

    Стартовая папка диалога выбора файлов

    При открытии стандартного диалога выбора файлов «Application.GetOpenFilename» по умолчанию, как стартовая, выбирается папка «Мои документы» в Windows XP, «Документы» в Windows 8, но, при желании, можно задать, как стартовую, и любую другую папку.

    Для этого можно воспользоваться операторами ChDrive (смена текущего диска) и ChDir (смена текущего каталога). По умолчанию текущим является диск «С» в Windows XP, поэтому, если ваша папка находится на этом диске, то ChDrive можно пропустить.

    Пример 1
    Проверяем, какая папка является стартовой по умолчанию. При вызове процедуры из первого примера диалог откроется именно на этой папке. Если выбрать файл, в ячейку «A1» запишется полный путь к нему, а при отмене выбора, запишется «Ложь».

    Пример 2
    В этом примере кода VBA стартовой назначается папка D:\Новая папка. Если пропустить оператор ChDrive "D", то по умолчанию стартовой все-равно останется папка «Мои документы».

    Пример 3
    Здесь стартовой назначается папка, в которой расположен исходный файл Excel с кодом.

    Имя диска может быть любым, в зависимости от имеющегося на вашем компьютере.

    Смотрите, как с помощью VBA Excel можно открыть папку в проводнике Windows для просмотра.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    33 комментария для “VBA Excel. Стандартный диалог выбора файлов Application.GetOpenFilename”

    1. есть книга с макросами
      Макрос_1
      Макрос_2
      Макрос_n
      в каждом из этих макросов есть одинаковый код (напр Range(«D2:F8»). Clear )

      Естественно здесь просится еще один Clear_макрос

      и теперь пусть каждый Макрос_n запускает Clear_макрос (Run Clear_макрос )
      Какой код надо прописать чтобы машина прервала выполнение Макрос_n, перешла к Clear_макрос, и по окончанию опять вернулась и продолжила работу на Макрос_n ?
      т.е. что-то типа Go-Return но на уровне макросов

    2. Подскажите, возможно ли, чтобы в диалоговом окне отображался только конкретный (один) файл ?

      1. Евгений

        С помощью фильтра это сделать невозможно, но вы можете поместить этот файл в отдельную папку, которую сделать стартовой.

    3. Геннадий

      Добрый день! Спасибо за статью. А как в качестве стартовой папки указать сетевой путь типа «\\Папка1\Папка2»? В данном случае ChDir не срабатывает. Через shell и подключение сетевого диска в пошаговом режиме ChDir работает, а в целом нет.

      1. Евгений

        Добрый день, Геннадий!
        В разделе Declarations объявите функцию SetCurrentDirectoryA:

        Далее в программе переопределите путь по умолчанию на сетевой:

        Геннадий, работоспособность кода я не проверил на сетевых папках из-за их отсутствия. С обычными папками работает. Напишите, что получилось.

          1. Евгений

            Добрый день, Юрий!
            Чтобы функция для Windows32 работала в Windows64, необходимо в нее добавить ключевое слово «PtrSafe»:

    4. Геннадий

      Спасибо большое, Евгений! То что нужно. Все работает корректно.

    5. Как проверить на нажатие крестика или отмены?

      1. Евгений

        Привет, Филипп!
        При закрытии диалога выбора файлов нажатием на крестик или кнопку «Отмена» метод Application.GetOpenFilename возвращает значение False. По возвращенному значению можно отследить нажатие кнопок пользователем:

    6. Здравствуйте, есть ли возможность применить Application.GetOpenFilename с заданием фильтра не только по расширению файла, но и по имени (А*.xls), (B*.xls), (C*.xls) по типу поиска файла в Windows. Если таким образом пытаться ничего не выходит — *.* получается…

      Спасибо…

      1. Евгений

        Здравствуйте, Леонид!
        Стандартный диалог Application.GetOpenFilename не предусматривает создание фильтров с шаблонами по именам файлов. Частично решить данный вопрос поможет создание нового экземпляра диалогового окна Application.FileDialog с указанием параметра InitialFileName. Частично, потому что здесь можно применить только один шаблон и только в имени файла (не в пути к нему). Но если дать имена файлам с повторяющейся подстрокой, это вполне сработает.

        Метод Execute открывает выбранный файл.

    7. Николай

      Евгений, здравствуйте!
      Большое спасибо за статью, очень полезный материал.
      Подскажите, пожалуйста. Я использую метод Application.GetSaveAsFilename для сохранения данных из массива в текстовой файл. У меня добавлено несколько параметров «FileFilter»:
      — Text (Space) (*.txt)
      — Text (Tab) (*.txt)
      — Text (Comma) (*.csv) и другие.
      В зависимости от выбранного типа файлов, должен использоваться определённый разделитель (space, tab, comma и др). Вариант по поиску через расширение (LCase$(Right$(Path, 3))) мне не подходит.
      Думаю самый оптимальный вариант это вернуть значение «FilterIndex» выбранного вручную при сохранении, и в зависимости от этого ставить разделитель, но никак не могу получить это значение.

      1. Евгений

        Здравствуйте, Николай!
        Попробуйте так:

    8. Николай

      Евгений, здравствуйте!
      Выдаёт ошибку по первой строке кода (в функции): «The code in this project must be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.»
      И программно вернуть значение индекса выбранного фильтра “FilterIndex” никак нельзя?
      Спасибо)

      1. Евгений

        Добрый день, Николай!
        Попробуйте дополнительно указать ключевое слово PtrSafe и изменить тип указателей на LongPtr:

    9. Здравствуйте. Спасибо за статью!
      Интересует, как после выбора файла записать в ячейку его имя без расширения и пути.
      Сейчас:

      Выводит: D:\TMP\21\Новая папка\Выписка 654.xml
      Нужно: Выписка 654.xml

      1. Евгений

        Добрый день!
        Уточните, нужно как вы написали: Выписка 654.xml, или без расширения: Выписка 654?

        1. Да, простите ,неправильно написал.
          Нужно «Выписка 654»

          1. Евгений

            Вырезаем имя файла между последним обратным слешем и точкой:

            1. Здравствуйте.
              Можете написать полную версию кода?
              И еще. Как сделать, чтобы ссылка на файл появлялась не на листе, а в TextBox с последующей вставкой в определенную ячейку на листе?

              1. Евгений

                Здравствуйте, Павел!

                Нажатием кнопки CommandButton1 записываем полное имя файла в TextBox1:

                Нажатием кнопки CommandButton2 копируем имя файла из TextBox1 в ячейку A1:

    10. Александр

      Евгений, большое спасибо за статью!
      Хотел уточнить, а есть ли возможность сделать настройку так, чтобы не появлялось диалоговое окно, а файлы были выбраны по умолчанию по определенным признакам? В моем случае, в папке находятся ексель-файлы, и их все нужно выбирать, как-то кажется бессмысленным каждый раз запускать диалоговое окно и выбирать все файлы, но как пропустить данный шаг и настроить автоматический выбор всех ексель-файлов в папке я разобраться не могу.
      Буду очень рад, если подскажите какой-нибудь метод. Спасибо!

      1. Евгений

        Здравствуйте, Александр!
        Ознакомьтесь со статьей Список файлов в папке. Если в папке содержатся файлы разных форматов, можно в цикле For Each... Next использовать отбор файлов Excel по расширению. А если требуется эти файлы открыть, то это можно сделать прямо из цикла без предварительной записи их полных имен куда-либо.

    11. Здравствуйте!
      Большое спасибо за статью и комментарии.
      У меня такой вопрос:
      Я сохраняю имя файла из Application.GetOpenFileName в переменную String. Но при каждом обращении к этой переменной открывается диалог открытия файла. Не знаю, как быть?
      Мне нужно перенести значения определенных ячеек (не диапазон) из листа открываемой (через Application.GetOpenFileName) книги в определенные ячейки текущей книги.

      1. Евгений

        Здравствуйте, Махмуд!
        При обращении к переменной диалог не должен открываться. Вы можете убедиться в этом, запустив мой код:

        1. Спасибо Евгений!
          Тут он не открывается. Я согласен!
          Но…
          Я не знаю как ссылаться на конкретную ячейку выбираемого из диалога файла.
          Например,
          Dim sFilename As String
          sFilename = Application.GetOpenFilename
          Workbooks.Open sFilename

          открывает выбираемую книгу. А не нужно, чтобы он открывался. Кстати, Application.UpdateScreen = False тут не поможет.

          А прямое присваивание типа
          Range("A1") = "= [sFilename]Sheet1!$B$2" при обращении к sFilename заново открывает диалог.

          1. Евгений

            Махмуд, чтобы работать со вновь открытой книгой из кода VBA, ссылку на нее необходимо присвоить объектной переменной:

    12. алексей б

      Здравствуйте, Евгений.
      применяя этот макрос:

      Sub закладка()
      Dim lngCount As Long
          With Application.FileDialog(msoFileDialogOpen)
              .AllowMultiSelect = True
              .Show
              For lngCount = 1 To .SelectedItems.Count
                  MsgBox .SelectedItems(lngCount)
              Next lngCount
          End With
      ....
      Workbooks("это.xlsm").Worksheets("вработу").Range("A1").CurrentRegion.Copy
      myDoc.Bookmarks("PPP").Range.PasteExcelTable False, False, False
      myWord.Visible = True
      myWord.Visible = True
      Set myWord = Nothing
      Set myDoc = Nothing
      End Sub
      
      хотел чтобы постоянно не менять в VB путь менять его через диалог выбора файлов. А как открыть файл не знаю.

    Обсуждение закрыто.