Light-electric.com

IT Журнал
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access vba filedialog

Диалоговое окно выбора файлов/папки

Часто при работе с файлами и написании кодов начинающие «кодить» в VBA сталкиваются с необходимостью предоставить пользователю возможность самостоятельного выбора файлов: либо всех в указанной папке, либо каких-то отдельных. Конечно, можно жестко в коде написать нечто вроде: «C:DocumentsFilesКнига1.xls» , но это требует не только наличия именно диска С, но и полной структуры папок и имен файлов. Это очень неудобно в большинстве случаев и куда чаще необходимо дать пользователю возможность самому указать имя файла. Записывать в ячейку листа полный путь и имя весьма непрактично и часто для неискушенного пользователя вызывает только «отторжение» от программы. В статье Просмотреть все файлы в папке я приводил пример кода, который просматривает все файлы в указанной папке и папка при этом выбирается сами пользователем из привычного по работе с Windows диалога. Там используется диалог выбора папок. Именно на этом я и хочу сделать акцент в этой статье — рассказать про некоторые способы вызова подобных диалогов для выбора файлов или папки. Так же обращу внимание на некоторые вещи, которые следует учитывать при использовании того или иного типа диалогов.

  • Диалог выбора файлов Applicaton.GetOpenFileName
  • Диалог выбора файлов FileDialog(msoFileDialogFilePicker)
  • Диалог выбора папки FileDialog(msoFileDialogFolderPicker)
  • Диалог выбора папки через Shell
  • Диалог сохранения файла SaveAs

Если рассматривать наиболее простые варианты, то их два. Выбрать файлы можно через Applicaton.GetOpenFileName или через Application.FileDialog. Отличия в них есть, но я заострю внимание на главном: GetOpenFileName будет работать в любой версии Excel, а класс FileDialog только начиная с Excel 2002, т.к. именно в этой версии впервые был использован класс FileDialog. Это стоит учитывать при разработке.

Диалог выбора файлов 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»:

Тип файлов, который будет показан по умолчанию при вызове диалога определяется свойством FilterIndex диалога FileDialog.
Важный момент: диалог, вызванный в одном сеансе Excel сохраняет добавленные ранее типы файлов. Поэтому перед назначением новых типов необходимо выполнить очистку фильтра:
.Filters.Clear

Каждый новый тип файлов добавляется новым Add:

Select or Open a file in VBA with file dialog | Access VBA

In a recent project, I was tasked with designing a program in Access where an end user could import a spreadsheet, run a sub routine in VBA and export the results.

As part of the user experience, I wanted the end user to be able to select the input spreadsheet with the file dialog tool.

UPDATE 05/22/2015: The function below contains an error handler and works well if your input has the potential to throw an error. For simplicity-sake, I have included a more compact version (short-circuited) under this one:

Compact version of File Dialog Code

Please note, you still need to include a reference to the Microsoft Office 14.0 Object Library. I have tried every trick I could find to implement late binding (bind in code without reference). I have found that you simply can’t implement without reference (early binding). If anyone out there can prove me wrong on this, please do comment.

Select Multiple Files With File Dialog

The original code from when I first built this post allowed users to select multiple files. Since VBA doesn’t do objects/arrays like other programming languages, it is difficult to make the function return an array or object. So, I built my example in a Public Sub and marked up the area that returns selected filenames with a loop. My assumption is that if you need to select multiple files in VBA, you will probably have an idea for how to implement. If you run into a wall, add a comment and we can work on a solution.

As always, please comment!

Related

Reader Interactions

Comments

when I try to use this function i get the error user defined type not defined for the line:
Dim fd As FileDialog.

I do have the office 14 objects in my list of references.

Can you help please?
Thanks.

Ryan McCormick says

Double check your line “Set fd = Application.FileDialog(msoFileDialogFilePicker)”

I am receiving a compile error (user-defined type not defined) related to the Dim fd As FileDialog line. Also- I’m interested in learning how to apply this code functionally. I’m looking to have this code by driven by a button on a form.

I need to be able to select one worksheet from the selected excel file to be imported into a specified table in my database.

Finally, I need to run an append query off of the table into which the excel data is imported and later run a separate query that deletes all of the data in the same table. Generally, I can do all of this using the macro-builder. However I don’t know how to achieve this when using a function that I coded with VBA, Thanks in advance.

Ryan McCormick says

In regards to your first question – did you add a reference to the Microsoft Office Object library? Without the reference, the functionality does not exist as there is no reference to it. You can find references in the VBA script area: Tools>References. Check the box next to the correct Office Object Library (14 if Access 2010, 15 if Access 2013).

Your next question about importing – it looks like you posted a comment on that and it worked well correct?

Your third question about running adhoc update, delete and append queries. If you don’t have the need to return a value you can use DoCmd.RunSQL “UPDATE table…”. If the function is tested and want to run it without warnings popping up, you can wrap it with DoCmd.SetWarnings False -run queries here- DoCmd.SetWarnings True.

Ryan,
Thanks for this, I was having a hard time finding a way to make this work. I ended up using your original code and that is working well. Is it possible to filter the results in the dialog so that I only see .xls (or .xlsx) files? I am also getting an error if I press cancel in the file open dialog box.

Ryan, thanks for having this posted, I was able to work through the code and fix my other issues. Not bad for a biologist pretending to be an Access database designer. .:)

Ryan McCormick says

Very cool! I am happy that you were able to make it work! I just noticed your other comment where you were getting an error when pressing cancel. When clicking cancel, the result returned is null and normally creates an error when moving to the next step of loading the file name (in this case your file name/path is value 0). An “if” statement might work for you to handle the 0 in this case:

If Format(FileName) = vbNullString Then
‘Do Nothing because returned value is zero
Else
‘Execute code because returned filename value not zero
‘Returned value should be the selected file name/path
End If

Spot on with this write-up, I absolutely believe that this amazing site needs a lot more
attention. I’ll probably be returning to read more, thanks for the info!

Hi,
How can I select multiple sheets in a workbook to import multiple tables in in access useing above procedure.

Thanks for these two functions. I did a bit of searching before finding this page. Now, my search is over.

I’m having a similar problem trying to create a button for a user menu which will allow the user to browse to the file for IMPORT. Currently i’m using the Macros within ACCESS to just have the file already in the proper place and named the proper name but that’s a bit cumbersome, but for now “its state of the art”. haha! but I need to be able to tackle this somehow. Bottom line is I have a “Particular Table” that needs this “Import” on a regular basis, but if I could just allow the user to see a Browse window then that would make it easier. My IMPORT goes right into a table called 2410 MASTER which I have to reference in ACCESS as [2410 MASTER] or course. Reason I need users to IMPORT this is because the users also routinely clear out a previous data set so that a fresh set of records can be IMPORTED for processing. ACCESS is just wonderful for all we do, but i’d sure like to have a Browse window for IMPORTING any selected Excel File regardless of its name into my [2410 MASTER] table. The reason is the user always preps the Excel file before hand and Lord knows where on earth it is or what its named by the time its ready for IMPORTING. I appreciate your genius! hahaha! I really do!

Ryan McCormick says

I wrote a post that may help you with the file select>import method:
Import Excel File to Access 2010, 2013 With File Dialog in VBA

Also, I just added a couple of sample files to the article for you to download. You can find the link at the bottom of the article.

The most important part of doing regular imports is having clean data and clean field names in your excel file (field names that match the target table in access). I have done a lot of projects like this, please let me know if you have any questions.

Bless you, brother. can’t wait to try this. I’ll let you know

Thanks Ryan!
i’m new at any level of VBA and I do my darndest to use SQL or any of my Excel knowledge or my database experience from years and years, but i’m at a zero level with vba.. lol… I’ve got a routine that already deletes my data in the table already (function on a menu, lol, for users) but I need this IMPORT button to execute what you have here. i’m guessing that I just create this function under BUILD or do I just make this as a MACRO and then the last question I just need to find the line in your code where it knows where to IMPORT the file into what table. I think I see where that is. i’m going to try to tackle this this morning. wish you were at the coffee pot and could follow me back and look over my shoulder. lol i’ll keep you posted.. here goes!

Rats! I think I see my problem. I’m using Access 2007 so I can’t set those objects from the Object Library

i’m still having trouble… I finally got Access 2013 and I tried to add the two pieces of code (vba) but i’m getting errors. I hit control g and it brings up the vba things and I check on the object library and its 15.0 already checked… then while in vba window I added another module called module1 and added the FileDialogue code… not sure if that’s what i’m supposed to do or where.. also I created a button just like you had.. the command button part cmdLoad and put the latter code there under Build.. i’m just lost, but i’m sure i’m close.. when I click the button I get Compile Error: User-Defined Type not defined then the VBA window top 2 lines of the code “function line.. and Dim line”

Ryan, I still get the Compile error: User-defined type not defined.. geeze.. I’ve downloaded your zip db and it works great, but I can’t replicate it in my db. I tell you what though.. I transferred your form, table to my db and I get the same error.. however.. if I just launch your db it works fine. lol.. the error I get then highlights the Function selectFile() Dim fs As FileDialog, filename As String…

geeze.. I know i’m close, but…

Ryan McCormick says

Did you add the Microsoft Object Library as a reference? Open your VBA environment, click on the tools menu and select references. Check the box next to the Microsoft Office XX.0 Object Library, save and see if that works.

Ryan McCormick says

Oops, I just noticed your comment from the 14th. On second thought, you might want to check any of the data types you defined in the process. Check variables (example Dim myName as String) where you could be mixing a variant or something.

