Vba диалоговое окно выбора файла
В процессе выполнения этого кода VBA Excel открывается диалог с заголовком по умолчанию «Открытие файла» и возможностью выбора любого файла. При нажатии на кнопку «Открытие» полное имя выбранного файла запишется в ячейку «A1». При нажатии на кнопку «Отмена» или кнопку закрытия формы в ячейку «A1» запишется строка «Ложь».
Открытие диалога с заголовком «Выбор файла»:
Range ( "A1" ) = Application . GetOpenFilename ( , , "Выбор файла" )Открытие диалога выбора файлов с указанием одного фильтра:
Range ( "A1" ) = Application . GetOpenFilename ( "Файлы Excel 97-2003,*.xls" , , "Выбор файла" )Фильтр в этом коде VBA Excel представляет из себя пару: наименование фильтра и строка из знака подстановки «*» с расширением отбираемых файлов, разделенных «,». В данном случае в открытом диалоге будут видны файлы с расширением «.xls». Таких пар может быть несколько, как в следующем примере.
Открытие диалога выбора файлов с указанием трех фильтров файлов:
( "Файлы Excel 97-2003,*.xls,Текстовые файлы,*.txt,Рисунки,*.jpg" , , "Выбор файла" )Выбрать один из фильтров можно из раскрывающегося списка диалога выбора файлов «Тип файлов».
Для справки:
Application.GetOpenFilename («Фильтры», номер, «Заголовок диалога»)
Аргумент номер — это номер по порядку фильтра в списке, отображаемого по умолчанию. Если номер отсутствует или превышает количество фильтров, то по умолчанию отображается первый в списке.
Стартовая папка диалога выбора файлов
При открытии стандартного диалога выбора файлов «Application.GetOpenFilename» по умолчанию, как стартовая, выбирается папка «Мои документы» в Windows XP, «Документы» в Windows 8, но, при желании, можно задать, как стартовую, и любую другую папку.
Для этого можно воспользоваться операторами ChDrive (смена текущего диска) и ChDir (смена текущего каталога). По умолчанию текущим является диск «С» в Windows XP, поэтому, если ваша папка находится на этом диске, то ChDrive можно пропустить.
Пример 1
Проверяем, какая папка является стартовой по умолчанию. При вызове процедуры из первого примера диалог откроется именно на этой папке. Если выбрать файл, в ячейку «A1» запишется полный путь к нему, а при отмене выбора, запишется «Ложь».
Функции 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
В этой заметке описываются методы создания пользовательских диалоговых окон, которые существенно расширяют стандартные возможности Excel. Диалоговые окна – это наиболее важный элемент пользовательского интерфейса в Windows. Они применяются практически в каждом приложении Windows, и большинство пользователей неплохо представляет, как они работают. Разработчики Excel создают пользовательские диалоговые окна с помощью пользовательских форм (UserForm). Кроме того, в VBA имеются средства, обеспечивающие создание типовых диалоговых окон.[1]
Рис. 1. Работа процедуры GetName
Перед тем как приступить к изучению тонкостей создания диалоговых окон на основе пользовательских форм, следует научиться использовать некоторые встроенные инструменты Excel, предназначенные для вывода диалоговых окон.
Использование окон ввода данных
Окно ввода данных — это простое диалоговое окно, которое позволяет пользователю ввести одно значение. Например, можно применить окно ввода данных, чтобы предоставить пользователю возможность ввести текст, число или диапазон значений. Для создания окна ввода предназначены две функции InputBox: одна— в VBA, а вторая является методом объекта Application.
Функция InputBox в VBA
Функция имеет следующий синтаксис:
InputBox(запрос [, заголовок] [, по_умолчанию] [, xpos] [, ypos] [, справка, раздел])
- Запрос. Указывает текст, отображаемый в окне ввода (обязательный параметр).
- Заголовок. Определяет заголовок окна ввода (необязательный параметр).
- По_умолчанию. Задает значение, которое отображается в окне ввода по умолчанию (необязательный параметр).
- xpos, ypos. Определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
- Справка, раздел. Указывают файл и раздел в справочной системе (необязательные параметры).
Функция InputBox запрашивает у пользователя одно значение. Она всегда возвращает строку, поэтому результат нужно будет преобразовать в числовое значение. Текст, отображаемый в окне ввода, может достигать 1024 символов (длину допускается изменять в зависимости от ширины используемых символов). Если определить раздел справочной системы, то в диалоговом окне будет отображена кнопка Справка.
Обратите внимание: функция InputBox вызывается в цикле Do Until. Это позволяет убедиться в том, что данные введены в окно. Если пользователь щелкнет на кнопке Отмена или не введет текст, то переменная UserName будет содержать пустую строку, а окно ввода данных появится повторно. Далее в процедуре будет предпринята попытка получить имя пользователя путем поиска первого символа пробела (для этого применяется функция InStr). Таким образом, можно воспользоваться функцией Left для получения всех символов, расположенных слева от символа пробела. Если символ пробела не найден, то используется все введенное имя.
Если строка, предоставленная в качестве результата выполнения функции InputBox, выглядит как число, ее можно преобразовать с помощью функции VBA Val.
В процедуре GetWord пользователю предлагается ввести пропущенное слово (рис. 2). Этот пример также иллюстрирует применение именованных аргументов (р и t). Текст запроса выбирается из ячейки А1 рабочего листа.
Рис. 2. Использование функции VBA inputBox, отображающей запрос
Метод Excel InputBox
Метод Excel InputBox по сравнению с функцией VBA InputBox предоставляет три преимущества:
- возможность задать тип возвращаемого значения;
- возможность указать диапазон листа путем выделения с помощью мыши;
- автоматическая проверка правильности введенных данных.
Метод InputBox имеет следующий синтаксис.
InputBox(запрос, [, заголовок], [, по_умолчанию], [, слева], [, сверху], [, справка, раздел], [, тип])
- Запрос. Указывает текст, отображаемый в окне ввода (обязательный параметр).
- Заголовок. Определяет заголовок окна ввода (необязательный параметр).
- По_умолчанию. Задает значение, которое отображается в окне ввода по умолчанию (необязательный параметр).
- Слева, сверху. Определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
- Справка, раздел. Указывают файл и раздел в справочной системе (необязательные параметры).
- Тип. Указывает код типа данных, который будет возвращаться методом (необязательный параметр; значения см. рис. 3).
Рис. 3. Коды типов данных, возвращаемые методом Excel InputBox
Используя сумму приведенных выше значений, можно возвратить несколько типов данных. Например, для отображения окна ввода, которое принимает текстовый или числовой тип данных, установите код равным 3 (1 + 2 или число + текст). Если в качестве кода типа данных применить значение 8, то пользователь сможет ввести в поле адрес ячейки или диапазона ячеек. Пользователь также можент выбрать диапазон на текущем рабочем листе.
В процедуре EraseRange используется метод InputBox. Пользователь может указать удаляемый диапазон (рис. 4). Адрес диапазона вводится в окно вручную, или выделяется мышью на листе. Метод InputBox с кодом 8 возвращает объект Range (обратите внимание на ключевое слово Set). После этого выбранный диапазон очищается (с помощью метода Clear). По умолчанию в поле окна ввода отображается адрес текущей выделенной ячейки. Если в окне ввода щелкнуть на кнопке Отмена, то оператор On Error завершит процедуру.
Рис. 4. Пример использования метода InputBox для выбора диапазона
Рис. 5. Метод InputBox автоматически проверяет вводимые данные
Функция VBA MsgBox
MsgBox(запрос[, кнопки][, заголовок][, справка, раздел])
Рис. 6. Константы и значения, используемые для выбора кнопок в функции MsgBox
Рис. 7. Константы, возвращаемые MsgBox
Функция MsgBox возвращает переменную, имеющую тип Integer. Вам необязательно использовать переменную для хранения результата выполнения функции MsgBox. Следующая процедура представляет собой вариацию процедуры GetAnswer.
В файле VBA msgbox.xlsm функция ContinueProcedure в демонстрационных целях представлена в виде процедуры. Функция ContinueProcedure может вызываться из другой процедуры. Например, оператор
If Not ContinueProcedure() Then Exit Sub
Метод Excel GetOpenFilename
Если приложению необходимо получить от пользователя имя файла, то можно воспользоваться функцией InputBox, но этот подход часто приводит к возникновению ошибок. Более надежным считается использование метода GetOpenFilename объекта Application, который позволяет удостовериться, что приложение получило корректное имя файла (а также его полный путь). Данный метод позволяет отобразить стандартное диалоговое окно Открытие документа, но при этом указанный файл не открывается. Вместо этого метод возвращает строку, которая содержит путь и имя файла, выбранные пользователем. По окончании данного процесса с именем файла можно делать все что угодно. Синтаксис (все параметры необязательные):
Application.GetOpenFilename(фильтр_файла, индекс_фильтра, заголовок, множественный_выбор)
- Фильтр_файла. Содержит строку, определяющую критерий фильтрации файлов (необязательный параметр).
- Индекс_фильтра. Указывает индексный номер того критерия фильтрации файлов, который используется по умолчанию (необязательный параметр).
- Заголовок. Содержит заголовок диалогового окна (необязательный параметр). Если этот параметр не указать, то будет использован заголовок Открытие документа.
- Множественный_выбор. Необязательный параметр. Если он имеет значение ИСТИНА, можно выбрать несколько имен файлов. Имя каждого файла заносится в массив. По умолчанию данный параметр имеет значение ЛОЖЬ.
Аргумент Фильтр_файла определяет содержимое раскрывающегося списка Тип файлов, находящегося в окне Открытие документа. Аргумент состоит из строки, определяющей отображаемое значение, а также строки действительной спецификации типа файлов, в которой находятся групповые символы. Оба элемента аргумента разделены запятыми. Если этот аргумент не указывать, то будет использовано значение, заданное по умолчанию: " Все файлы (*.*),*.* " . Первая часть строки Все файлы (*.*) – то текст, отображаемый в раскрывающемся списке тип файлов. Вторая часть строки *.* указывает тип отображаемых файлов.
В следующих инструкциях переменной Filt присваивается строковое значение. Эта строка впоследствии используется в качестве аргумента фильтр_файла метода GetOpenFilename. В данном случае диалоговое окно предоставит пользователю возможность выбрать один из четырех типов файлов (кроме варианта Все файлы). Если задать значение переменной Filt, то будет использоваться оператор конкатенации строки VBA. Этот способ упрощает управление громоздкими и сложными аргументами.
В следующем примере у пользователя запрашивается имя файла. При этом в поле типа файлов используются пять фильтров (код содержится в файле prompt for file.xlsm).
На рис. 11 показано диалоговое окно, которое выводится на экран после выполнения этой процедуры (по умолчанию предлагается фильтр *.csv).
Рис. 11. Метод GetOpenFilename отображает диалоговое окно, в котором выбирается файл
Обратите внимание: переменная FileName определена как массив переменного типа (а не как строка в предыдущем примере). Причина заключается в том, что потенциально FileName может содержать массив значений, а не только одну строку.
Метод Excel GetSaveAsFilename
Данный метод отображает диалоговое окно Сохранение документа и дает пользователю возможность выбрать (или указать) имя сохраняемого файла. В результате возвращается имя файла, но никакие действия не предпринимаются. Синтаксис (все параметры необязательные):
Application.GetSaveAsFilename(начальное_имя, фильтр_файла, индекс_фильтра, заголовок, текст_кнопки)
- Начальное_имя. Указывает предполагаемое имя файла.
- Фильтр_файла. Содержит критерий фильтрации отображаемых в окне файлов.
- Индекс_фильтра. Код критерия фильтрации файлов, который используется по умолчанию.
- Заголовок. Определяет текст заголовка диалогового окна.
Получение имени папки
With Application . FileDialog ( msoFileDialogFolderPicker )Объект FileDialog позволяет определить начальную папку путем указания значения свойства InitialFileName. В примере в качестве начальной папки применяется путь к файлам Excel, заданный по умолчанию.
Отображение диалоговых окон Excel
Создаваемый вами код VBA может вызывать на выполнение многие команды Excel, находящиеся на ленте. И если в результате выполнения команды открывается диалоговое окно, ваш код может делать выбор в диалоговом окне (даже если само диалоговое окно не отображается). Например, следующая инструкция VBA эквивалентна выбору команды Главная –> Редактирование –> Найти и выделить –> Перейти и указанию диапазона ячеек А1:СЗ с последующим щелчком на кнопке ОК. Но само диалоговое окно Переход при этом не отображается (именно это и нужно).
Application.Goto Reference:=Range( " А1:СЗ " )
Иногда же приходится отображать встроенные окна Excel, чтобы пользователь мог сделать свой выбор. Для этого используется коллекция Dialogs объекта Application. Учтите, что в настоящее время компания Microsoft прекратила поддержу этого свойства. В предыдущих версиях Excel пользовательские меню и панели инструментов создавались с помощью объекта CommandBar. В версиях Excel 2007 и Excel 2010 этот объект по-прежнему доступен, хотя и работает не так, как раньше. Начиная с версии Excel 2007 возможности объекта CommandBar были существенно расширены. В частности, объект CommandBar можно использовать для вызова команд ленты с помощью VBA. Многие из команд, доступ к которым открывается с помощью ленты, отображают диалоговое окно. Например, следующая инструкция отображает диалоговое окно Вывод на экран скрытого листа (рис. 12; см. также файл ribbon control names.xlsm):
Рис. 12. Диалоговое окно, отображаемое в результате выполнения указанного выше оператора
Метод ExecuteMso принимает лишь один аргумент, idMso, который представляет элемент управления ленты. К сожалению, сведения о многих параметрах в справочной системе отсутствуют.
В результате выполнения следующего оператора отображается вкладка Шрифт диалогового окна Формат ячеек:
На самом деле пользоваться объектами CommandBar не стоит, поскольку вряд ли они будут поддерживаться в будущих версиях Excel.
Отображение формы ввода данных
Многие пользователи применяют Excel для управления списками, информация в которых ранжирована по строкам. В Excel поддерживается простой способ работы с подобными типами данных с помощью встроенных форм ввода данных, которые могут создаваться автоматически. Подобная форма предназначена для работы как с обычным диапазоном, так и с диапазоном, оформленным в виде таблицы (с помощью команды Вставка –> Таблицы –> Таблица). Пример формы ввода данных показан на рис. 13 (см. также файл data form example.xlsm).
Рис. 13. Некоторые пользователи предпочитают применять встроенные формы ввода данных Excel для ввода сведений; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке
В силу каких-то неизвестных причин на ленте Excel отсутствует команда, обеспечивающая доступ к форме ввода данных. Подобную команду можно добавить на панель быстрого доступа. Для этого выполните следующие действия.
- Щелкните правой кнопкой мыши на панели быстрого доступа и в контекстном меню выберите параметр Настройка панели быстрого доступа.
- На экране появится вкладка Панель быстрого доступа диалогового окна Параметры Excel.
- В раскрывающемся списке Выбрать команды из выберите параметр Команды не на ленте.
- В появившемся списке выберите параметр Форма.
- Щелкните на кнопке Добавить для добавления выбранной команды на панель быстрого доступа.
- Щелкните на кнопке ОК для закрытия диалогового окна Параметры Excel.
После выполнения перечисленных выше действий на панели быстрого доступа появится новый значок.
Для работы с формой ввода данных следует структурировать данные таким образом, чтобы Excel распознавал их в виде таблицы. Начните с указания заголовков столбцов в первой строке диапазона вводимых данных. Выделите любую ячейку в таблице и щелкните на кнопке Форма панели быстрого доступа. Excel отображает диалоговое окно, в котором будут вводиться данные. Для перемещения между текстовыми полями в целях ввода информации используйте клавишу <Tab>. Если ячейка содержит формулу, результат вычислений отображается в виде текста (а не в формате поля ввода данных). Другими словами, невозможно изменить формулы с помощью формы ввода данных.
По завершении ввода данных в форму щелкните на кнопке Создать. После этого Excel вводит данные в строку рабочего листа, а также очищает диалоговое окно для ввода следующей строки данных.
Используйте метод ShowDataForm для отображения формы ввода данных Excel. Единственное требование заключается в том, что активная ячейка должна находиться в диапазоне. Следующий код активизирует ячейку А1 (в таблице), а затем отображает форму ввода данных.
Во время работы могут быть некоторые сценарии, когда нам нужно открывать некоторые другие рабочие книги или любые другие файлы либо для импорта данных, либо для получения ссылки. Есть один способ указать путь к файлу в нашем коде в VBA, который откроет нам файл или папку. Но что, если мы не помним путь, как мы можем открыть файл. Возможно, нам придется сначала найти путь, а затем снова указать путь. VBA поставляется с решением, которое называется FileDialog.
FileDialog - это свойство в VBA, которое позволяет нам открывать файл или папку по пути. Используя это свойство, пользователю не нужно указывать путь к папке, вместо этого пользователь может выбрать путь. Кроме того, FileDialog имеет четыре свойства. Они также известны как константы для этого свойства. Они заключаются в следующем:
- msoFileDialogFilePicker : это позволяет пользователю выбрать файл.
- msoFileDialogFolderPicker : это позволяет пользователю выбрать папку.
- msoFileDialogOpen : это позволяет пользователю открыть файл.
- msoFileDialogSaveAs: позволяет пользователю сохранить файл.
Способ использования этого объекта в VBA заключается в следующем.
Application.FIledialog (тип Filedialog)
Тип FileDialog может быть любым из четырех указанных выше типов. Теперь давайте использовать этот объект в примерах, чтобы более подробно узнать об этом свойстве объекта.
Как использовать Excel VBA FileDialog?
Ниже приведены различные примеры использования FileDialog в Excel с использованием кода VBA.
Вы можете скачать этот шаблон VBA FileDialog Excel здесь - Шаблон VBA FileDialog Excel
Excel VBA FileDialog - Пример № 1
Во-первых, давайте поможем пользователю выбрать файл из пункта назначения. В этом примере пользователь выберет файл из папки, и мы отобразим путь для выбранного файла.
Для использования Excel VBA FileDialog выполните следующие действия:
Шаг 1. Перейдите на вкладку « Разработчики » и нажмите на Visual Basic.
Шаг 2: Откройте модуль из меню «Вставка», как показано ниже.
Шаг 3: Запустите подпроцедуру, чтобы начать работать над примером.
Код:
Шаг 4: Объявите переменную как Filedialog, как показано ниже.
Код:
Шаг 5: Теперь давайте используем этот объект из метода Application.Filedialog следующим образом.
Шаг 6: Как только мы откроем скобки, мы увидим опцию для четырех типов FileDialog, как показано на рисунке ниже.
Шаг 7: выберите опцию типа Filedialog как msoFileDialogFilePicker
Код:
Шаг 8: Теперь нам нужно сделать диалоговое окно для этого примера, давайте использовать With Statement следующим образом.
Код:
Шаг 9: Если есть какие-либо фильтры, нам нужно очистить фильтры, поставить оператор точки и написать оператор, как показано ниже.
Код:
Шаг 10: Теперь мы хотим, чтобы пользователь выбрал несколько файлов одновременно или один файл? Для этого примера давайте придерживаться одного файла за раз, поэтому используйте .Allowmultiselect как false.
Код:
Шаг 11: Теперь, чтобы показать диалоговое окно, мы можем написать .show, чтобы показать диалоговое окно следующим образом.
Код:
Шаг 12: Как только мы выполним приведенный выше код, мы увидим диалоговое окно следующим образом.
Шаг 13: Поскольку нам нужно отобразить выбранный путь пользователя, объявите другую переменную в виде строки в коде.
Код:
Шаг 14: Мы будем использовать оператор selecteditems, чтобы найти путь к файлу выбранного пользователя и сохранить его в нашей переменной следующим образом.
Код:
Шаг 15: После оператора With используйте функцию msgbox, чтобы отобразить адрес выбранного файла.
Код:
Шаг 16. Запустите приведенный выше код, выберите файл и нажмите ОК, чтобы увидеть путь следующим образом.
Excel VBA FileDialog - Пример № 2
Теперь давайте посмотрим на другую опцию объекта VBA FileDialog, которая называется msoFileDialogSaveAs. Это свойство используется для сохранения файла по любому пути. Выполните следующие шаги, чтобы использовать Excel VBA FileDialog.
Шаг 1: В том же модуле напишем еще одну подпроцедуру для сохранения файла следующим образом.
Код:
Шаг 2: Теперь объявите две переменные, одну как строку, а другую как целое число.
Код:
Шаг 3: Теперь давайте сделаем диалоговое окно видимым для пользователя, используя свойство show следующим образом.
Код:
Шаг 4: Теперь используйте оператор IF, чтобы определить выбор пользователя следующим образом.
Код:
Шаг 5: Теперь давайте получим путь, выбранный пользователем в нашей переменной пути, следующим образом.
Код:
Шаг 6: Теперь давайте отобразим результат с помощью функции msgbox и завершим цикл IF.
Код:
Шаг 7: Теперь выполните приведенный выше код и увидите результат, откроется диалоговое окно для сохранения файла.
Шаг 8: дайте имя файла и нажмите «Сохранить», чтобы получить путь к файлу следующим образом.
То, что нужно запомнить
- FileDialog является свойством объекта VBA.
- Нам не нужно указывать путь к коду, используя этот объект.
- Используя оператор точки, мы можем видеть и использовать свойства объекта IntelliSense.
Рекомендуемые статьи
Это руководство по VBA FileDialog. Здесь мы обсудим, как использовать объект FileDialog в Excel, используя код VBA, а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи -
Читайте также: