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»:

      1. Евгений

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

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

      Спасибо…

      1. Евгений

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

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

    5. Николай

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

      1. Евгений

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

    6. Николай

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

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

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

      1. Евгений

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

          1. Евгений

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

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

              1. Евгений

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

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

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

    8. Александр

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

      1. Евгений

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

    9. Здравствуйте!
      Большое спасибо за статью и комментарии.
      У меня такой вопрос:
      Я сохраняю имя файла из 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, ссылку на нее необходимо присвоить объектной переменной:

    10. алексей б

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

      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 путь менять его через диалог выбора файлов. А как открыть файл не знаю.

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

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