Как загрузить данные из текстового файла на VBA Access в базу MS SQL Server 2008

Иногда возникает необходимость загрузить данные именно из текстового файла в базу MSSql 2008, используя при этом VBA Access 2003, т.е. не просто разово загружать данные, а реализовать это так чтобы пользователь смог это делать сам, используя интерфейс клиента, а именно Access 2003. Поэтому сегодня мы рассмотрим один вариант, как можно загрузить данные из текстового файла в MSSql 2008, используя VBA Access.

И начать хотелось бы с того, что мы с Вами уже рассматривали примеры загрузки данных в базу MSSql 2008 через интерфейс Access, правда, из Excel файла, если Вы не читали то советую для начала прочитать вот этот материал «Access – Импорт данных в базу MSSql 2008». Также, если кого интересует, как можно выгрузить данные из базы MSSql 2008 используя интерфейс Access, причем не просто выгрузить, а выгрузить в шаблон Word или Excel то это мы рассматривали вот здесь «Выгрузка данных из Access в шаблон Word и Excel».

И так приступим, сперва давайте разберем исходные данные и обрисуем задачу, которую нам необходимо выполнить.

Задача — Загрузить данные в базу из текстового файла

Имеется клиент adp проект Access, работает в связке с MSSql 2008. Возникала необходимость загружать данные из текстового файла, который имеет специфическую структуру, например (данные конечно выдуманные)

Примечание! Для удобства я использую редактор текстовых файлов Notepad ++, его преимущества мы рассматривали в статье — Чем хорош Notepad++

Как видите текстовый файл необычный, но из него необходимо получить данные вида

Как Вы понимаете представить их в табличном виде. Т.е. «Начало» и «Конец» это граница строки.

И для начала необходимо создать таблицу, в которую Вы будете грузить наши данные, я создал таблицу test_import, вот код:

Далее напишем код на VBA, который будет загружать эти данные в том виде, в котором нам нужно. Для начала на форме создадим элемент управления «Кнопка», Вы же можете использовать свой интерфейс, это не принципиально, например

Далее в событие «Нажатие кнопки» вставьте следующий код (его, как обычно я подробно прокомментировал):

Код VBA для импорта данных из текстового файла

Вот и все, теперь сохраняете форму, открываете ее и нажимаете кнопку «Импорт» (как у меня) выбираете файл и данные уже в базе. Проверяете данные путем написания простого sql запроса (Основы языка SQL – оператор select):

Надеюсь, данный пример загрузки данных из текстового файл окажется полезным. Удачи в освоении программирования на VBA Access.

Заметка! Если Вас интересует SQL и T-SQL, рекомендую пройти наши курсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.

использование Application.FileDialog для переименования файла в VBA

Используя VBA. Мой скрипт перемещает файл в каталог. Если это имя файла уже существует в целевом каталоге, я хочу, чтобы пользователю было предложено переименовать исходный файл (тот, который перемещается) до выполнения перемещения.

Поскольку я хочу, чтобы пользователь знал, какие другие файлы уже находятся в каталоге (поэтому они не выбирают имя другого файла, который уже есть), моя идея состоит в том, чтобы открыть окно FileDialog, перечисляющее содержимое каталога, чтобы пользователь мог использовать собственную возможность переименования окна FileDialog. Затем я буду зацикливать этот FileDialog, пока имена исходного и целевого файлов больше не будут одинаковыми.

Вот пример кода:

Но когда я переименовываю file2 и нажимаю ‘OK’, я получаю сообщение об ошибке:

а затем переход в отладчик показывает, что значение file2.name равно .

Я не уверен, что здесь происходит-ссылка на объект теряется после переименования файла? Есть ли более простой способ позволить пользователю переименовать из диалогового окна, которое показывает все файлы в целевом каталоге? Я также хотел бы предоставить новое имя по умолчанию для файла, но я не вижу, как бы я сделал это с помощью этого метода.

edit: на данный момент я изучаю создание UserForm с listbox, который заполняется w/ соответствующими именами файлов и полем ввода со значением по умолчанию для ввода нового имени. Однако я все еще не уверен, как сохранить ссылку на объект после переименования файла.

2 Ответа

Вот пример использования Application.FileDialog для возврата имени файла, выбранного пользователем. Возможно, это поможет, так как он демонстрирует получение значения, предоставленного пользователем.

EDIT: изменено, чтобы быть диалогом «Save As» вместо диалога «File Open».

Правка вторая: основываясь на комментариях, я собрал образец, который, похоже, делает именно то, что вы хотите. Конечно, вам придется изменить назначение переменных, если вы не хотите копировать один и тот же файл из «D:Temp» в «D:TempBackup» снова и снова. 🙂

