Выбор файлов в VBA Excel. Стандартный диалог Application.GetOpenFilename. Стартовая папка диалога выбора файлов.
Открытие диалога выбора файлов
Открытие диалога для выбора любого файла и записи его полного имени в ячейку «A1»:
1 2 3 |
Private Sub CommandButton1_Click() Range("A1") = Application.GetOpenFilename End Sub |
В процессе выполнения этого кода VBA Excel открывается диалог с заголовком по умолчанию «Открытие файла» и возможностью выбора любого файла. При нажатии на кнопку «Открытие» полное имя выбранного файла запишется в ячейку «A1». При нажатии на кнопку «Отмена» или кнопку закрытия формы в ячейку «A1» запишется строка «Ложь».
Открытие диалога с заголовком «Выбор файла»:
1 2 3 |
Private Sub CommandButton1_Click() Range("A1") = Application.GetOpenFilename (, , "Выбор файла") End Sub |
Открытие диалога выбора файлов с указанием одного фильтра:
1 2 3 |
Private Sub CommandButton1_Click() Range("A1") = Application.GetOpenFilename ("Файлы Excel 97-2003,*.xls", , "Выбор файла") End Sub |
Фильтр в этом коде VBA Excel представляет из себя пару: наименование фильтра и строка из знака подстановки «*» с расширением отбираемых файлов, разделенных «,». В данном случае в открытом диалоге будут видны файлы с расширением «.xls». Таких пар может быть несколько, как в следующем примере.
Открытие диалога выбора файлов с указанием трех фильтров файлов:
1 2 3 4 |
Private Sub CommandButton1_Click() Range("A1") = Application.GetOpenFilename _ ("Файлы Excel 97-2003,*.xls,Текстовые файлы,*.txt,Рисунки,*.jpg", , "Выбор файла") End Sub |
Выбрать один из фильтров можно из раскрывающегося списка диалога выбора файлов «Тип файлов».
Для справки:
Application.GetOpenFilename («Фильтры», номер, «Заголовок диалога»)
Аргумент номер — это номер по порядку фильтра в списке, отображаемого по умолчанию. Если номер отсутствует или превышает количество фильтров, то по умолчанию отображается первый в списке.
Стартовая папка диалога выбора файлов
При открытии стандартного диалога выбора файлов «Application.GetOpenFilename» по умолчанию, как стартовая, выбирается папка «Мои документы» в Windows XP, «Документы» в Windows 8, но, при желании, можно задать, как стартовую, и любую другую папку.
Для этого можно воспользоваться операторами ChDrive (смена текущего диска) и ChDir (смена текущего каталога). По умолчанию текущим является диск «С» в Windows XP, поэтому, если ваша папка находится на этом диске, то ChDrive можно пропустить.
Пример 1
Проверяем, какая папка является стартовой по умолчанию. При вызове процедуры из первого примера диалог откроется именно на этой папке. Если выбрать файл, в ячейку «A1» запишется полный путь к нему, а при отмене выбора, запишется «Ложь».
1 2 3 |
Private Sub CommandButton1_Click() Range("A1") = Application.GetOpenFilename End Sub |
Пример 2
В этом примере кода VBA стартовой назначается папка D:\Новая папка
. Если пропустить оператор ChDrive "D"
, то по умолчанию стартовой все-равно останется папка «Мои документы».
1 2 3 4 5 6 7 |
Private Sub CommandButton1_Click() 'Смена текущего диска: ChDrive "D" 'Смена текущего каталога: ChDir "D:\Новая папка" Range("A1") = Application.GetOpenFilename End Sub |
Пример 3
Здесь стартовой назначается папка, в которой расположен исходный файл Excel с кодом.
1 2 3 4 5 6 7 |
Private Sub CommandButton1_Click() 'Смена текущего диска: ChDrive Left(ThisWorkbook.Path, 1) 'Смена текущего каталога: ChDir ThisWorkbook.Path Range("A1") = Application.GetOpenFilename End Sub |
Имя диска может быть любым, в зависимости от имеющегося на вашем компьютере.
Смотрите, как с помощью VBA Excel можно открыть папку в проводнике Windows для просмотра.
есть книга с макросами
Макрос_1
Макрос_2
Макрос_n
в каждом из этих макросов есть одинаковый код (напр Range(«D2:F8»). Clear )
Естественно здесь просится еще один Clear_макрос
и теперь пусть каждый Макрос_n запускает Clear_макрос (Run Clear_макрос )
Какой код надо прописать чтобы машина прервала выполнение Макрос_n, перешла к Clear_макрос, и по окончанию опять вернулась и продолжила работу на Макрос_n ?
т.е. что-то типа Go-Return но на уровне макросов
Ответ в статье: Вызов процедуры Sub из другой подпрограммы VBA
Подскажите, возможно ли, чтобы в диалоговом окне отображался только конкретный (один) файл ?
С помощью фильтра это сделать невозможно, но вы можете поместить этот файл в отдельную папку, которую сделать стартовой.
Добрый день! Спасибо за статью. А как в качестве стартовой папки указать сетевой путь типа «\\Папка1\Папка2»? В данном случае ChDir не срабатывает. Через shell и подключение сетевого диска в пошаговом режиме ChDir работает, а в целом нет.
Добрый день, Геннадий!
В разделе Declarations объявите функцию SetCurrentDirectoryA:
Далее в программе переопределите путь по умолчанию на сетевой:
Геннадий, работоспособность кода я не проверил на сетевых папках из-за их отсутствия. С обычными папками работает. Напишите, что получилось.
Евгений, не работает для 64 ОС (((!
Добрый день, Юрий!
Чтобы функция для Windows32 работала в Windows64, необходимо в нее добавить ключевое слово «PtrSafe»:
Спасибо большое, Евгений! То что нужно. Все работает корректно.
Как проверить на нажатие крестика или отмены?
Привет, Филипп!
При закрытии диалога выбора файлов нажатием на крестик или кнопку «Отмена» метод Application.GetOpenFilename возвращает значение False. По возвращенному значению можно отследить нажатие кнопок пользователем:
Здравствуйте, есть ли возможность применить Application.GetOpenFilename с заданием фильтра не только по расширению файла, но и по имени (А*.xls), (B*.xls), (C*.xls) по типу поиска файла в Windows. Если таким образом пытаться ничего не выходит — *.* получается…
Спасибо…
Здравствуйте, Леонид!
Стандартный диалог Application.GetOpenFilename не предусматривает создание фильтров с шаблонами по именам файлов. Частично решить данный вопрос поможет создание нового экземпляра диалогового окна Application.FileDialog с указанием параметра InitialFileName. Частично, потому что здесь можно применить только один шаблон и только в имени файла (не в пути к нему). Но если дать имена файлам с повторяющейся подстрокой, это вполне сработает.
Метод Execute открывает выбранный файл.
Евгений, здравствуйте!
Большое спасибо за статью, очень полезный материал.
Подскажите, пожалуйста. Я использую метод Application.GetSaveAsFilename для сохранения данных из массива в текстовой файл. У меня добавлено несколько параметров «FileFilter»:
— Text (Space) (*.txt)
— Text (Tab) (*.txt)
— Text (Comma) (*.csv) и другие.
В зависимости от выбранного типа файлов, должен использоваться определённый разделитель (space, tab, comma и др). Вариант по поиску через расширение (LCase$(Right$(Path, 3))) мне не подходит.
Думаю самый оптимальный вариант это вернуть значение «FilterIndex» выбранного вручную при сохранении, и в зависимости от этого ставить разделитель, но никак не могу получить это значение.
Здравствуйте, Николай!
Попробуйте так:
Евгений, здравствуйте!
Выдаёт ошибку по первой строке кода (в функции): «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” никак нельзя?
Спасибо)
Добрый день, Николай!
Попробуйте дополнительно указать ключевое слово PtrSafe и изменить тип указателей на LongPtr:
Здравствуйте. Спасибо за статью!
Интересует, как после выбора файла записать в ячейку его имя без расширения и пути.
Сейчас:
Выводит:
D:\TMP\21\Новая папка\Выписка 654.xml
Нужно:
Выписка 654.xml
Добрый день!
Уточните, нужно как вы написали:
Выписка 654.xml
, или без расширения:Выписка 654
?Да, простите ,неправильно написал.
Нужно «Выписка 654»
Вырезаем имя файла между последним обратным слешем и точкой:
Спасибо!
Здравствуйте.
Можете написать полную версию кода?
И еще. Как сделать, чтобы ссылка на файл появлялась не на листе, а в TextBox с последующей вставкой в определенную ячейку на листе?
Здравствуйте, Павел!
Нажатием кнопки CommandButton1 записываем полное имя файла в TextBox1:
Нажатием кнопки CommandButton2 копируем имя файла из TextBox1 в ячейку A1:
Евгений, большое спасибо за статью!
Хотел уточнить, а есть ли возможность сделать настройку так, чтобы не появлялось диалоговое окно, а файлы были выбраны по умолчанию по определенным признакам? В моем случае, в папке находятся ексель-файлы, и их все нужно выбирать, как-то кажется бессмысленным каждый раз запускать диалоговое окно и выбирать все файлы, но как пропустить данный шаг и настроить автоматический выбор всех ексель-файлов в папке я разобраться не могу.
Буду очень рад, если подскажите какой-нибудь метод. Спасибо!
Здравствуйте, Александр!
Ознакомьтесь со статьей Список файлов в папке. Если в папке содержатся файлы разных форматов, можно в цикле
For Each... Next
использовать отбор файлов Excel по расширению. А если требуется эти файлы открыть, то это можно сделать прямо из цикла без предварительной записи их полных имен куда-либо.Евгений, спасибо.
Здравствуйте!
Большое спасибо за статью и комментарии.
У меня такой вопрос:
Я сохраняю имя файла из Application.GetOpenFileName в переменную String. Но при каждом обращении к этой переменной открывается диалог открытия файла. Не знаю, как быть?
Мне нужно перенести значения определенных ячеек (не диапазон) из листа открываемой (через Application.GetOpenFileName) книги в определенные ячейки текущей книги.
Здравствуйте, Махмуд!
При обращении к переменной диалог не должен открываться. Вы можете убедиться в этом, запустив мой код:
Спасибо Евгений!
Тут он не открывается. Я согласен!
Но…
Я не знаю как ссылаться на конкретную ячейку выбираемого из диалога файла.
Например,
Dim sFilename As String
sFilename = Application.GetOpenFilename
Workbooks.Open sFilename
открывает выбираемую книгу. А не нужно, чтобы он открывался. Кстати, Application.UpdateScreen = False тут не поможет.
А прямое присваивание типа
Range("A1") = "= [sFilename]Sheet1!$B$2"
при обращении к sFilename заново открывает диалог.Махмуд, чтобы работать со вновь открытой книгой из кода VBA, ссылку на нее необходимо присвоить объектной переменной:
Спасибо еще раз!
Проблема решена!
Здравствуйте, Евгений.
применяя этот макрос:
Обсуждение закрыто.