Vba excel выбор файла по части имени
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип/расширение выбираемого файла)
Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает также, только служит для вывода диалогового окна выбора папки.
Ниже представлены функции для вызова диалоговых окон выбора файлов и папок средствами VBA.
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип\расширение выбираемого файла)
Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.
Ещё один вариант кода (который я использую) для выбора файла
Его отличие - функция запоминает папку, из которой последний раз выбирался файл,
и при повторном запуске диалогового окна выбора файла,
обзор папок будет начат с той папки, откуда последний раз был взят файл.
Комментарии
Подскажите пожалуйста как использовать эти методы при выборе папок из телефона андроид
Здравствуйте: пробую последний макрос "Sub AttachFile_test()"
Я сделал форму заявки на создание макета и отправки данных отправки на почту, работает. Нужно, чтобы можно было выбрать файл (например .jpg) с компьютера (или по сетевому пути) и чтобы файл выбранный уходил как вложение в письме?
Чтобы файл остался отрытым, его надо открыть..
Подскажите пожалуйста, как после того, как файл был выбран оставить его открытым?
Здравствуйте, Никита.
Могу написать макрос под заказ
Не могу решить задачку:
Есть файл. В нем есть несколько листов. Нужно по нажатию кнопки сохранить один конкретный лист (допустим его название "Лист1") в конкретную папку с опереденным названием из ячейки.
Ячейка А1 - "77-09-01"
Ячейка А2 - "Зубные протезы"
Ячейка A3 - "77-09-01 Зубные протезы"
Имя файла при сохранении берем из ячейки А3. Это все просто.
Сложность в том что нужно файл сохраниться с папку с именем "77-09-01 Зубы"
Названия папок по сути всегда разные, и в какую именно папку сохранять по сути определяю эти цифры. Они могут быть 66-05-18, 01-04-54 и тд..
Эти все папки условно лежат в папке D:\Ортодонтия\
То есть
в папке Ортодонтия есть не сколько папок:
66-05-18 Протезы
01-04-54 Пластины
77-09-01 зубы
получается выбор папки должен происходить по поиску значения в ячейке А1.
и потом уже выбор этой папки и сохранение.
Каждый раз при сохранении по сути нужно что бы поиском находит папку что бы ее начало было на значения в ячейке A1, и потому туда ее сохранял.
Спасибо за помощь )
Евгения, в Windows нет такой возможности. Эти диалоговые окна встроены в систему, и они так устроены, что либо папки, либо файлы выбираем.
Отображаются и файлы, и папки, в диалоговом окне выбора ФАЙЛА. Но выбрать можно только файл или несколько файлов, папку выбрать нельзя.
Подскажите, пожалуйста, возможно ли при использовании метода GetFolderPath отображать в открывшемся окне не только папки, но и файлы?
Скажите пожалуйста, что делать при ошибке 424. В Exel ругается на Application.FileDialog(msoFileDialogFolderPicker). Может библиотеку какую подключить и как?
Этот код написан для Excel. Как сделать в Outlook - не знаю. Попробуйте другие варианты кода из статьи.
Скажите пожалуйста, что делать при ошибке 438. В Outlook ругается на Application.FileDialog(msoFileDialogFolderPicker). Может библиотеку какую подключить и как?
Везде описывается, как задать параметры окна FileDialog (.Title; .InitialFileName; .InitialView; .Filters.Add; .ButtonName). Но нигде не могу найти как задать параметры поиска в верхнем правом углу окна FileDialog?
Вроде иду по правильному пути, вот что получилось:
Function GetFolderPath(Optional ByVal Title As String = "Выберите папки", _
Optional ByVal InitialPath As String = "c:\") As FileDialogSelectedItems
With ТУТ проблема объект FileDialog не дает выбрать только папки, он их открывает (какой объект для папок?)
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
Set GetFolderPath = .SelectedItems
End With
End Function
Спасибо Вам большое за макрос. Подскажите, как переделать GetFolderPath так, чтобы можно было выбирать несколько папок, что-то вроде GetFilenamesCollection, но для папок. Заранее спасибо.
Здравствуйте, Дмитрий
Думаю, описанными в статье способами сделать не получится, - так уж устроен Excel и Windows
Зачем вам именно ярлыки? Объясните, - может, посоветую другой способ.
Замечательные функции, активно пользуюсь.
Огромное СПАСИБО
Подскажите, пожалуйста, как из форм выбора выбирать ярлыки
Возвращает сразу объект, а нужен именно ярлык
Вряд ли прояснится, - если мне за несколько последних лет такое не заказывали, и на форумах про подобное не читал, - значит, вероятность найти готовое решение низка.
Сделать можно, если под заказ (не бесплатно)
PS: данная операция возможна, но не штатными средствами Excel
А к прикреплению файлов к книге, это не имеет никакого отношения.
Если проясниться эта ситуация - опишите ее пожалуйста.
По всей видимости данная операция должна быть возможной, поскольку современный Excel имеет возможность прикрепления файлов к книге.
Конечно мне важно именно пермещение фалов на форму и по сложившейся ситуации на работе - не могу писать отдельные проекты ни в VB ни Delphi ни в остальных.
Но, в общем - большое спасибо (за быстрый ответ).
И VB6 это просто делается (примера нет - последний раз делал лет 8 назад) - и список файлов, и перетаскивание
Как отловить Drag&Drop для перестаскивания файла - не знаю (события VBA предназначены для отлова перетаскивания ТЕКСТА из поля в поле)
Если использовать сторонние компоненты на форме - то все можно сделать.
Но тут у меня нет опыта - я использую в своих программах только штатные элементы управления.
Добрый день.
Извиняюсь что не совсем по теме, но перерыв интернет не нашел ни одного внятного ответа или примера.
Прошу подсказать по работе с файлами:
1. Есть ли возможность в VBA создать не выбор файлов в диалоговом окне, а выбор файла в элементе управления на форме, который бы отображал содержимое конкретной папки.
2. Возможно ли средствами VBA использовать события Drag&Drop, Drag&Over (у меня они не работают). И как правильно организовать перетаскивание файлов на элемент управления на форме и какой элемент правильней использовать в данном случае.
(элемент InkEdit работает не качественно - не отображает мини-картинку файла exel + выводит картинку, а не ярлык.)
3. Если есть возможность показать пример на эту тему.
заранее, большое спасибо!
Александра, у вас MsgBox отображает корректный путь к файлу?
Если да, - то моя функция работает, ищите проблему в своем коде
Для чего используется метод OpenDatabase?
Много лет пишу макросы - ни разу им не пользовался
Все переменные объявлены: вот более полный вариант кода.
Dim MainFile, InFile, ExFile As String
MainFile = ActiveWindow.Caption
InFile = GetFilePath()
If InFile = "" Then Exit Sub
MsgBox "Âûáðàí ôàéë: " & InFile
Workbooks.OpenDatabase Filename:=InFile _
, CommandText:=Array("Çàäîëæåííîñòü*"), CommandType:=xlCmdTable, _
ImportDataAs:=xlTable
Даже без этой строки происходит ошибка на том же месте, я только что проверила. =(
Добрый день.
Я попробовала ваш код на практике, разобралась в принципе работы, но все равно не могу понять причину ошибки в данной части кода (используется последняя функция в вашей статье):
InFile = GetFilePath()
If InFile = "" Then Exit Sub
MsgBox "Âûáðàí ôàéë: " & InFile
Workbooks.OpenDatabase Filename:=InFile _
, CommandText:=Array("Çàäîëæåííîñòü*"), CommandType:=xlCmdTable, _
ImportDataAs:=xlTable
Ошибка происходит при попытке обработать Workbooks. Согласно Watch, путь к файлу находится корректно, но в filename ничего не прописывается. Не могли бы вы подсказать, в чем тут причина?
Потому что у вас в самом верху модуля есть строка Option Explicit
Или уберите эту строку, или в моём макросе объявляйте все переменные
например, в данном случае
Доброго времени суток.
Почему выходит ошибка(. not defined)при попытке выполнения кода.
ИмяФайла = GetFilePath("Выберите файл excel", , "Документы Excel", "*.xls")
Спасибо большое! все теперь работает!) вы меня просто спасли!)
Попробуйте такой вариант:
Добрый день, благодарю за ответ. Код работает. он открывает файл, который я выбираю в директории, меняла я не это. Из этого открытого файла нужно взять с листа значения, соответствующие условию и чтобы они скопировались в текущий. и вот тут я не могу сослаться на этот файл и на этот лист, подскажите пожалуйста, как можно прописать эту строку?
Добрый день, подскажите пожалуйста, взяла за основу Ваш код для открытия файла и добавила в него выбор диапазона
Sub ПримерИспользования_GetFilePath()
ИмяФайла = GetFilePath("Выберите файл excel", , "Документы Excel", "*.xls") ' запрашиваем имя файла
If ИмяФайла = "" Then Exit Sub ' выход, если пользователь отказался от выбора файла
Workbooks.Open Filename:=ИмяФайла
Range("A8").Value = ИмяФайла
Windows("Продажи для ЭТ 2013.xlsx").Activate
Worksheets("исх").Range("$A$8:$AH$30000").AutoFilter Field:=1, Criteria1:= _
"01. Алексеевка"
Range("A9:AE5000").Select
Selection.Copy
Windows("БДР Алексеевка13.xlsm").Activate
Range("A11").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
возможно ли как то вместо прописи названия файла "Продажи для ЭТ 2013.xlsx" чтобы он вытаскивал ссылку на этот файл из ячейки А8? если заментить его на "ИмяФайла" выдает ошибку 400.
В статье, в самом конце, приведен рабочий вариант кода для вашего случая.
Вы зачем-то переделали код, - и теперь спрашиваете, почему не работает.
Возьмите код функции GetFolderPath (самый нижний в статье) без переделок, - и всё будет работать корректно.
Доброго времени суток!
Задача: Необходимо чтобы был вывод диалогового окна выбора папки, но при этом он запоминал предыдущий выбор папки.
Из ваших двух макросов сделал один, но есть небольшая проблемка. Он запоминает предыдущий выбор, но при последующим открытии макроса, он выходит на уровень выше (т.е. мы первй раз выбрали C:\Новая папка\Новая папка1\Новая папка2, второй раз запуская макрос мы поподаем на C:\Новая папка\Новая папка1 а я хочу чтобы был путь C:\Новая папка\Новая папка1\Новая папка2 . Пожалуйста, не подскажите как решить данную проблему. Спасибо.
Sub AttachFile_test() ' пример использования
Filename$ = GetFolderPath()
If Filename$ = "" Then Exit Sub
MsgBox "Выбрана папка: " & Filename$
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\")
On Error Resume Next
With Application.FileDialog(msoFileDialogFolderPicker)
.ButtonName = "Выбрать": .Title = Title:
.InitialFileName = GetSetting("GetFolderPath", "folder", InitialPath)
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
SaveSetting Application.Name, "GetFolderPath", "folder", GetFolderPath
End With
End Function
PS Я только начал знакомиться с VBA.
Здравствуйте Игорь! Воспользовался вашим примером, функция GetFolderPath. Работает прекрасно. А как сделать, чтобы открывалось не окно Виндовс, а результат прописывался на лист Эксель?
Доброго времени суток!
Подскажите пожалуйста, каким образом будет копироваться все содержимое листа исходя их аналогии кода, который Вы предоставили Станиславу.
Станислав, вы же видели этот чекбокс в другом моём макросе, - вот и сделайте по аналогии.
Если сами не справитесь, - обратитесь за помощью на форумы по Excel, или оформляйте заказ у меня на сайте
Добрый день! целый день голову ломал, так и не получилось, еще небольшая просьба, необходимо к этому макросу добавить chekbox "Не отображать диалоговое окно выбора папки(искать файлы в ранее выбранной папке)", т.е. чтобы можно было ставить галочку и не выводить каждый раз окно выбора файла, а данные считывались с предыдущего выбранного файла. Заранее спасибо! Вот мой макрос:
все получилось, огромное спасибо!
Станислав, всё делается проще, без активации файлов, листов и окон:
Добрый день! помогите устранить маленькую проблему.
Проблема: в макросе после открытия выбранного файла средствами GetFilePath приходится каждый раз выбранный файл автоматически открывать функцией Workbooks.Open Filename:=ИмяФайла чтобы скопировать несколько ячеек поочередно. Пытался после одного открытия файла просто активировать в дальнейшем функцией Windows(ИмяФайла).Activate указанный файл при открытии. Выкладываю часть макроса, заранее Спасибо!
.
Sub Загрузка_данных()
ИмяФайла = GetFilePath("Выберите файл Excel", "s:\Данные для передачи\", "*.xls")
If ИмяФайла = "" Then Exit Sub
Application.ScreenUpdating = False
Set ActiveWB = ActiveWorkbook
Windows(ActiveWB.Name).Activate
Workbooks.Open Filename:=ИмяФайла 'открываю выбранный файл в первый раз
Range("P6:P36").Select
Selection.Copy
Windows(ActiveWB.Name).Activate
Range("K46").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=True
Workbooks.Open Filename:=ИмяФайла 'вот здесь не хочу заново открывать этот файл, т.к. он уже ранее открыт. а просто его активировать windows().activate как.
Range("Q6:Q36").Select
Application.CutCopyMode = False
Selection.Copy
Windows(ActiveWB.Name).Activate
Range("K48").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=True
.
ActiveWindow.Close
Range("AA46").Select
Application.ScreenUpdating = True
End Sub
Огромное Вам СПАСИБО.
Александр, попробуйте так:
Как правильно записать макрос для выбора файла и последующей работы с ним? Вопрос в том, что бы можно было выбрать любой файл, а не тот что прописан в макросе (все файлы будут текстовые):
Diana, к сожалению, используемый в коде Application.FileDialog(msoFileDialogOpen) такой возможности не предоставляет.
Можно при желании задать несколько фильтров
Здравствуйте. Вопрос по " GetFilePath". Как можно задать в фильтре вместо "*.*", чтобы можно было выбирать только "01.txt", "02.txt", "03.txt", т.е. не все *.txt файлы, а именно перечислить?
И еще. опечаточка на сайте имеется :) ("Функция GetFilenamesCollection позволяет выб!О!рать сразу несколько файлов в одной папке"
Спасибо.
У меня, к счастью (именно, к счастью), тоже нет мака.
Написал небольшую примитивную базку (сам не программист, просто немного умею и быстро учусь при необходимости).
Попросили оптимизировать под мак, т.к. у одного из пользователей яблочный друг. На Windows всё прекрасно работает, а вот на маке форма открывается, на лист данные заносятся без проблем, но эта кнопка не работает, диалоговое окно не открывает, наверняка, и папки не создаёт.
Может из-за того, что там стартовая папка указана "C:\"?
По самому коду есть нарекания, явные ошибки?
Существуют ли альтернативные команды создания директорий и вывода диалоговых окон?
Здравствуйте, Виктор.
К сожалению, помочь в этом вопросе не смогу, - ибо не являюсь счастливым обладателем Mac-а, и, соответственно, протестировать код на Макинтоше нет никакой возможности.
Интересует вопрос, как этот код оптимизировать под Office for mac?
Кнопка открывает диалоговое окно, в нём выбирается нужный файл, при нажатии "открыть", по предустановленному шаблону создаётся папка, в неё копируется выбранный файл, диалоговое окно закрывается. Этот код работает на Windows.
Private Sub Photoprot_bef_oper_but_Click()
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
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _
Optional ByVal InitialPath As String = "C:\") As String
On Error Resume Next
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
Иногда бывает необходимо заполучить на лист Excel список файлов в заданной папке и ее подпапках. В моей практике такое встречалось неоднократно, например:
- перечислить в приложении к договору на проведение тренинга список файлов из раздаточных материалов для особо щепетильных юристов в некоторых компаниях
- создать список файлов для ТЗ проекта
- сравнить содержимое папок (оригинал и бэкап, например)
Для реализации подобной задачи можно использовать несколько способов.
Способ 1. Скелет из шкафа - функция ФАЙЛЫ
Этот способ использует древнюю функцию ФАЙЛЫ (FILES) , оставшуюся в Microsoft Excel с далеких девяностых. Вы не найдете эту функцию в общем списке функций, но для совместимости, она всё ещё остаётся внутри движка Excel, и мы вполне можем её использовать.
1. В любую ячейку листа (например, в А1) введём путь к папке, список файлов из которой мы хотим получить.
Обратите внимание, что путь должен оканчиваться шаблоном со звездочками:
- *.* - любые файлы
- *.xlsx - книги Excel (только с расширением xlsx)
- *.xl* - любые файлы Excel
- *отчет* - файлы, содержащие слово отчет в названии
2. Создадим именованный диапазон с помощью вкладки Формулы - далее кнопка Диспетчер имен - Создать (Formulas - Names Manger - Create) . В открывшемся окне введем любое имя без пробелов (например Мои_файлы) и в поле диапазона выражение:
После нажатия на ОК будет создан именованный диапазон с именем Мои_файлы, где хранится список всех файлов из указанной в А1 папки. Останется их оттуда только извлечь.
3. Чтобы извлечь имена отдельных файлов из созданной переменной, используем функцию ИНДЕКС (INDEX) , которая в Excel вытаскивает данные из массива по их номеру:
Если лениво делать отдельный столбец с нумерацией, то можно воспользоваться костылем в виде функции СТРОКИ (ROWS) , которая будет подсчитывать количество заполненных строк с начала списка автоматически:
=ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3) )
= ЕСЛИОШИБКА( ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3)) ; "")
Важное примечание : формально функция ФАЙЛЫ относится к макро-функциям, поэтому необходимо будет сохранить ваш файл в формате с поддержкой макросов (xlsm или xlsb).
Способ 2. Готовый макрос для ленивых
Если вы знакомы с макросами (не в смысле их программирования, а в смысле копипастинга готовых кодов на VBA), то вам, возможно, отлично зайдёт небольшой макрос, добавляющий в текущую книгу новый пустой лист и выводящий на него список всех файлов с их параметрами из заданной пользователем папки.
Для добавления макроса в вашу книгу нажмите сочетание клавиш Alt + F11 , или кнопку Visual Basic на вкладке Разработчик (Developer) , в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:
Для запуска макроса нажмите сочетание клавиш Alt + F8 ,или кнопку Макросы (Macros) на вкладке Разработчик (Developer) , выберите наш макрос FileList и нажмите кнопку Выполнить (Run) . В диалоговом окне выберите любую папку или диск и - вуаля!
Если захотите, чтобы вместо пути к файлу в столбце B выводилась живая гиперссылка, то замените 52-ю строку
Cells(r, 2).Formula = FileItem.Path
Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"
Способ 3. Мощь и красота - надстройка Power Query
Power Query - это очень мощная и при этом бесплатная надстройка для Excel от Microsoft, упрощающая множество задач по загрузке и трансформации данных. В нашей ситуации она тоже может здорово помочь.
Если у вас Excel 2016 или новее, то Power Query уже встроена в Excel по умолчанию, поэтому просто на вкладке Данные выберите команду Создать запрос / Получить данные - Из файла - Из папки (Create Query / Get Data - From file - From folder) . Если у вас Excel 2010-2013, то Power Query нужно будет скачать с сайта Microsoft и установить как отдельную надстройку и она появится у вас в Excel в виде отдельной вкладки Power Query. На ней будет аналогичная кнопка Из файла - Из папки (From file - From folder) .
В открывшемся окне нужно будет указать папку, содержимое которой мы хотим получить. После нажатия на ОК Power Query обшарит указанную папку и все вложенные подпапки и выдаст на экран окно с предварительным просмотром результатов:
Если внешний вид списка вас устраивает, то можно смело жать внизу кнопку Загрузить (Load) , чтобы залить эти данные на новый лист. Если же хочется дополнительно обработать список (удалить лишние столбцы, отобрать только нужные файлы и т.п.), то нужно выбрать команду Изменить / Преобразовать данные (Edit / Transform Data).
Поверх окна Excel откроется окно редактора Power Query, где мы увидим список всех наших файлов в виде таблицы:
Дальше возможны несколько вариантов:
-
Если нужны только файлы определенного типа, то их можно легко отобрать с помощью фильтра по столбцу Extension:
После того, как необходимые файлы отобраны, можно смело удалить ненужные столбцы, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить (Remove column ) . Это, кстати, уже никак не повлияет на фильтрацию или сортировку нашего списка:
Если в будущем планируется подсчитывать количество файлов в каждой папке (например, для контроля поступивших заявок или подсчета статистики по заявкам), то имеет смысл дополнительно сделать ещё пару действий:
- Щелкните правой кнопкой мыши по столбцу Folder Path и выберите команду Дублировать столбец (Duplicate Column) .
- Выделите скопированный столбец и на вкладке Преобразование (Transform) выберите Разделить столбец - По разделителю (Split Column - By delimiter)
Мы получим рядом с нашими данными еще несколько столбцов, где будут продублированы имена вложенных папок - это пригодится нам чуть позже для подсчета статистики с помощью сводной таблицы:
Получившиеся столбцы можно переименовать (Диск, Папка1, Папка2 и т.д.), просто щёлкнув дважды по заголовку каждого.
И, наконец, когда список готов, то его можно выгрузить на лист с помощью команды Главная - Закрыть и загрузить - Закрыть и загрузить в. (Home - Close & Load - Close & Load to. ) :
И, само-собой, теперь можно построить по нашей таблице сводную (вкладка Вставка - Сводная таблица), чтобы легко подсчитать количество файлов в каждой папке:
Дополнительным бонусом можно сделать еще один столбец с функцией ГИПЕРССЫЛКА (HYPERLINK) , которая создаст красивые стрелочки-ссылки для моментального перехода к каждому файлу:
Мелочь, а приятно :)
И вдвойне приятно, что в будущем, при изменении содержимого исходной папки, достаточно будет просто щелкнуть мышью по нашей таблице и выбрать команду Обновить (Refresh) - и Power Query выполнит всю цепочку запрограммированных нами единожды действий уже автоматически, отобразив все изменения в составе папки.
Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
-
Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.
Способ 2. Запись макросов макрорекордером
Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
- в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
- Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
- В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button) :
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Часто при работе с файлами и написании кодов начинающие "кодить" в VBA сталкиваются с необходимостью предоставить пользователю возможность самостоятельного выбора файлов: либо всех в указанной папке, либо каких-то отдельных. Конечно, можно жестко в коде написать нечто вроде: "C:\Documents\Files\Книга1.xls" , но это требует не только наличия именно диска С, но и полной структуры папок и имен файлов. Это очень неудобно в большинстве случаев и куда чаще необходимо дать пользователю возможность самому указать имя файла. Записывать в ячейку листа полный путь и имя весьма непрактично и часто для неискушенного пользователя вызывает только "отторжение" от программы. В статье Просмотреть все файлы в папке я приводил пример кода, который просматривает все файлы в указанной папке и папка при этом выбирается сами пользователем из привычного по работе с Windows диалога. Там используется диалог выбора папок. Именно на этом я и хочу сделать акцент в этой статье - рассказать про некоторые способы вызова подобных диалогов для выбора файлов или папки. Так же обращу внимание на некоторые вещи, которые следует учитывать при использовании того или иного типа диалогов.
Диалог выбора файлов Applicaton.GetOpenFileName
Параметры:
Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
По сути я часто использую именно его, т.к. это универсальный метод и в нем есть все, что лично мне необходимо: выбрать определенные типы файлов позволяет, возможность запрета выбора нескольких файлов сразу есть.avFiles = Application.GetOpenFilename _ ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _ "Выбрать текстовые или Excel файлы", , True)
- True - можно будет выбрать более одного файла для обработки(через Shift или Ctrl или простым выделением мышью внутри окна)
- False - можно будет выбрать только один файл
По умолчанию принимает значение False
Выбора только одного файла:avFiles = Application.GetOpenFilename _ ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _ "Выбрать текстовые или Excel файлы", , False)
Выбор нескольких файлов:
avFiles = Application.GetOpenFilename _ ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _ "Выбрать текстовые или Excel файлы", , True)
Пример применения диалога Application.GetOpenFilename
Sub ShowGetOpenDialod() Dim avFiles 'по умолчанию к выбору доступны файлы Excel(xls,xlsx,xlsm,xlsb) avFiles = Application.GetOpenFilename _ ("Excel files(*.xls*),*.xls*", 1, "Выбрать Excel файлы", , False) If VarType(avFiles) = vbBoolean Then 'была нажата кнопка отмены - выход из процедуры Exit Sub End If 'avFiles - примет тип String MsgBox "Выбран файл: '" & avFiles & "'", vbInformation, "www.excel-vba.ru" End Sub
В данном случае совершенно неважно указан ли выбор только одного файла или нескольких. Может поменяться только способ обработки полученного результата. Если параметр MultiSelect установлен в False, то переменная avFiles примет тип String, т.е. это будет одна строка. Предположим, что была выбрана книга Excel. Тогда открыть её можно будет как обычно это делается при использовании переменной:
Если же параметр MultiSelect установлен в True, то переменная avFiles примет тип Array - массив строк, в котором будут записаны все пути и имена выбранных файлов. Обрабатывать в таком случае следует циклом:
'avFiles - примет тип Array For Each x In avFiles Workbooks.Open x Next
В приложенном к статье файле приведены две процедуры с использованием этого типа диалога и обработкой файлов с параметром MultiSelect , установленным в True и False.
Диалог выбора файлов FileDialog(msoFileDialogFilePicker)
У этого диалога тоже есть параметры и они очень схожи с таковыми в Application.GetOpenFilename:
Ниже в статье примера кода с применением всех описанных параметров- True - можно будет выбрать более одного файла для обработки(через Shift или Ctrl или простым выделением мышью внутри окна)
- False - можно будет выбрать только один файл
- Description - описание типа файлов. Произвольный текст, указывающий тип файлов. Например "Рисунки" или "Файлы Excel".
- Extensions - расширения файлов. Непосредственно перед расширением обязательно должна стоять звездочка и точка: *.xls . Иначе диалог выдаст ошибку. Для перечисления нескольких расширений используется разделитель в виде точки-с-запятой: "*.xls*;*.xla*" или "*.xls;*.xlsx;*.xlsm" . Звездочка после расширения заменяет любой набор символов или ни одного. Например, при указании "*.xls*" будет возможным выбрать любые файлы, расширение которых начинается на .xls: .xls,.xlsx,.xlsm,.xlsb и т.д. , но нельзя будет выбрать файлы с расширением .xla,.xlam и тем более .doc или .txt . Если необходимо осуществить выбор любого типа файлов, то необходимо просто очистить фильтр и не добавлять никакие типы: .Filters.Clear
- Position - указывает, каким по счету в списке будет тип файлов. На рисунке ниже первым идет тип "Excel files", а вторым "Text files":
Каждый новый тип файлов добавляется новым Add:
.Filters.Add "Excel files", "*.xls*;*.xla*", 1 'добавляем возможность выбора файлов Excel .Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
Если при этом еще добавить имя файла, то в поле диалога Имя файла будет так же отображено это имя:
- msoFileDialogViewDetails
- msoFileDialogViewLargeIcons
- msoFileDialogViewList
- msoFileDialogViewPreview
- msoFileDialogViewProperties
- msoFileDialogViewSmallIcons
- msoFileDialogViewThumbnail
- msoFileDialogViewTiles
- msoFileDialogViewWebView
For Each x In .SelectedItems Workbooks.Open x Next
Так же можно отбирать только отдельные файлы по индексам или организовать цикл иначе:
For lf = 1 to .SelectedItems.Count x = .SelectedItems(lf) Workbooks.Open x Next
- -1 - выбор файлов был сделан и нажата кнопка Открыть
- 0 - была нажата кнопка отмены
Это можно(точнее нужно!) использовать, чтобы не продолжать выполнение кода, если нажата кнопка Отмены:
If .Show = 0 Then Exit Sub 'была нажата кнопка отмены
Пример вызова диалога выбора файлов:
Sub ShowFileDialog() Dim oFD As FileDialog Dim x, lf As Long 'назначаем переменной ссылку на экземпляр диалога Set oFD = Application.FileDialog(msoFileDialogFilePicker) With oFD 'используем короткое обращение к объекту 'так же можно без oFD 'With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = False .Title = "Выбрать файлы отчетов" 'заголовок окна диалога .Filters.Clear 'очищаем установленные ранее типы файлов .Filters.Add "Excel files", "*.xls*;*.xla*", 1 'устанавливаем возможность выбора только файлов Excel .Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов .FilterIndex = 2 'устанавливаем тип файлов по умолчанию - Text files(Текстовые файлы) .InitialFileName = "С:\Temp\Книга1.xlsx" 'назначаем папку отображения и имя файла по умолчанию .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов) If oFD.Show = 0 Then Exit Sub 'показывает диалог 'цикл по коллекции выбранных в диалоге файлов For lf = 1 To .SelectedItems.Count x = .SelectedItems(lf) 'считываем полный путь к файлу Workbooks.Open x 'открытие книги 'можно также без х 'Workbooks.Open .SelectedItems(lf) Next End With End Sub
Диалог выбора папки
Диалог выбора папки необходим в случаях, когда файлов в папке много и обработать нужно все эти файлы. Пример такой обработки я уже выкладывал в статье Просмотреть все файлы в папке. Здесь проще всего использовать появившийся в 2002 Excel диалог Application.FileDialog. Его параметры практически такие же, как у Application.FileDialog(msoFileDialogFilePicker) только их меньше доступно для применения:- msoFileDialogViewDetails
- msoFileDialogViewLargeIcons
- msoFileDialogViewList
- msoFileDialogViewPreview
- msoFileDialogViewProperties
- msoFileDialogViewSmallIcons
- msoFileDialogViewThumbnail
- msoFileDialogViewTiles
- msoFileDialogViewWebView
- -1 - папка выбрана и нажата кнопка Открыть
- 0 - была нажата кнопка отмены
Это можно(точнее нужно!) использовать, чтобы не продолжать выполнение кода, если нажата кнопка Отмены:
If .Show = 0 Then Exit Sub 'была нажата кнопка отмены
Пример вызова диалога выбора папки:
Sub ShowFolderDialog() Dim oFD As FileDialog Dim x, lf As Long 'назначаем переменной ссылку на экземпляр диалога Set oFD = Application.FileDialog(msoFileDialogFolderPicker) With oFD 'используем короткое обращение к объекту 'так же можно без oFD 'With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Выбрать папку с отчетами" '"заголовок окна диалога .ButtonName = "Выбрать папку" .Filters.Clear 'очищаем установленные ранее типы файлов .InitialFileName = "C:\Temp\" '"назначаем первую папку отображения .InitialView = msoFileDialogViewLargeIcons 'вид диалогового окна(доступно 9 вариантов) If oFD.Show = 0 Then Exit Sub 'показывает диалог 'цикл по коллекции выбранных в диалоге файлов x = .SelectedItems(1) 'считываем путь к папке MsgBox "Выбрана папка: '" & x & "'", vbInformation, "www.excel-vba.ru" End With End Sub
Диалог выбора папки через Shell
Диалог Application.FileDialog(msoFileDialogFolderPicker) всем хорош и удобен, кроме одного: как я уже упоминал, он стал доступен из VBA только начиная с 2002 Excel. Плюс, описанные выше диалоги не работают в Outlook - он просто лишен хоть какой-либо реализации выбора папок или файлов. Поэтому дополню статью еще одним вариантом показа диалога выбора папки - с помощью объекта Shell. Этот вариант выбора папки будет работать и в Outlook и в любом другом приложении.
Shell.BrowseForFolder([Hwnd], [sTitle], [iOptions], [vRootFolder])Hwnd Дескриптор окна, к которому будет относится диалог. Как правило указывается 0 sTitle Поясняющий текст, который будет отображен в диалоге. Подобие заголовка окна. Может быть любым текстом, например "Выбрать папку с отчетами" iOptions Дополнительные параметры для диалога. Рекомендуется использовать 0. Но можно попробовать и пару других вариантов. Например, если указать 20, то в диалоговом окне появится дополнительное текстовое поле, в котором будет отображено имя выбранной папки. vRootFolder Аналогично InitialFileName в рассмотренных выше диалогах. Задает начальную папку, на которой диалог будет открыт после запуска.
Пример вызова диалога выбора папки через Shell:Sub GetFolderDialog_Shell() On Error Resume Next Dim objShellApp As Object, objFolder As Object, ulFlags Dim x As String Set objShellApp = CreateObject("Shell.Application") 'ulFlags - числовой код, определяющий вид отображаемого окна и некоторые параметры ' ulFlags = 0 - наиболее часто применяемый. Лучше использовать всегда именно 0 ' ulFlags = 1 - не отображать Корзину ' ulFlags = 2 - не включать сетевые папки ' ulFlags = 20 - добавляется тестовое поле с отображением имени выбранной папки ' ulFlags = 16 - отображать EditBox для ввода полного пути с клавиатуры ' ulFlags = 16384 - можно так же выбирать файлы. 'Некоторые константы можно комбинировать. Например если указать 1 + 16384 - то можно будет выбирать файлы ulFlags = 0 Set objFolder = objShellApp.BrowseForFolder(0, "Выбрать папку с отчетами", ulFlags, "C:\Temp\")'" x = objFolder.Self.Path 'записываем в переменную путь к папке If Err.Number <> 0 Then MsgBox "Папка не выбрана!", vbInformation, "www.excel-vba.ru" Else MsgBox "Выбрана папка: '" & x & "'", vbInformation, "www.excel-vba.ru" End If End Sub
Конечно, диалог подобный выглядит довольно убого, особенно на современных операционных системах. Но он работает в любых версиях офиса и в любом приложении, в том числе в Outlook. Порой это бывает полезней красоты.
Tips_Macro_GetOpenFileFolder.xls (100,0 KiB, 3 529 скачиваний)
Диалог сохранения файла SaveAs
Еще один вид диалогового окна - запрос имени и места сохранения файла.
Параметры:
Application.GetSaveAsFilename([InitialFileName], [FileFilter], [FilterIndex], [Title], [ButtonText])
Универсальный диалог, работающий во всех версиях Excel, начиная с 2000Показываем диалог со стартовой папкой на той книге, в которой сам макрос и именем сохраняемой книги "SaveAs.xlsm" :
sToSavePath = Application.GetSaveAsFilename(InitialFileName:="SaveAs.xlsm", FileFilter:="Excel files (*.xlsm), *.xlsm")
avFiles = Application.GetSaveAsFilename _ (InitialFileName:=ThisWorkbook.Path, FileFilter:="Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", FilterIndex:=2)
Что еще важно знать: сам по себе вызов диалога GetSaveAsFilename ничего не сохраняет - он только создает путь для сохраняемого файла. Сохранять придется принудительно после выбора места и имени.
Пример применения диалога Application.GetSaveAsFilenameSub ShowGetSaveAsDialod() Dim sToSavePath sToSavePath = Application.GetSaveAsFilename( _ InitialFileName:=ThisWorkbook.Path, _ FileFilter:="Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", _ FilterIndex:=2, _ Title:="Сохранить файл") 'если нажали Отмена - завершаем процедуру ничего не сохраняя If VarType(sToSavePath) = vbBoolean Then Exit Sub End If 'непосредственно сохранение файла ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=ThisWorkbook.FileFormat End Sub
Здесь тоже есть нюанс - метод SaveAs имеет два важных аргумента:
1. Filename - путь и имя сохраняемого файла. Здесь должно быть все понятно. Указываем то, что выбрали в диалоге.
2. FileFormat - формат сохраняемого файла. При этом не текстовое представление(как в диалоге "xls" или "txt"), а одна из предустановленных констант формата файла. Вот основные константы:Пример использования констант в диалогах Application.GetSaveAsFilename
Сохраняем файл с форматом xlsm - файл с поддержкой макросов. Для этого ищем в таблице выше расширение xlsm и берем либо константу Excel либо числовую константу:Sub ShowGetSaveAsDialod() Dim sToSavePath sToSavePath = Application.GetSaveAsFilename( _ InitialFileName:=ThisWorkbook.Path & "\Report.xlsm", _ FileFilter:="Excel files(*.xlsm),*.xlsm") 'если нажали Отмена - завершаем процедуру ничего не сохраняя If VarType(sToSavePath) = vbBoolean Then Exit Sub End If 'непосредственно сохранение файла 'используем встроенную константу Excel ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=xlOpenXMLWorkbookMacroEnabled 'используем числовую константу 'ThisWorkbook.SaveAs Filename:=sToSavePath, FileFormat:=52 End Sub
Любой метод: либо числовая константа, либо встроенная работают одинаково. Вопрос лишь в том, что лично для Вас будет удобнее и нагляднее.
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип/расширение выбираемого файла)Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает также, только служит для вывода диалогового окна выбора папки.
Ниже представлены функции для вызова диалоговых окон выбора файлов и папок средствами VBA.
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип\расширение выбираемого файла)Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.
Ещё один вариант кода (который я использую) для выбора файла
Его отличие - функция запоминает папку, из которой последний раз выбирался файл,
и при повторном запуске диалогового окна выбора файла,
обзор папок будет начат с той папки, откуда последний раз был взят файл.Комментарии
Все чудесно работает для Excel 2007 и 2003. А как сделать выбор файла (именно файла, а не папки) для Excel 97? Если использовать BrowseForFolder, то какой должен быть синтаксис? У Павла Климова я этого не нашел.
Спасибо.
Программа с вызовом BrowseForFolder уже есть )) Она дает создавать новую папку.
Но хотелось бы еще иметь возможность
- поиска папки по имени
- задания стартовой папки
подскажите, пожалуйста, можно ли это сделать в 2000что посоветуете для Excel 2000 ?
Объект FileDialog впервые появился в Microsoft Excel XP
Для выбора папки в более ранних версиях Excel (97, 2000) используйте следующий код:Добрый день!
В Excel 2000 на операторвыдается ошибка 438.
нужно диалоговое окно выбора папки с возможностью
- поиска по имени
- создания новой папки
- задания стартовой папки
что посоветуете для Excel 2000 ?с диалогами работал, но здесь более элегантно реализовано
функция GetFileName отлично работает. Спасибо.
вместо MsgBox вставил у себя Application.Workbooks.Open ИмяФайла и порядок.
----------
Excel 2007Читайте также: