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 по тематическим разделам со ссылками на все статьи.

25 комментариев для “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»:

        1. Евгений

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

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

        Спасибо…

        1. Евгений

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

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

      2. Николай

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

        1. Евгений

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

      3. Николай

        Евгений, здравствуйте!
        Выдаёт ошибку по первой строке кода (в функции): «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:

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

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

        1. Евгений

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

            1. Евгений

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

            2. Александр

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

              1. Евгений

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

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.