Диалог сохранения файла excel vba

0 / 0 / 0

Регистрация: 03.03.2012

Сообщений: 29

1

Открыть диалог сохранения файла

17.03.2012, 21:33. Показов 30825. Ответов 9


Студворк — интернет-сервис помощи студентам

Здравствуйте, господа программисты!
Скажите, пожалуйста, как средствами VBA можно открыть меню на сохранение программно созданной книги документа (изображение «сохранение).jpg » в прикрепленном файле)
У меня сделано вот так:
1) В исходной книге копируются 2 необходимых листа.
2) Выбранные листы помещаются в новую книгу, она сохраняется по указанному пути под фиксированным именем.
Файл прикрепил.
_____________________
Если у вас есть идеи и предложения, подскажите, пожалуйста, как можно программно вывести меню Eхcel (показанное в рисунке) на сохранение, в котором пользователь мог бы изменить пусть к папке, куда он хочет сохранить созданные документы и задать желаемое имя.

Миниатюры

Открыть диалог сохранения файла
 



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

17.03.2012, 22:37

2

Лучший ответ Сообщение было отмечено как решение

Решение

Простейший случай

Visual Basic
1
Application.Dialogs(xlDialogSaveAs).Show

С предлагаемым именем и типом файла

Visual Basic
1
Application.Dialogs(xlDialogSaveAs).Show "предлагаемое_имя", xlExcel9795

С анализом действия пользователя

Visual Basic
1
2
If Not Application.Dialogs(xlDialogSaveAs).Show("предлагаемое_имя", xlExcel9795) Then _
    MsgBox "Книга не сохранена!", vbExclamation



5



0 / 0 / 0

Регистрация: 03.03.2012

Сообщений: 29

17.03.2012, 23:24

 [ТС]

3

Казанский, СПАСИБО Большое, первый из предложенных Вами вариантов, — то,что нужно ! а я то думал, там сочинение будет
а Вы не знаете,как закрыть/скрыть от пользователя созданную книгу или хотя бы её не высвечивать ? Чтобы только окно сохранения было видно и основная книга (откуда все копируется) ?



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

18.03.2012, 01:10

4

В простейшем случае — перед командой копирования листов поставить

Visual Basic
1
Application.ScreenUpdating = False



0



strike383

616 / 0 / 1

Регистрация: 24.07.2013

Сообщений: 93

17.01.2014, 16:29

5

Visual Basic
1
2
If Not Application.Dialogs(xlDialogSaveAs).Show(Date & ".xlsx") Then _
        MsgBox "Книга не сохранена!", vbExclamation

А подскажите пожалуйста, как сюда добавить путь сохранения



0



0 / 0 / 0

Регистрация: 11.04.2018

Сообщений: 4

17.04.2018, 12:41

6

Цитата
Сообщение от Казанский
Посмотреть сообщение

«предлагаемое_имя», xlExcel9795

А как указать расширение сохраняемого файла PDF?



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

17.04.2018, 14:43

7

seryga123, с помощью прямого вызова диалога — по-видимому, никак: сохранение в PDF производится не с помощью метода SaveAs, которому соответствует диалог Application.Dialogs(xlDialogSaveAs) , а с помощью метода ExportAsFixedFormat, соответствующего диалога которому я не нашел: https://msdn.microsoft.com/ru-… ment-lists
Поэтому сначала вызываем диалог выбора файла, потом сохраняем:

Visual Basic
1
2
3
4
5
6
7
Dim x
  x = Application.GetSaveAsFilename("c:tempmyfile", "PDF files (*.pdf), *.pdf") 'путь и предлагаемое имя файла
  If x <> False Then
    ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=x _
      , Quality:=xlQualityStandard, IncludeDocProperties:=True _
      , IgnorePrintAreas:=False, OpenAfterPublish:=True
  End If



0



0 / 0 / 0

Регистрация: 11.04.2018

Сообщений: 4

17.05.2018, 09:46

8

Казанский, а не подскажите как в имя добавить переменную?
Я имею ввиду что-то вроде:

Код

 Application.Dialogs(xlDialogSaveAs).Show "name1" & "name2" & a, 51



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

17.05.2018, 10:15

9

seryga123, да, так. Вы попробовали?



0



0 / 0 / 0

Регистрация: 11.04.2018

Сообщений: 4

17.05.2018, 10:17

10

Да, конечно пробывал, но не работает!