Вот какой-то очень быстрый код, который я придумал, но в основном смотрит на него под другим углом. Вы можете поместить combobox в форму пользователя и заставить ее перечислить элементы в виде типов пользователей. Не очень красиво, но это начало для вас, чтобы сделать более крепким. Я жестко закодировал каталог c: здесь, но это может быть сделано из текстового поля

Надеюсь, это поможет. On error resume next не самое лучшее что можно сделать но в этом примере он перестает ошибаться если у варианта нет файлов

Похожие вопросы:

Я запускаю Excel 2011 на Mac, и одно из моих приложений, которое работает на версиях windows, не работает на моем Mac. Он не может найти метод FileDialog в Application.FileDialog. Я использую ссылки.

Я пытаюсь научить себя VBA во время короткого отпуска. Для моего первого модуля я хочу создать модуль, который выполняет следующие действия: Отображает диалоговое окно. Предлагает пользователю.

Я пишу макрос VBA для Outlook, и метод Application.FileDialog недоступен. Цель состоит в том, чтобы пользователь выбрал папку-не папку Outlook email, а папку каталога файловой системы. Вот ссылки.

Быстрый вопрос, у меня есть простой бит кода, который позволяет пользователю нажать на textbox и найти местоположение нужного файла. Однако, могу ли я получить это так, чтобы при появлении.

Как использовать File::Copy для переименования расширения файла? До сих пор я могу добавить расширение. Мне нужно заменить расширение файла вместо этого. Пример: От myfilename.txt до myfilename.dat.

я видел этот раздел Как показать диалог «Open File» в Access 2007 VBA? и мне нравится решение, которое не использует ссылки, однако я не могу понять, как отобразить путь к файлу, который.

Пара вопросов Является ли поддержка Application.Filedialog(msoFileDialogSaveAs) в Mac excel 2011 vba? Разница между Application.Filedialog(msoFileDialogSaveAs) и Application.Dialogs(xlDialogSaveAs)?

Скажем, вы хотите иметь кнопку, которую пользователь может нажать и сохранить копию текущего файла как PDF ( документация ): Application.ActiveDocument.SaveAs2 fileName:=fileName.pdf.

Переименование файлов часто требуется при работе с приложениями Microsoft Office Suite (Word, Excel, PowerPoint). Обычно “Files > Save as” позволяет переименовать файл, но он также создает.

Access vba filedialog

Перевести · Remarks. The msoFileDialogOpen and msoFileDialogSaveAs constants are not supported in Microsoft Access.. Example. This example illustrates how to use the FileDialog

How to show «Open File» Dialog in Acces…

Перевести · How would I go about showing an open file (or file select) dialog in access 2007 VBA? I have tried using Application.GetOpenFileName as I would in Excel, but this function doesn’t exist in Access.

FileDialog object (Office) | Microsoft D…

Перевести · Therefore, many of the properties of the FileDialog object persist even when you create multiple FileDialog objects. Therefore, make sure that you set all of the properties appropriately for your purpose before you display the dialog box. Example. To display a file dialog box by using the FileDialog

Видео

FileDialog Property — Access

Перевести · The msoFileDialogOpen and msoFileDialogSaveAs constants are not supported in Microsoft Office Access 2007. Example. This example illustrates how to use the FileDialog

VBA FileDialog | How to Open Files Dialog Bo…

Перевести · Excel VBA FileDialog. In VBA there are certain circumstances where we want the data from any other file or any other worksheet and as VBA is used to automate our work, we can open different other files using VBA and it is done by using the Filedialog

VBA FileDialog | How to Use FileDialog Objec…

Перевести · Excel VBA FileDialog – Example #2. Now let us see another option of the VBA FileDialog object which is msoFileDialogSaveAs. This property is used to save a file on any path. Follow the below steps to use excel VBA FileDialog

Свойство FileDialog (Окно файла) — Access

Замечания. Константы msoFileDialogOpen и msoFileDialogSaveAs не поддерживаются в Microsoft Office Access 2007.. Пример. Данный пример показывает, как использовать объект FileDialog

Open Files with VBA FileDialog msoFileDia…

Перевести · Combine the VBA FileDialog object with msoFileDialogOpen to open files in Excel. This tutorial takes a look at the properties and methods of the msoFileDialogOpen VBA

VBA FileDialog — Opening, Selecting a…

Перевести · 07.04.2016 · Often in VBA we need to ask the users to select files or directories before we execute the actual functionality of our macro. Welcome to the VBA Open file dialog post. Today we will learn how to use the Application.FileDialog

Использование объекта FileDialog

Использование объекта FileDialog? / Microsoft Access / Нашел в коллекции Application объект FileDialog. И еще к нему пример использования в VBA:Dim dlgOpen As FileDialog Set dlgOpen = Application.FileDialog

Читать еще:  Базовый объект ms access это
Ссылка на основную публикацию
Adblock
detector