Remkomplekty.ru

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

Vba excel 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:

File and Folder Dialog Boxes

The Types of File and Folder Dialog Box

There are four possible choices you can make when displaying a file or folder dialog box:

There are actually really only 2 choices. The first, third and fourth options above all display a dialog box for choosing a file; the second displays a dialog box for choosing a folder. In particular, note that just because you’re using an msoFileDialogOpen dialog box, for example, doesn’t mean that Excel will then open any file you pick (it’s still up to you to do that in code).

Displaying a Vanilla File Dialog Box

The basic code to create and display a file dialog box involves applying the FileDialog method to the Application object:

Dim fd As FileDialog

Set fd = Application.FileDialog(msoFileDialogFilePicker)

‘get the number of the button chosen

Dim FileChosen As Integer

If FileChosen <> -1 Then

‘didn’t choose anything (clicked on CANCEL)

MsgBox «You chose cancel»

‘display name and path of file chosen

This would display a basic dialog box. If a user then chose a file, the macro would display its name:

The first element of the SelectedItems array shows the name of the one and only file chosen.

Notice how VBA inconsistently denotes the first item in the array of selected files with the number 1, not 0.

Making a File or Folder Dialog Box Prettier

Now that we’ve created a basic dialog box, let’s look at how to tart it up a bit (a good UK English expression that — wonder how well it travels . ). The diagram below shows that you can change:

  1. The caption of the dialog box (here to Example of choosing file)
  2. The initial folder selected (here to c:Wise Owl)
  3. The view of your files (this one is msoFileDialogViewSmallIcons)
  4. The filter used (here we’re just looking for Excel macro workbooks)
  5. The text on the Open button (here it’s Choose owly file)

Here’s the dialog box:

A prettified file dialog box!

Here is the code which would make this work, with comments to explain the various properties set:

Dim fd As FileDialog

Set fd = Application.FileDialog(msoFileDialogFilePicker)

‘the number of the button chosen

Dim FileChosen As Integer

‘1) To set the caption of the dialog box,

‘ set the Title property

fd.Title = «Example of choosing file»

‘2) Set the oddly named InitialFileName property to

‘ determine the initial folder selected

fd.InitialFileName = «c:wise owl»

‘3) Set the InitialView property to control how your files

‘ appear on screen (as a list, icons, etc.)

‘4) To set the filters (you can have as many as you like)

‘ first clear any existing ones, then add them one by one

fd.Filters.Add «Excel macros», «*.xlsm»

‘ if there’s more than one filter, you can control which

‘ one is selected by default

‘5) Set the ButtonName property to control the text on

‘ the OK button (the ampersand means the following

‘ letter is underlined and choosable with the ALT key)

fd.ButtonName = «Choose &owly file»

If FileChosen <> -1 Then

‘didn’t choose anything (clicked on CANCEL)

MsgBox «You chose cancel»

‘display name and path of file chosen

The button name won’t appear — oddly — until you’ve clicked on a file first.

A FileDialog Example — Choosing a File to Open

The following macro would allow you to choose an Excel workbook to open, and then open it:

Dim fd As FileDialog

Dim FileName As String

Set fd = Application.FileDialog(msoFileDialogOpen)

‘the number of the button chosen

Dim FileChosen As Integer

fd.Title = «Choose workbook»

fd.InitialFileName = «c:wise owl»

‘show Excel workbooks and macro workbooks

fd.Filters.Add «Excel workbooks», «*.xlsx»

fd.Filters.Add «Excel macros», «*.xlsm»

fd.ButtonName = «Choose this file»

If FileChosen <> -1 Then

‘didn’t choose anything (clicked on CANCEL)

MsgBox «No file opened»

‘get file, and open it (NAME property

‘includes path, which we need)

Notice that although here we used the msoFileDialogOpen dialog type to choose a workbook, this didn’t automatically open it!

That’s most of the story on FileDialogs — in the final part of this blog, we’ll consider how to work with multiple files.

Vba excel filedialog

There may be times when you need to ask the user to select a location to save a file. This can be done using the save file dialog. Keep in mind that the save file dialogs doesn’t actually save anything. It only returns the full path the user has selected to save the file.

The method for creating the save file dialog explained in this article uses the command FileDialog(msoFileDialogSaveAs). It has only one problem. You can’t apply file type filters. If file type filters are essential, there are 2 things you could do:

  1. If you are using VBA for Excel, you could use the method described in the article, Excel VBA Save File Dialog, GetSaveAsFilename()
  2. If you are not using VBA for Excel you will have to use windows API, please see MSDN, Microsoft Display Open and Save As Dialog Boxes in Access with API Functions.

You can download the file and code related to this article here.

Example:

In this example a dialog will open asking the user to select a location to save the file. The path selected will be displayed in a message box:

Sub Example1()
Dim intChoice As Integer
Dim strPath As String

‘make the file dialog visible to the user
intChoice = Application.FileDialog(msoFileDialogSaveAs).Show
‘determine what choice the user made
If intChoice <> 0 Then
‘get the file path selected by the user
strPath = _
Application.FileDialog(msoFileDialogSaveAs).SelectedItems(1)
‘displays the result in a message box
Call MsgBox(strPath, vbInformation, «Save Path»)
End If
End Sub

The following details were selected to save the file:

  • File Name: “Test”
  • File Path: “D:Temp”
  • File Type: Excel Workbook (*.xlsx)

The resulting path is displayed in a message box:

Custom Title:

By default the title of the Save File Dialog is “File Save”:

Using the .Title property you can set a custom title for the dialog. In the example below the title “Random Title For Dialog” will be used:

Sub Example2()
Dim intChoice As Integer

‘change the display name of the save file dialog
Application.FileDialog(msoFileDialogSaveAs).Title = _
«Random Title For Dialog»
‘make the file dialog visible to the user
intChoice = Application.FileDialog(msoFileDialogSaveAs).Show
‘determine what choice the user made
If intChoice <> 0 Then
‘your code here
End If
End Sub

Start Folder Path, InitialFileName:

Lets say there is a specific folder we would want the dialog to start in. This could be set by the InitialFileName property. In the example below the save file dialog will start in the directory “D:TempFolder to Start”:

Sub Example3()
Dim intChoice As Integer

‘Select the start folder
Application.FileDialog(msoFileDialogSaveAs).InitialFileName _
= «D:TempFolder to Start»
‘make the file dialog visible to the user
intChoice = Application.FileDialog(msoFileDialogSaveAs).Show
‘determine what choice the user made
If intChoice <> 0 Then
‘your code here
End If
End Sub

Filter File Types, Filters:

Unlike the Open File Dialog where you could change the file type filters, the save file dialog will generate an error if you try to modify the file type filters. As explained at the start of this article if file filters are essential, there are 2 options you could consider:

  • If you are using VBA for Excel, you could use the method described in the article, Excel VBA Save File Dialog, GetSaveAsFilename()
  • If you are not using VBA for Excel you will have to use windows API, please see MSDN, Microsoft Display Open and Save As Dialog Boxes in Access with API Functions.

You can download the file and code related to this article here.

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.

Excel VBA, используя FileDialog для открытия нескольких книг и ссылки на них

В настоящее время я использую следующий код, чтобы запросить у пользователя книгу, открыть ее, получить некоторую информацию из нее, а затем закрыть ее. на данный момент я обращаюсь к открытой книге, используя коллекцию workbooks with and index («woorkbooks(2)»). Теперь мне нужно открыть две книги, и моя проблема заключается в том, что я не знаю, какая из книг будет индексироваться как 2, а какая-как 3. Итак, я решил, что должен быть способ получить ссылку на каждую книгу.

Теперь я видел некоторые решения этой проблемы, связанные с получением полного пути каждой книги, но я бы предпочел не использовать полный путь, поскольку он содержит слова на другом языке (и имя книги появляется с вопросительными знаками). Более того, я бы предпочел решение, в котором пользователь промпируется только один раз для 2 файлов, а не дважды.

2 Ответа

Эта версия дает пользователю один диалог. Наслаждаться. И тот, кто понизил мой другой ответ, Пожалуйста, добавьте комментарий к этому, объяснив, что вам так не понравилось, что это потребовало понижения.

Работая с существующей функцией openfile, измените значение возврата с Boolean на Excel.Workbook. Если они не открывают книгу, вы устанавливаете ее в Nothing вместо false, в противном случае вы устанавливаете ее в ссылку на книгу только что открытого файла (вам нужно будет изменить openfile, чтобы получить эту ссылку). Затем вы просто вызываете его дважды и устанавливаете ссылку на книгу для каждого вызова, который не является ничем.

Пример кода ниже написан в свободной форме и непроверен — это действительно просто прославленный псевдокод — но должен указать вам правильное общее направление.

Отредактированы, чтобы добавить:

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

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

У меня есть несколько (как в 100s) электронных таблиц, использующих addin (назовем его Addin2003). Из-за перехода на новые версии Excel мне нужны некоторые из этих таблиц для использования нового.

Можно ли использовать одну переменную в Excel VBA в нескольких книгах? Без использования надстройки подхода? как уже упоминалось здесь . Например, я сохраняю имя пользователя Windows в var sysUser и.

Я надеюсь на небольшую проверку на вменяемость. Я адаптирую надстройку Word (написанную в VBA для Word 2010) для Mac, в частности, на данный момент Word 2011. Я знаю о многих различиях, но один из.

Я написал макрос excel, который, похоже, сломался, к сожалению, когда я пытаюсь отредактировать макрос в Редакторе VBA, excel сам падает эффектно. Это, кажется, происходит независимо от того.

У меня возникли проблемы с этим, надеюсь, незначительная проблема, и я не могу понять, как ее решить. У меня есть скрипт vba, который хорошо работает при объединении нескольких книг / листов в 1.

Можно ли использовать одну и ту же переменную форматирования для форматирования нескольких книг excel с помощью xlsxwriter? Если да, то как? В настоящее время я могу использовать переменную.

Я ищу совет о том, как управлять userdefined VBA-функции, которые используются в нескольких книгах : Предыстория: со временем я создал несколько книг Excel (wbs), каждая с немного другой целью.

Я сделал простое консольное приложение, которое принимает введенные в него данные, преобразует их в правильный формат и отправляет в онлайн-базу данных. Консольному приложению просто нужны введенные.

Я пытаюсь сделать цикл, чтобы отфильтровать столбец A для всех книг (поскольку они одинаковы, alwyas столбец A). Я хочу показать все ячейки в качестве фильтра romve пустые ячейки. У меня есть много.

У меня есть макрос, который просит пользователя выбрать несколько файлов для анализа данных. Пользователь сначала выбирает файл Excel или CSV (XLSX, XLS, CSV), а затем запрашивает второй файл, но.

Читать еще:  Usedrange vba excel описание
Ссылка на основную публикацию
Adblock
detector