0



There may be times when you need to ask the user to select a location to save a file. This can be done using a save file dialog. Keep in mind that a save file dialogs doesn’t actually save anything. It only returns the full path the user has selected to save the file. There are several different methods for creating a save file dialog. One of the methods is explained in the article Excel VBA Save File Dialog, FileDialog(msoFileDialogSaveAs). The method explained there has some pros and cons:

Pros:

  • The FileDialog(msoFileDialogSaveAs)  is available for VBA in all office products

Cons:

  • You can’t apply a filter to the file types.

The method I will explain in this article uses the command, GetSaveAsFilename(). This method also has some pros and cons:

Pros

  • You can apply  filters to the file types.

Cons

  • It is only available for VBA in Excel

Jump To:

  • Example 1
  • Example 2, File Filters
  • Example 3, Multiple Filters
  • Example 4, Custom Title
  • Example 5, Start Location

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


Example 1:

In this example a dialog will open asking the user to select a location to save the file. The path selected will be printed in cell A2. Note the save file dialog will not actually save the file. It will only provide the full path the user has selected to save the file:

Sub Example1()
Dim varResult As Variant
'displays the save file dialog
varResult = Application.GetSaveAsFilename
'checks to make sure the user hasn't canceled the dialog
If varResult <> False Then
    Cells(2, 1) = varResult
End If

End Sub

Result:

Excel VBA, GetSaveAsFileName, Example

The user selected the directory “D:Temp” and the name “Test”. The full path can be seen in cell A2:

Excel VBA, GetSaveAsFileName, Example Result


Example 2, File Filters:

There was a problem with Example 1. There were no file filters to choose from:

Excel VBA, GetSaveAsFileName, Example 1 Error

The result path was “D:TempTest.”. A path with no file extension. If you try to save an excel file using that path you will end up with an unrecognized file type:

Excel, VBA Unrecognized File Type
In order for this not to happen you have 2 options:

Option 1: Ask the user to input the file extension every time he decides to save a file:

Excel VBA, GetSaveAsFileName, Manual File Extension INput
This would be very annoying on the users side.

Option 2: Apply filters to the save file dialog.

The code below opens a save file dialog with the .xlsx filter. Note the save file dialog will not actually save the file. It will only provide the full path the user has selected to save the file:

Sub Example2()
Dim varResult As Variant
'displays the save file dialog
varResult = Application.GetSaveAsFilename( _
    FileFilter:="Excel Files (*.xlsx), *.xlsx")
'checks to make sure the user hasn't canceled the dialog
If varResult <> False Then
    Cells(2, 1) = varResult
End If
End Sub

Result:

Excel VBA, GetSaveAsFileName, Example 2
The path selected is printed in cell A2:

Excel, VBA, GetSaveAsFileName, Example 2, Selected Path
As you can see this time the .xlsx extension was added to the file path.


Example 3, Multiple Filters:

Sometime you might want to give the user the option to choose the file extension from multiple available extensions. The example below creates 2 filters a .xlsx and a .xlsm:

Sub Example3()
Dim varResult As Variant
'displays the save file dialog
varResult = Application.GetSaveAsFilename(FileFilter:= _
    "Excel Files (*.xlsx)," & "*.xlsx, Macro Enabled" & _
    "Workbook (*.xlsm), *xlsm")
'checks to make sure the user hasn't canceled the dialog
If varResult <> False Then
    Cells(2, 1) = varResult
End If
End Sub

Result:

Excel VBA, GetSaveAsFileName, Example 3, Multiple Filters


Example 4, Custom Title:

The default title for the save file dialog is “Save As”:

Excel VBA, GetSaveAsFileName, Example Title
The code below changes the dialogs title to “Some Random Title”:

Sub Example4()
Dim varResult As Variant
'displays the save file dialog
varResult = Application.GetSaveAsFilename(FileFilter:= _
"Excel Files (*.xlsx),*.xlsx, Macro Enabled Workbook " & _
"(*.xlsm), *xlsm", Title:="Some Random Title")
'checks to make sure the user hasn't canceled the dialog
If varResult <> False Then
    Cells(2, 1) = varResult
End If
End Sub

Result:Excel VBA, GetSaveAsFileName, Example 3, Title


Example 5, Start Location:

You can tell the dialog to start in a specific folder. In the example below the save file dialog will start in the directory “D:TempFolder to Start”:

Sub Example5()
Dim varResult As Variant
'displays the save file dialog
varResult = Application.GetSaveAsFilename(FileFilter:= _
    "Excel Files (*.xlsx), *.xlsx, Macro Enabled Workbook" & _
    "(*.xlsm), *xlsm", Title:="Some Random Title", _
    InitialFileName:="D:TempFolder to Start")
'checks to make sure the user hasn't canceled the dialog
If varResult <> False Then
    Cells(2, 1) = varResult
End If
End Sub

Result:

Excel VBA, GetSaveAsFileName, Example 5, Start location

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

See also:

  • VBA Save File Dialog, FileDialog(msoFileDialogSaveAs)
  • VBA Excel, Writing to a Text File
  • Excel VBA Open File Dialog
  • VBA File and Folder Dialogs
  • MSDN, Microsoft, Application.GetSaveAsFileName Method (Excel)

If you need assistance with your code, or you are looking for a VBA programmer to hire feel free to contact me. Also please visit my website  www.software-solutions-online.com

Хитрости »

17 Июнь 2015              147454 просмотров


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

Часто при работе с файлами и написании кодов начинающие «кодить» в 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])
По сути я часто использую именно его, т.к. это универсальный метод и в нем есть все, что лично мне необходимо: выбрать определенные типы файлов позволяет, возможность запрета выбора нескольких файлов сразу есть.

FileFilter Указываются типы файлов, которые будут отображаться в диалоговом окне выбора. Например, если указать «Excel files(*.xls*),*.xls*», то возможно будет выбрать только файлы Excel(с расширением, начинающимся на .xls — .xls, .xlsx, .xlsb, .xlsm и т.д.). Если указать «Text files(*.txt),*.txt», то можно будет выбрать только текстовые файлы с расширением .txt. Так же можно указать более одного типа расширений: «Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt». По умолчанию тип файлов в диалоговом окне будет принадлежать первому указанному типу файлов(*.xls*). Но можно указать любой из перечисленных типов при помощи аргумента FilterIndex. Так же можно указать выбор любых типов файлов: «All files(*.*),*.*»
FilterIndex Если аргументом FileFilter указано более одного типа файлов(расширений), то этот аргумент указывает какой именно тип использовать. Например, следующая строка по умолчанию назначает выбор текстовых типов файлов:

avFiles = Application.GetOpenFilename _
    ("Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", 2, _
     "Выбрать текстовые или Excel файлы", , True)

Атрибут FilterIndex

Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открытие документа»)
ButtonText Данный аргумент доступен только для ПК под управлением Macintosh(MAC). Назначает текст для кнопки диалогового окна Открыть. Для владельцев Windows этот текст всегда будет «Открыть»
MultiSelect Указывает, может быть выбран только один файл или несколько:

  • 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:
Ниже в статье примера кода с применением всех описанных параметров

AllowMultiSelect Указывает, может быть выбран только один файл или несколько:

  • True — можно будет выбрать более одного файла для обработки(через Shift или Ctrl или простым выделением мышью внутри окна)
  • False — можно будет выбрать только один файл
Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открытие документа»)
Filters Перечисляются типы файлов, которые будут отображаться в диалоговом окне выбора. Для добавления типа файла(расширения) необходимо использовать метод Add:
.Filters.Add([Description],[Extensions],[Position])

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

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

.Filters.Add "Excel files", "*.xls*;*.xla*", 1 'добавляем возможность выбора файлов Excel
.Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
FilterIndex Назначает тип файлов, который будет выбран по умолчанию из всех перечисленных в коллекции Filters при вызове диалога
InitialFileName Этим параметром можно задать начальную папку, на которой будет открыт диалог:

.InitialFileName = "С:Temp"

Если при этом еще добавить имя файла, то в поле диалога Имя файла будет так же отображено это имя:

.InitialFileName = "С:TempКнига1.xlsx"

Я лично не рекомендую указывать имя файла, т.к. после показа диалога этот файл автоматически будет выбран, что не всегда бывает правильным. Но все зависит от задач. Если пользователь не выберет самостоятельно ни одного файла, то ответом диалога будет именно файл с указанным именем(Книга1.xlsx). Если такого файла не окажется в папке, то диалог выдаст предупреждение, что такого файла нет.

InitialView Данный параметр определяет внешний вид и структуру окна диалога. Доступно 9 вариантов:

  • msoFileDialogViewDetails
  • msoFileDialogViewLargeIcons
  • msoFileDialogViewList
  • msoFileDialogViewPreview
  • msoFileDialogViewProperties
  • msoFileDialogViewSmallIcons
  • msoFileDialogViewThumbnail
  • msoFileDialogViewTiles
  • msoFileDialogViewWebView

При использовании данного параметра следует учитывать, что на разных операционных системах могут быть доступны не все варианты. Поэтому прежде чем использовать лучше убедиться, что на конечных ПК поддерживается указанный тип. В принципе ничего страшного не произойдет — будет просто показано окно с видом по умолчанию. Но куда правильнее в разработке придерживаться однотипного вида на всех ПК.

SelectedItems Возвращает коллекцию выбранных файлов. В отличии от Application.GetOpenFilename всегда возвращается массив строк, поэтому можно всегда использовать цикл для открытия файлов, даже если параметр AllowMultiSelect установлен в False:

For Each x In .SelectedItems
    Workbooks.Open x
Next

Так же можно отбирать только отдельные файлы по индексам или организовать цикл иначе:

For lf = 1 to .SelectedItems.Count
    x = .SelectedItems(lf)
    Workbooks.Open x
Next

Нумерация строк в SelectedItems всегда начинается с 1

Show Пожалуй, самый важный метод в диалоге — отвечает за показ диалога. При этом метод Show возвращает ответ в виде целого числа:

  • -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 .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) только их меньше доступно для применения:

Title Текст заголовка диалогового окна. Если указать «Выбрать папку с отчетами», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Открыть папку»)
InitialFileName Этим параметром можно задать начальную папку, на которой будет открыт диалог:

.InitialFileName = "С:Temp"
InitialView Данный параметр определяет внешний вид и структуру окна диалога. Доступно 9 вариантов:

  • msoFileDialogViewDetails
  • msoFileDialogViewLargeIcons
  • msoFileDialogViewList
  • msoFileDialogViewPreview
  • msoFileDialogViewProperties
  • msoFileDialogViewSmallIcons
  • msoFileDialogViewThumbnail
  • msoFileDialogViewTiles
  • msoFileDialogViewWebView

При использовании данного параметра следует учитывать, что на разных операционных системах могут быть доступны не все варианты. Поэтому прежде чем использовать лучше убедиться, что на конечных ПК поддерживается указанный тип. В принципе ничего страшного не произойдет — будет просто показано окно с видом по умолчанию. Но куда правильнее в разработке придерживаться однотипного вида на всех ПК.

SelectedItems Возвращает коллекцию с одним элементом, в котором содержится путь к выбранной папке. Нумерация строк в SelectedItems всегда начинается с 1, но т.к. выбор нескольких папок невозможен, то всегда указывается 1: x = .SelectedItems(1)
ButtonName Назначает текст кнопки, которой подтверждается выбор папки. Может содержать не более 51 знака(чего как правило достаточно).
Show Метод, который вызывает показ диалога с выбранными параметрами. Возвращает ответ в виде целого числа:

  • -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 .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
Пример вызова диалога выбора папки через 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 740 скачиваний)


 
Диалог сохранения файла SaveAs

Еще один вид диалогового окна — запрос имени и места сохранения файла.
Параметры:

Application.GetSaveAsFilename([InitialFileName], [FileFilter], [FilterIndex], [Title], [ButtonText])
Универсальный диалог, работающий во всех версиях Excel, начиная с 2000

InitialFileName Можно указать путь и имя файла, которые будут использованы в качестве шаблона для сохранения. По умолчанию в диалоге отображается папка, которая была использована в последний раз в текущем сеансе Excel. Если диалог вызывается впервые, то будет показана для сохранения файлов по умолчанию(задается из самого Excel: Файл(File)Параметры(Options)Сохранение(Save)Расположение локальных файлов по умолчанию(Default local file location)).
Показываем диалог со стартовой папкой на той книге, в которой сам макрос, без указания имени сохраняемой книги:

sToSavePath = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path)

Показываем диалог со стартовой папкой на той книге, в которой сам макрос и именем сохраняемой книги «SaveAs.xlsm»:

sToSavePath = Application.GetSaveAsFilename(InitialFileName:="SaveAs.xlsm", FileFilter:="Excel files (*.xlsm), *.xlsm")

Здесь следует обратить внимание на один важный момент: если необходимо помимо стартовой папки указать еще и имя файла, то в обязательном порядке надо указывать так же аргумент FileFilter. Если его не указывать, то InitialFileName просто откроет указанную папку, т.к. не поймет файлы какого типа надо отображать. Либо вместо «SaveAs.xlsm» надо будет указывать «SaveAs.*», что я лично настоятельно не рекомендую делать.
Несмотря на возможность указать имя файла его можно изменить прямо в диалоговом окне, что тоже порой правильнее. Например, чтобы убедиться в том, что имя файла указано пользователем.

FileFilter Указываются типы файлов, которые будут отображаться в диалоговом окне выбора. Должен совпадать с тем типом, с которым собираемся сохранять файл. Например, если указать «Excel files(*.xls*),*.xls*», то возможно будет выбрать только тип файлов Excel(с расширением, начинающимся на .xls — .xls, .xlsx, .xlsb, .xlsm и т.д.). Если указать «Text files(*.txt),*.txt», то только текстовые файлы с расширением .txt. Так же можно указать более одного типа расширений: «Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt». По умолчанию тип файлов в диалоговом окне будет принадлежать первому указанному типу файлов(*.xls*). Но можно указать любой из перечисленных типов при помощи аргумента FilterIndex. Так же можно указать выбор любых типов файлов: «All files(*.*),*.*»
FilterIndex Если аргументом FileFilter указано более одного типа файлов(расширений), то этот аргумент указывает какой именно тип использовать. Например, следующая строка по умолчанию назначает выбор и сохранение файла в текстовый:

avFiles = Application.GetSaveAsFilename _
    (InitialFileName:=ThisWorkbook.Path, FileFilter:="Excel files(*.xls*),*.xls*,Text files(*.txt),*.txt", FilterIndex:=2)

Атрибут FilterIndex

Title Текст заголовка диалогового окна. Если указать «Выбрать текстовые или Excel файлы», то именно этот текст будет в заголовке. Если не указывать, то будет текст по умолчанию(нечто вроде «Сохранение документа»)
ButtonText Данный аргумент доступен только для ПК под управлением Macintosh(MAC). Назначает текст для кнопки диалогового окна Сохранить. Для владельцев Windows этот текст всегда будет «Сохранить»

Что еще важно знать: сам по себе вызов диалога GetSaveAsFilename ничего не сохраняет — он только создает путь для сохраняемого файла. Сохранять придется принудительно после выбора места и имени.
Пример применения диалога Application.GetSaveAsFilename

Sub 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»), а одна из предустановленных констант формата файла. Вот основные константы:

Константа Excel Числовая константа Расшифровка
xlOpenXMLWorkbookMacroEnabled 51 xlsm — книга Excel
xlOpenXMLWorkbookMacroEnabled 52 xlsm — книга Excel с поддержкой макросов
xlExcel12 50 xlsb — двоичная книга Excel (с поддержкой макросов)
xlOpenXMLAddIn 55 xlam — надстройка Excel
xlOpenXMLTemplate 54 xltx — шаблон Excel
xlOpenXMLTemplateMacroEnabled 53 xltm — шаблон Excel с поддержкой макросов
xlExcel8 56 xls — книга Excel(97 — 2003)
xlAddIn 18 xla — надстройка Excel(97 — 2003)
xlTemplate 17 xlt — шаблон Excel(97 — 2003)
xlCurrentPlatformText -4158 txt — текстовый файл с разделителями табуляции
xlUnicodeText 42 txt — текстовый файл в кодировке Юникод
xlCSV 6 csv — CSV(разделитель запятая)
xlCSVMSDOS 24 csv — CSV(MS — DOS)
XlFileFormat 62 csv — CSV UTF-8(разделитель запятая)
xlTypePDF 0 pdf — файл в формате PDF

Пример использования констант в диалогах 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

Любой метод: либо числовая константа, либо встроенная работают одинаково. Вопрос лишь в том, что лично для Вас будет удобнее и нагляднее.

Так же см.:
Работа с диалогами
Как запретить сообщения?


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

I am trying to follow the tutorial here http://software-solutions-online.com/excel-vba-save-file-dialog-getsaveasfilename/ and have typed up my code to be:

varResult = Application.GetSaveAsFilename(FileFilter:="Excel Files (*.xlsx), *.xlsx")

Now when I compile the syntax I get an error of:

Method or Data Membor Not Found

On this specific element GetSaveAsFilename

I am running this in Access 2013 to save an Excel 2013 .xlsx — what should I change so this will prompt the user for a save name and location?

asked Dec 25, 2017 at 4:45

IcyPopTarts's user avatar

IcyPopTartsIcyPopTarts

4941 gold badge12 silver badges25 bronze badges

2

This particular method won’t work in Access VBA. (VBA isn’t 100% interchangeable between the Office products.)

Sample in Access VBA:

Sub TestFileDialog()
'requires Reference to "Microsoft Office xx.x Object Library"
    Dim strFilename As String
    With Application.FileDialog(msoFileDialogSaveAs)
        If .Show Then
            strFilename = .SelectedItems(1)
        Else
            MsgBox "No filename specified!", vbExclamation
            Exit Sub
        End If
    End With

    'do something with strFilename

End Sub

This should be adaptable to saving your Excel object from Access.

answered Dec 25, 2017 at 5:02

ashleedawg's user avatar

ashleedawgashleedawg

20k8 gold badges73 silver badges104 bronze badges

Another question, “Save as…” dialog box in MSAccess vba: how? on this website has some useful pointers that could help you; I had a similar problem and this solved it for me! Like ashleedawg said, VBA syntax isn’t exactly the same across different applications.

You may also try using the Application.FileDialog msoFileDialogSaveAs but make sure to include the library which contains these symbols into your project. Most likely, Access will generate a prompt informing you to add the library reference to the project.
the only issue would be that you can’t apply file type filters. If that is something which is important to do, take a look at this guide on the microsoft forums. Display Open and Save As Dialog Boxes in Access with API Functions.

answered Feb 22, 2018 at 16:08

tanvi's user avatar

tanvitanvi

5481 gold badge11 silver badges31 bronze badges

3

If you are coding in VBScript, Excel and you need to extract the filename that a user uses when saving a file, the GetSaveAsFilename() method can be useful for you.

This can be quite helpful when you want the end-user to select a file from their required file location using a GUI like a Save as dialog box. 

In this tutorial, we will demonstrate with a few coding examples how to use the Application.Getsaveasfilename method in Excel

What does the GetSaveAsFilename Method do in Excel?

The GetSaveAsFilename() method in Excel does two things:

  • Displays a customized Save As dialog box
  • Extracts the filename the user specifies in the ‘Filename’ input field of the dialog box.

It does not, however, actually save the file even when the user presses the Save button. You will need to use a separate function if you want the file to be saved.

Now what do we mean by a ‘customized Save As dialog box’ ?

This means you can specify what title you want in the Save As dialog box, as well as specify an initial filename (that the user can change according to his/ her requirement).

You can also specify filters for the types of files the user will be allowed to save as. For example, you might want to give the user options to save as only text (.txt) and Excel (.xlsx) files.

It is important to note here that the GetSaveAsFilename() method may change the current drive or folder.

Syntax for the GetSaveAsFilename Method in Excel

The syntax for the GetSaveAsFilename() method is as follows:

expression.GetSaveAsFilename (InitialFilename, FileFilter, FilterIndex, Title)

Here, expression is an application object variable.

The arguments of this function are all optional. Here’s what they represent:

  • InitialFilename is the default filename that appears in the ‘Filename’ input field when the dialog box appears. It is usually used to provide the user with a suggested file name. If this argument is omitted, Microsoft Excel uses the name of the active workbook.
File name in the save as dialog box
  • FileFilter is a string with which you can specify the file filtering criteria, like which types of files the user will be allowed to save the file with. This string can have a maximum of 255 characters.
  • FilterIndex is the number of file filters that you want to use.
  • Title is the title you want to be displayed in the title bar of the Save As dialog box. If this argument is omitted, the default title ‘Save As’ is used.
Title to show in the save as dialog box

Example VBA Codes Using GetSaveAsFilename in Excel

Let us take a look at some example codes to understand how the GetSaveAsFilename method is used and applied.

VBA Code to Get Filename with Path from a Save As Dialog Box

The first sample code lets you extract the file name specified by the user in the ‘Filename’ field of the Save As dialog box and then use it to display the name of the file in a message box.

Sub Example1()
Dim varResult As Variant
ResultVar = Application.GetSaveAsFilename()
If ResultVar <> False Then
MsgBox "Filename entered: " & ResultVar
End If
End Sub

When you run the above code, you should see a Save As dialog box that will let you enter a filename. 

Dialog boz that allows entering file name

When you click Save, you should see a message box with the filename you entered along with the entire file path displayed. 

Message box that shows the entire path

Note that this code will only cause the Save As dialog box to be displayed. Pressing the Save button will not actually save the file.

Explanation of the Code

Let us understand the above code (Example1) line by line:

Line 1: This line declares a variable varResult of type Variant. The Variant data type can be used to define variables that contain any type of data.

Dim varResult As Variant

Line 2: This line displays the Save As dialog box.

ResultVar = Application.GetSaveAsFilename()

Line 3: This line first checks if the user has entered a filename and there are no errors. If so, then it takes the entire path of the file, along with the filename the user specified, and displays it in a message box.

If ResultVar <> False Then
MsgBox "Filename entered: " & ResultVar
End If

VBA Code to Display Save As Dialog Box with File Filters

This sample code lets you specify a specific file filter, so that the user is only allowed to save a file of the specified file type.

Let’s say you want to only give the user the option to save their file as a text file. Here’s the code, you will need for that:

Sub Example2()
Dim varResult As Variant
ResultVar = Application.GetSaveAsFilename(FileFilter:="Text Files (*.txt), *.txt")
If ResultVar <> False Then
ActiveWorkbook.SaveAs ResultVar
End If
End Sub

When you run this code you will see the Save As dialog box displaying just one option in the ‘Save as type’ dropdown list – ‘Text Files’, and when you subsequently save the file, you will get the file saved as a ‘.txt’ file. 

Save as Dialog with the option to choose file type

Explanation of the Code

Let us understand the above code (Example2) line by line:

Line 1: This line declares a variable varResult of type Variant.

Dim varResult As Variant

Line 2: This line displays the Save As dialog box, providing the user the option to save the file as a text file only. The string ‘Text files’ will be displayed in the drop down list for the ‘Save as type’ field and the filename specified by the user will be appended with the extension ‘.txt’.

ResultVar = Application.GetSaveAsFilename(FileFilter:="Text Files (*.txt), *.txt")

Line 3: This line first checks if the user has entered a filename and there are no errors. If so, then it saves the active workbook with the file name specified by the user as a text file.

The SaveAs() method is what actually saves the file when the ‘Save’ button is pressed.

Without this line, only the Save As dialog box would be displayed but nothing would get saved when the user presses the Save button.

If ResultVar <> False Then
ActiveWorkbook.SaveAs ResultVar
End If

You can also use the GetSaveAsFilename method to specify multiple filters.

For example, say you want to give the user the option to save their file as either a text file (*.txt) or an Excel file (*.xlsx). In that case, you can replace line 2 in the above code with the following line:

ResultVar = Application.GetSaveAsFilename(FileFilter:="Text Files (*.txt), *.txt, Excel Files (*.xlsx), *.xlsx")

Here’s what the dialog box would then look like:

Only the specified options show up in the save as dialog box

VBA Code to Display Save As Dialog box from a Specified Start Location

This last sample code lets you specify a particular location, drive or directory from where you want the Save As dialog box to start. Let’s say you want the dialog box to start from the D: drive. Here’s the code, you will need for that:

Sub Example3()
Dim varResult As Variant
ResultVar = Application.GetSaveAsFilename(InitialFileName:="D:")
If ResultVar <> False Then
MsgBox "Filename entered: " & ResultVar
End If
End Sub

Note that the InitialFileName argument just provides the location from which the Save As dialog box starts.

The user will have the option to change this location, drive or directory as needed.

Automatically picks up the save location drive

In this tutorial we demonstrated, with the help of a few sample VBScript codes, how to use the GetSaveAsFilename() method.

This method allows the user to enter the name and location of a file using the Save As dialog box. We hope you found this helpful.

Other articles you may also like:

  • Using Application.EnableEvents in VBA in Excel (Explained with Examples)
  • Why does Excel Open on Startup (and How to Stop it)
  • How to Start Excel in Safe Mode (3 Easy Ways)
  • SetFocus in Excel VBA – How to Use it?
  • How to Open Excel Files Using VBA
  • Subscript Out of Range Error in VBA – How to Fix!

Like this post? Please share to your friends:
  • Диапазон в excel это совокупность ячеек
  • Диапазон в excel это несколько ячеек
  • Диапазон в excel это все ячейки одной строке
  • Диапазон в excel на английском
  • Диапазон в excel код