Excel vba fileformat xlsx

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Workbook.FileFormat property (Excel)

vbaxl10.chm199100

vbaxl10.chm199100

excel

Excel.Workbook.FileFormat

ef722c3c-90ea-9810-b853-a3fff19d5c60

05/29/2019

medium

Workbook.FileFormat property (Excel)

Returns the file format and/or type of the workbook. Read-only XlFileFormat.

Syntax

expression.FileFormat

expression A variable that represents a Workbook object.

Remarks

Some of these constants may not be available to you, depending on the language support (U.S. English, for example) that you’ve selected or installed.

Example

This example saves the active workbook in Normal file format if its current file format is Excel 97/95.

If ActiveWorkbook.FileFormat = xlExcel9795 Then 
 ActiveWorkbook.SaveAs fileFormat:=xlExcel12 
End If

[!includeSupport and feedback]

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#1

05.02.2018 12:20:04

Добрый день, хочу записать макрос преобразования книги из xls в xlsx.
Для того, чтобы изменения во время преобразования вступили в силу и можно было пользоваться всеми возможностями excel предалагает закрыть и заново открыть файл в автоматическом порядке

Вот что записал макрорекодер:

Код
Sub Преобразование()
    ActiveWorkbook.SaveAs Filename:= "С:test.xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False ' 1-й этап - сохранение файла в формате xlsx
    Workbooks.Open Filename:= "С:test.xlsx" ' 2-й этап открытие преобразованного файла
End Sub

Но проблема в том, что файлы могут открывать в разных директориях и иметь разные имена.
Макрос запускается из надстройки, т.е. вначале открывается файл с ним производятся манипуляции в т.ч. преобразование формата.

Пытался использовать ACTIVEBOOK.PATH & ACTIVEBOOK.NAME но файл сохраняется с расширением xls, т.к. видимо name включает и расширение
Также не знаю как открыть только преобразованный и закрытый файл, во второй части макроса.
Поэтому прошу помощи =)

Изменено: g.tomilin05.02.2018 17:27:19

Что такое всё?

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Изменено: Jack Famous05.02.2018 12:24:12

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#3

05.02.2018 12:43:22

Цитата
Но задача в том, что файлы могут открывать в разных директориях и иметь разные имена

каким способом планируете выбирать файлы?

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

тогда диалоговое окно по выбору файлов с последующим их открытием и пересохранением в нужное расширение.

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко,
Я использую надсройку в которой у меня коллекция макросов =)
Соотвественно файл открывается вручную а потом через надстройку с ним проводятся манипуляции в т.ч. преобразование формата.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#6

05.02.2018 17:20:22

Цитата
g.tomilin написал:
Соотвественно файл открывается вручную а потом через надстройку

Тады в надстройку код

Код
Sub qq()
    Dim oldFName$
    oldFName = ActiveWorkbook.FullName
    ActiveWorkbook.SaveAs oldFName & "x", 51
    Kill oldFName
End Sub
 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN,  только начинаю изучать vba, и у меня вопрос, я так понимаю представленный макрос просто добавляет к ActiveWorkbook.FullName ,букву «x» ?
Но цель не просто поменять расширение внешне, а преобразовать файл.

В т.ч. для этого макрорекодер указывает FileFormat:=xlOpenXMLWorkbook
Например при сохранении файла в формате Excel 97-2003 FileFormat:=xlExcel8

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

g.tomilin, вы изложили хотелку.
Я предложил код.
То, что предложенный код не соответствует вашим представлениям о «правильном коде», проблемы не мои.
F1 в помощь.

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

#9

06.02.2018 07:45:29

Цитата
g.tomilin написал:
цель не просто поменять расширение внешне, а преобразовать файл.

Внимательно посмотрите на код от RAN, а потом прочитайте это:

Цитата
These are the main file formats in Excel 2007-2010:
51 = xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx)
 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN, =)) Спасибо, я же говорю только начинаю изучать. увидел 51 но даже не подумал что в ней зашифрован целый мир  :oops:

Осталось только закрыть и открыть книгу, т.к. у преобразованной книги остается режим совместимости
Пытался через Workbooks.Open Filename:=activebook.Path & activebook.Name
выдал ошибку 424

_Igor_61, а где можно помотреть весь перечень таких цифровых комбинаций для VBA?

Изменено: g.tomilin06.02.2018 09:16:03

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#11

06.02.2018 09:02:58

Цитата
RAN написал:
F1 в помощь.

:)

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

#12

06.02.2018 09:35:31

Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:

Цитата
// константы форматов 2003
//  xlCSVWindows = 23;
//  xlDBF2 = 7;
//  xlDBF3 = 8;
//  xlDBF4 = 11;
//  xlDIF = 9;
//  xlExcel9795 = 43;
//  xlTextWindows = 20;
//  xlUnicodeText = 42;
//  xlWebArchive = 45;
//  xlXMLSpreadsheet = 46;
//  xlXMLData = 47;

// основные константы 2007
//  These are the main file formats in Excel 2007-2010:
//  51 = xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx)
//  52 = xlOpenXMLWorkbookMacroEnabled (with or without macro’s in 2007-2010, xlsm)
//  50 = xlExcel12 (Excel Binary Workbook in 2007-2010 with or without macro’s, xlsb)
//  56 = xlExcel8 (97-2003 format in Excel 2007-2010, xls)

//  57 = PDF
//  60 = xlOpenDocumentSpreadsheet  OpenDocument Spreadsheet

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN, нашел кодировки форматов, увидел возможные варианты причин ошибки, но к сожалению через ф1 не понять как закрыть и открыть книгу =)

Изменено: g.tomilin06.02.2018 10:19:19

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#14

06.02.2018 10:21:34

_Igor_61, да я в справке просто 51 набрал и он выдал —

Скрытый текст

Что такое всё?

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Есть ещё какие-нибудь предложения по вопросу? =)
Как закрыть а затем открыть книгу?

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#16

06.02.2018 17:31:04

Цитата
_Igor_61 написал:
Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:

Тут

.

Владимир

 

так:
workbook.close false

workbooks.open(«полный путь к файлу»)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко, проблема в том что путь как и имя файла неконстанта.
Этот макрос встроен в надстройку — я открываю любой файл и применяю в нему определенный набор изменений в т.ч. преобразование в xlsx.
Соответственно нужно что-то вроде open recent file
Т.е. происходит сохранение/преобразование затем требуется заново открыть файл — по процедуре close затем open.

 

Дмитрий Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#19

07.02.2018 09:27:20

Цитата
g.tomilin написал:
путь как и имя файла неконстанта

ну да, ну да. И Вы вообще не знаете куда сохраняли и как назвали файл? А как же Вы тогда кодом его сохраняете, позвольте узнать? Не думаю, что все это происходит при помощи двух неизвестных. Скорее всего это какие-то переменные, которые никто не мешает использовать не только для сохранения, но и для открытия.
Чтобы не гадать и не рассказывать, что именно Вы не понимаете в этом процессе — приложите нормальный и реальный код сохранения.
И по опыту: чтобы убрать режим совместимости необходимо, чтобы были закрыты ВСЕ файла с расширением xls. Если хоть один будет открыт — режим совместимости будет активен.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Дмитрий Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#20

07.02.2018 09:39:38

Вот, накидал код — должен работать:

Код
Sub SaveAndOpen()
    Dim sfn As String, sp As String
    'получаем путь к папке активной книги
    sp = ActiveWorkbook.Path
    'добавляем слеш в конце папки, если его нет
    If Right(sp, 1) <> Application.PathSeparator Then
        sp = sp & Application.PathSeparator
    End If
    'запоминаем имя активной книги
    sfn = ActiveWorkbook.Name
    'если книга не в формате xlsx
    If ActiveWorkbook.FileFormat <> 51 Then
        sfn = sfn & "x"
        ActiveWorkbook.SaveAs sp & sfn, 51
        Application.Workbooks.Open sp & sfn, False
    End If
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#21

07.02.2018 09:51:40

Дмитрий Щербаков,
Спасибо за наводку =))) Я только учюсь поэтому ещё мозг не так работает.

Вот код, может конечно не идеальный но работает. добавил к коду

Код
Private Sub CommandButton1_Click()
    Dim oldFName$
    Dim newFName As String
    Dim PathCurrentBook As String
    oldFName = ActiveWorkbook.FullName
    newFName = oldFName & "x"
    PathCurrentBook = ActiveWorkbook.Path
    ActiveWorkbook.SaveAs oldFName & "x", 51
    Kill oldFName
    ActiveWorkbook.Close
    Workbooks.Open Filename:=newFName
End Sub

По поводу множества открытых xls тоже спасибо, буду иметь в виду. Но в практике обычно открывается один файл с ним происходят преобразования, он анализируется, после уже открывается другой файл и т.д.
Возможно в будущем возникнет жделание группового одномоментного преобразования.

Всем спасибо (особоенно RAN, Ігор Гончаренко, Дмитрий Щербаков, )! Решение найдено.

ps Дмитрий Щербаков протестирую ваш код.

Дмитрий Щербаков, с if красивее и удобнее, спасибо =)

Изменено: g.tomilin07.02.2018 11:09:52

Что такое всё?

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#22

07.02.2018 11:28:36

RAN,
подскажите пожалуйста что значит значек $ в

Код
Dim oldFName$

Что такое всё?

 

эквивалентно Dim OldName as String
есть у Basic такая возможность — указать тип переменной, используя последним символом в имени переменной предусмотренные для этого символы
читайте

тут

Изменено: Ігор Гончаренко07.02.2018 13:06:19

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко,Спасибо за объяснение все понятно.
Это делается для краткости?

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#25

07.02.2018 18:47:35

Именно.

PS

Цитата
g.tomilin написал:
добавил к коду

Не могли бы вы прокомментировать, что делают, и зачем сделаны добавки?

Изменено: RAN07.02.2018 18:53:47

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#26

08.02.2018 09:15:57

RAN, не верно скопировал

Private Sub CommandButton1_Click()    
   Dim oldFName$
   Dim newFName As String — содержит путь в новому файл чтобы потом его открыть
   Dim PathCurrentBook As String — забыл что FullName содержит ещё и путь поэтому добавлял переменную
   oldFName = ActiveWorkbook.FullName
   newFName = oldFName & «x»записываем новое имя путь
   PathCurrentBook = ActiveWorkbook.Path — аналогично вышеуказанной ошибке
   ActiveWorkbook.SaveAs oldFName & «x», 51
   Kill oldFName
   ActiveWorkbook.Closeэто для закрытия книги, как я писал для того чтобы снять режим совместимости
   Workbooks.Open Filename:=newFName — ну и открыть собственно новый файл
End Sub

Т.е. если просто пересохранить файл в xlsx то остается режим совместимости, поэтому нужно закрыьт и заново открыть преобразованную книгу.

Изменено: g.tomilin08.02.2018 09:38:01

Что такое всё?

This is somewhat a continuation on my previous post VBA – Convert XLS to XLSX in which I provided a simple little procedure to upgrade an older xls file to the newer xlsx file format.

I thought to myself, would it be nice to have a more versatile function that could migrate between various other common file formats.

So I set out to take my original function and transform it to enable to user to specify the desired output format and came up with a nice function that enabled anyone to converts Excel compatible files to another Excel compatible format.

Then I said to myself, it must be possible to do something similar for Word and set out to create a function that would enable people to convert file between the various Word compatible formats.

Below are the 2 functions I came up with.

Excel File Format Conversion Function

The following function can be used to convert files between:

  • csv -> xlsx
  • xls -> xlsx
  • xls -> xlsm
  • xls -> txt
  • xlsx -> txt
  • xlsx -> csv
  • and so on…
Enum XlFileFormat
    'Ref: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlfileformat-enumeration-excel
    xlAddIn = 18    'Microsoft Excel 97-2003 Add-In *.xla
    xlAddIn8 = 18    'Microsoft Excel 97-2003 Add-In *.xla
    xlCSV = 6    'CSV *.csv
    xlCSVMac = 22    'Macintosh CSV *.csv
    xlCSVMSDOS = 24    'MSDOS CSV *.csv
    xlCSVWindows = 23    'Windows CSV *.csv
    xlCurrentPlatformText = -4158    'Current Platform Text *.txt
    xlDBF2 = 7    'Dbase 2 format *.dbf
    xlDBF3 = 8    'Dbase 3 format *.dbf
    xlDBF4 = 11    'Dbase 4 format *.dbf
    xlDIF = 9    'Data Interchange format *.dif
    xlExcel12 = 50    'Excel Binary Workbook *.xlsb
    xlExcel2 = 16    'Excel version 2.0 (1987) *.xls
    xlExcel2FarEast = 27    'Excel version 2.0 far east (1987) *.xls
    xlExcel3 = 29    'Excel version 3.0 (1990) *.xls
    xlExcel4 = 33    'Excel version 4.0 (1992) *.xls
    xlExcel4Workbook = 35    'Excel version 4.0. Workbook format (1992) *.xlw
    xlExcel5 = 39    'Excel version 5.0 (1994) *.xls
    xlExcel7 = 39    'Excel 95 (version 7.0) *.xls
    xlExcel8 = 56    'Excel 97-2003 Workbook *.xls
    xlExcel9795 = 43    'Excel version 95 and 97 *.xls
    xlHtml = 44    'HTML format *.htm; *.html
    xlIntlAddIn = 26    'International Add-In No file extension
    xlIntlMacro = 25    'International Macro No file extension
    xlOpenDocumentSpreadsheet = 60    'OpenDocument Spreadsheet *.ods
    xlOpenXMLAddIn = 55    'Open XML Add-In *.xlam
    xlOpenXMLStrictWorkbook = 61    '(&;H3D) Strict Open XML file *.xlsx
    xlOpenXMLTemplate = 54    'Open XML Template *.xltx
    xlOpenXMLTemplateMacroEnabled = 53    'Open XML Template Macro Enabled *.xltm
    xlOpenXMLWorkbook = 51    'Open XML Workbook *.xlsx
    xlOpenXMLWorkbookMacroEnabled = 52    'Open XML Workbook Macro Enabled *.xlsm
    xlSYLK = 2    'Symbolic Link format *.slk
    xlTemplate = 17    'Excel Template format *.xlt
    xlTemplate8 = 17    ' Template 8 *.xlt
    xlTextMac = 19    'Macintosh Text *.txt
    xlTextMSDOS = 21    'MSDOS Text *.txt
    xlTextPrinter = 36    'Printer Text *.prn
    xlTextWindows = 20    'Windows Text *.txt
    xlUnicodeText = 42    'Unicode Text No file extension; *.txt
    xlWebArchive = 45    'Web Archive *.mht; *.mhtml
    xlWJ2WD1 = 14    'Japanese 1-2-3 *.wj2
    xlWJ3 = 40    'Japanese 1-2-3 *.wj3
    xlWJ3FJ3 = 41    'Japanese 1-2-3 format *.wj3
    xlWK1 = 5    'Lotus 1-2-3 format *.wk1
    xlWK1ALL = 31    'Lotus 1-2-3 format *.wk1
    xlWK1FMT = 30    'Lotus 1-2-3 format *.wk1
    xlWK3 = 15    'Lotus 1-2-3 format *.wk3
    xlWK3FM3 = 32    'Lotus 1-2-3 format *.wk3
    xlWK4 = 38    'Lotus 1-2-3 format *.wk4
    xlWKS = 4    'Lotus 1-2-3 format *.wks
    xlWorkbookDefault = 51    'Workbook default *.xlsx
    xlWorkbookNormal = -4143    'Workbook normal *.xls
    xlWorks2FarEast = 28    'Microsoft Works 2.0 far east format *.wks
    xlWQ1 = 34    'Quattro Pro format *.wq1
    xlXMLSpreadsheet = 46    'XML Spreadsheet *.xml
End Enum

'---------------------------------------------------------------------------------------
' Procedure : XLS_ConvertFileFormat
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Converts an Excel compatible file format to another format
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sOrigFile     : String - Original file path, name and extension to be converted
' lNewFileFormat: New File format to save the original file as
' bDelOrigFile  : True/False - Should the original file be deleted after the conversion
'
' Usage:
' ~~~~~~
' Convert an xls file into a txt file and delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.xls", xlTextWindows)
' Convert an xls file into a xlsx file and NOT delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.xls", False)
' Convert a csv file into a xlsx file and delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.csv", xlWorkbookDefault, True)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2018-02-27              Initial Release
' 2         2020-12-31              Fixed typo xlDBF24 -> xlDBF4
'---------------------------------------------------------------------------------------
Function XLS_ConvertFileFormat(ByVal sOrigFile As String, _
                               Optional lNewFileFormat As XlFileFormat = xlOpenXMLWorkbook, _
                               Optional bDelOrigFile As Boolean = False) As Boolean
    '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library
    #Const EarlyBind = False    'Use Late Binding
    #If EarlyBind = True Then
        'Early Binding Declarations
        Dim oExcel            As Excel.Application
        Dim oExcelWrkBk       As Excel.Workbook
    #Else
        'Late Binding Declaration/Constants
        Dim oExcel            As Object
        Dim oExcelWrkBk       As Object
    #End If
    Dim bExcelOpened          As Boolean
    Dim sOrigFileExt          As String
    Dim sNewXLSFileExt        As String

    'Determine the file extension associated with the requested file format
    'for properly renaming the output file
    Select Case lNewFileFormat
        Case xlAddIn, xlAddIn8
            sNewFileExt = ".xla"
        Case xlCSV, xlCSVMac, xlCSVMSDOS, xlCSVWindows
            sNewFileExt = ".csv"
        Case xlCurrentPlatformText, xlTextMac, xlTextMSDOS, xlTextWindows, xlUnicodeText
            sNewFileExt = ".txt"
        Case xlDBF2, xlDBF3, xlDBF4
            sNewFileExt = ".dbf"
        Case xlDIF
            sNewFileExt = ".dif"
        Case xlExcel12 = 50    'Excel Binary Workbook *.xlsb
            sNewFileExt = ".xlsb"
        Case xlExcel2, xlExcel2FarEast, xlExcel3, xlExcel4, xlExcel5, xlExcel7, _
             xlExcel8, xlExcel9795, xlWorkbookNormal
            sNewFileExt = ".xls"
        Case xlExcel4Workbook = 35    'Excel version 4.0. Workbook format (1992) *.xlw
            sNewFileExt = ".xlw"
        Case xlHtml = 44    'HTML format *.htm; *.html
            sNewFileExt = ".html"
        Case xlIntlAddIn, xlIntlMacro
            sNewFileExt = ""
        Case xlOpenDocumentSpreadsheet    'OpenDocument Spreadsheet *.ods
            sNewFileExt = ".ods"
        Case xlOpenXMLAddIn    'Open XML Add-In *.xlam
            sNewFileExt = ".xlam"
        Case xlOpenXMLStrictWorkbook, xlOpenXMLWorkbook, xlWorkbookDefault = 51
            sNewFileExt = ".xlsx"
        Case xlOpenXMLTemplate    'Open XML Template *.xltx
            sNewFileExt = ".xltx"
        Case xlOpenXMLTemplateMacroEnabled     'Open XML Template Macro Enabled *.xltm
            sNewFileExt = ".xltm"
        Case xlOpenXMLWorkbookMacroEnabled     'Open XML Workbook Macro Enabled *.xlsm
            sNewFileExt = ".xlsm"
        Case xlSYLK     'Symbolic Link format *.slk
            sNewFileExt = ".slk"
        Case xlTemplate, xlTemplate8    ' Template 8 *.xlt
            sNewFileExt = ".xlt"
        Case xlTextPrinter        'Printer Text *.prn
            sNewFileExt = ".prn"
        Case xlWebArchive         'Web Archive *.mht; *.mhtml
            sNewFileExt = ".mhtml"
        Case xlWJ2WD1        'Japanese 1-2-3 *.wj2
            sNewFileExt = ".wj2"
        Case xlWJ3, xlWJ3FJ3    'Japanese 1-2-3 format *.wj3
            sNewFileExt = ".wj3"
        Case xlWK1, xlWK1ALL, xlWK1FMT   'Lotus 1-2-3 format *.wk1
            sNewFileExt = ".wk1"
        Case xlWK3, xlWK3FM3   'Lotus 1-2-3 format *.wk3
            sNewFileExt = ".wk3"
        Case xlWK4       'Lotus 1-2-3 format *.wk4
            sNewFileExt = ".wk4"
        Case xlWKS, xlWorks2FarEast      'Lotus 1-2-3 format *.wks
            sNewFileExt = ".wks"
        Case xlWQ1       'Quattro Pro format *.wq1
            sNewFileExt = ".wq1"
        Case xlXMLSpreadsheet       'XML Spreadsheet *.xml
            sNewFileExt = ".xml"
    End Select

    'Determine the original file's extension for properly renaming the output file
    sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, "."))

    'Start Excel
    On Error Resume Next
    Set oExcel = GetObject(, "Excel.Application")          'Bind to existing instance of Excel
    If Err.Number <> 0 Then          'Could not get instance of Excel, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oExcel = CreateObject("Excel.Application")
    Else          'Excel was already running
        bExcelOpened = True
    End If
    On Error GoTo Error_Handler

    oExcel.ScreenUpdating = False
    oExcel.Visible = False         'Keep Excel hidden until we are done with our manipulation
    Set oExcelWrkBk = oExcel.Workbooks.Open(sOrigFile)    'Open the original file
    'Save it as the requested new file format
    oExcelWrkBk.SaveAS Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat, , , , False
    XLS_ConvertFileFormat = True    'Report back that we managed to save the file in the new format
    oExcelWrkBk.Close False    'Close the workbook
    If bExcelOpened = False Then
        oExcel.Quit    'Quit Excel only if we started it
    Else
        oExcel.ScreenUpdating = True
        oExcel.Visible = True
    End If

    If bDelOrigFile = True Then Kill (sOrigFile)    'Delete the original file if requested

Error_Handler_Exit:
    On Error Resume Next
    Set oExcelWrkBk = Nothing
    Set oExcel = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: XLS_ConvertFileFormat" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    oExcel.ScreenUpdating = True
    oExcel.Visible = True         'Make excel visible to the user
    Resume Error_Handler_Exit
End Function

Word File Format Conversion Function

The following function can be used to convert files between:

  • doc -> docx
  • docx -> dotx
  • docx -> pdf
  • docx -> html
  • and so on…
Enum WdSaveFormat
    'Ref: https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdsaveformat-enumeration-word
    wdFormatDocument = 0    'Microsoft Office Word 97 - 2003 binary file format.
    wdFormatDOSText = 4    'Microsoft DOS text format.  *.txt
    wdFormatDOSTextLineBreaks = 5    'Microsoft DOS text with line breaks preserved.  *.txt
    wdFormatEncodedText = 7    'Encoded text format.  *.txt
    wdFormatFilteredHTML = 10    'Filtered HTML format.
    wdFormatFlatXML = 19    'Open XML file format saved as a single XML file.
'    wdFormatFlatXML = 20    'Open XML file format with macros enabled saved as a single XML file.
    wdFormatFlatXMLTemplate = 21    'Open XML template format saved as a XML single file.
    wdFormatFlatXMLTemplateMacroEnabled = 22    'Open XML template format with macros enabled saved as a single XML file.
    wdFormatOpenDocumentText = 23    'OpenDocument Text format. *.odt
    wdFormatHTML = 8    'Standard HTML format. *.html
    wdFormatRTF = 6    'Rich text format (RTF). *.rtf
    wdFormatStrictOpenXMLDocument = 24    'Strict Open XML document format.
    wdFormatTemplate = 1    'Word template format.
    wdFormatText = 2    'Microsoft Windows text format. *.txt
    wdFormatTextLineBreaks = 3    'Windows text format with line breaks preserved. *.txt
    wdFormatUnicodeText = 7    'Unicode text format. *.txt
    wdFormatWebArchive = 9    'Web archive format.
    wdFormatXML = 11    'Extensible Markup Language (XML) format. *.xml
    wdFormatDocument97 = 0    'Microsoft Word 97 document format. *.doc
    wdFormatDocumentDefault = 16    'Word default document file format. For Word, this is the DOCX format. *.docx
    wdFormatPDF = 17    'PDF format. *.pdf
    wdFormatTemplate97 = 1    'Word 97 template format.
    wdFormatXMLDocument = 12    'XML document format.
    wdFormatXMLDocumentMacroEnabled = 13    'XML document format with macros enabled.
    wdFormatXMLTemplate = 14    'XML template format.
    wdFormatXMLTemplateMacroEnabled = 15    'XML template format with macros enabled.
    wdFormatXPS = 18    'XPS format. *.xps
End Enum

'---------------------------------------------------------------------------------------
' Procedure : Word_ConvertFileFormat
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Converts a Word compatible file format to another format
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sOrigFile     : String - Original file path, name and extension to be converted
' lNewFileFormat: New File format to save the original file as
' bDelOrigFile  : True/False - Should the original file be deleted after the conversion
'
' Usage:
' ~~~~~~
' Convert a doc file into a docx file but retain the original copy
'   Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF)
' Convert a doc file into a docx file and delete the original doc once converted
'   Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF, True)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2018-02-27              Initial Release
'---------------------------------------------------------------------------------------
Function Word_ConvertFileFormat(ByVal sOrigFile As String, _
                                Optional lNewFileFormat As WdSaveFormat = wdFormatDocumentDefault, _
                                Optional bDelOrigFile As Boolean = False) As Boolean
    '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library
    #Const EarlyBind = False    'Use Late Binding
    #If EarlyBind = True Then
        'Early Binding Declarations
        Dim oWord             As Word.Application
        Dim oDoc              As Word.Document
    #Else
        'Late Binding Declaration/Constants
        Dim oWord             As Object
        Dim oDoc              As Object
    #End If
    Dim bWordOpened           As Boolean
    Dim sOrigFileExt          As String
    Dim sNewFileExt           As String

    'Determine the file extension associated with the requested file format
    'for properly renaming the output file
    Select Case lNewFileFormat
        Case wdFormatDocument
            sNewFileExt = "."
        Case wdFormatDOSText, wdFormatDOSTextLineBreaks, wdFormatEncodedText, wdFormatOpenDocumentText, wdFormatText, wdFormatTextLineBreaks, wdFormatUnicodeText
            sNewFileExt = ".txt"
        Case wdFormatFilteredHTML, wdFormatHTML
            sNewFileExt = ".html"
        Case wdFormatFlatXML, wdFormatXML, wdFormatXMLDocument
            sNewFileExt = ".xml"
        Case wdFormatFlatXMLTemplate
            sNewFileExt = "."
        Case wdFormatFlatXMLTemplateMacroEnabled
            sNewFileExt = "."
        Case wdFormatRTF
            sNewFileExt = ".rtf"
        Case wdFormatStrictOpenXMLDocument
            sNewFileExt = "."
        Case wdFormatTemplate
            sNewFileExt = "."
        Case wdFormatWebArchive
            sNewFileExt = "."
        Case wdFormatDocument97
            sNewFileExt = ".doc"
        Case wdFormatDocumentDefault
            sNewFileExt = ".docx"
        Case wdFormatPDF
            sNewFileExt = ".pdf"
        Case wdFormatTemplate97
            sNewFileExt = "."
        Case wdFormatXMLDocumentMacroEnabled
            sNewFileExt = ".docm"
        Case wdFormatXMLTemplate
            sNewFileExt = ".doct"
        Case wdFormatXMLTemplateMacroEnabled
            sNewFileExt = "."
        Case wdFormatXPS
            sNewFileExt = ".xps"
    End Select

    'Determine the original file's extension for properly renaming the output file
    sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, "."))

    'Start Excel
    On Error Resume Next
    Set oWord = GetObject(, "Word.Application")            'Bind to existing instance of Word
    If Err.Number <> 0 Then            'Could not get instance of Word, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oWord = CreateObject("Word.Application")
    Else            'Word was already running
        bWordOpened = True
    End If
    On Error GoTo Error_Handler

    oWord.Visible = False           'Keep Word hidden until we are done with our manipulation
    Set oDoc = oWord.Documents.Open(sOrigFile)      'Open the original file
    'Save it as the requested new file format
    oDoc.SaveAs2 Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat
    Word_ConvertFileFormat = True      'Report back that we managed to save the file in the new format
    oDoc.Close False      'Close the document
    If bWordOpened = False Then
        oWord.Quit      'Quit Word only if we started it
    Else
        oWord.Visible = True 'Since it was already open, ensure it is visible
    End If

    If bDelOrigFile = True Then Kill (sOrigFile)      'Delete the original file if requested

Error_Handler_Exit:
    On Error Resume Next
    Set oDoc = Nothing
    Set oWord = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: XLS_ConvertFileFormat" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    oWord.Visible = True           'Make excel visible to the user
    Resume Error_Handler_Exit
End Function

Missing File Extensions

Unlike the Excel function, the Word function is currently missing some of the file extensions. I created the general framework, but could not easily find the associated file extensions to some of the file format. You need only complete the missing entry and it will work. So simply update the

sNewFileExt = "."

entries as applicable.

If you’ve worked with Excel before, you’re probably quite familiar with 2 basic commands for saving workbooks:

  • Save.
  • Save As.

Excel VBA Tutorial about how to save workbooks and filesIt may not surprise you to know that, when working with VBA, you can carry out these same activities.

In fact, knowing how to save Excel workbooks using VBA is essential. As you work with Visual Basic for Applications, you’ll notice that saving workbooks is one of the most important things your macros can do.

Due to the importance of knowing how to save workbooks using VBA, this Excel tutorial focuses on this particular topic:

How to save an Excel workbook using VBA.

In addition to providing some examples of VBA code that you can use to save workbooks, I explain the basics surrounding 4 VBA methods that you’re likely to encounter and use constantly while saving workbooks. The following table of contents shows the specific topics that I explain in this Excel tutorial:

This Excel tutorial doesn’t cover the topic of saving an Excel workbook as PDF using VBA. I explain how to export an Excel file to PDF using macros, and provide several code examples, here.

Let’s start taking a look at the basic ways to save an Excel workbook using VBA.

How To Save An Excel Workbook Using the Workbook.Save VBA Method

The most basic method to save Excel workbooks using VBA is the Workbook.Save method. Workbook.Save saves the relevant workbook.

In other words, the Workbook.Save method is, roughly, the VBA equivalent of the Save command in Excel.

The syntax of the Workbook.Save method is as follows:

expression.Save

Where “expression” is the relevant Workbook object you want to save.

Let’s take a look at an example to make this clearer. The following macro, named “Save_Workbook”, saves the current active workbook:

ActiveWorkbook.Save macro

This Excel VBA Save Workbook Tutorial is accompanied by an Excel workbook containing the data and macros I use (including the Save_Workbook macro). You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.

Notice that the macro has only 1 statement which follows the general syntax of the Workbook.Save method explained above:

ActiveWorkbook.Save

In this case, ActiveWorkbook is a simplified reference to the Application.ActiveWorkbook property. This property returns a Workbook object, as required by the Workbook.Save method. The workbook that is returned by the ActiveWorkbook property is, more precisely, the workbook in the current active window.

In summary, the sample Save_Workbook macro above simply saves the current active Excel workbook.

Just as when working directly with Excel, the Save method is an important command/method that is relatively easy and straightforward to execute. However, it doesn’t allow you to determine much in connection with the way the relevant Excel workbook is saved. The workbook is saved and that’s pretty much it.

When working directly in Excel, you use the Save As command if you want to be able to determine more about the way the actual saving of a workbook takes place. Things work in a similar fashion within Visual Basic for Applications.

More precisely, when working with Visual Basic for Applications, you can use the SaveAs method for these purposes. So let’s take a look at:

How To Save An Excel Workbook Using The Workbook.SaveAs VBA Method

The arguments or parameters of a method are what allows you to determine the characteristics of the action that a particular method performs.

As explained above, the Workbook.Save method doesn’t have any parameters. As a consequence, you can’t really determine much about how the relevant workbook is saved.

The Workbook.SaveAs method is different. Its 12 parameters allow you to further determine several aspects about the way in which an Excel workbook is saved. In other words, Workbook.SaveAs is more flexible and complex than Workbook.Save.

Workbook.SaveAs is, roughly speaking, the VBA equivalent of the Save As command in Excel. Therefore, it allows you to save a workbook in a particular file. The complete syntax of the Workbook.SaveAs method is as follows:

expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode,ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

“expression” is, just as in the case of the Workbook.Save method above, the relevant Workbook object.

All of the parameters (which appear within parentheses) of the SaveAs method are optional. However, in order to understand what this method can help you with, I explain these parameters below.

However, as usual, I use a practical macro example for purposes of illustrating how Workbook.SaveAs works. So let’s start by taking a look at the basic VBA code of the macro example:

How To Save An Excel Workbook With A New Name Using The Workbook.SaveAs Method

The following piece of VBA code saves the current active workbook with a new name provided by the user.

Dim workbook_Name As Variant

workbook_Name = Application.GetSaveAsFilename

If workbook_Name <> False Then

ActiveWorkbook.SaveAs Filename:=workbook_Name

End If

The following screenshot shows the VBA code behind the example macro (called “Save_Workbook_NewName”) which is included in the Excel workbook that accompanies this Excel VBA Save Workbook Tutorial. You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.

VBA code with ActiveWorkbook.SaveAs

This macro can be divided in the following 3 parts:

Save workbook VBA code with sections

Let’s take a quick look at each of these parts to understand how the Save_Workbook_NewName macro works:

Part #1: Dim workbook_Name As Variant

This statement simply declares a variable named workbook_Name. The variable is of the Variant data type.

Even though Variant variables are sometimes undesirable, in this particular case that’s not necessarily the case. A Variant variable allows the GetSaveAsFilename (which I introduce below) to be quite flexible.

As implied by its name, and made evident by the following parts of the macro, the purpose of the workbook_Name variable is to store the new name of the saved Excel workbook.

Part #2: workbook_Name = Application.GetSaveAsFilename

This statement assigns a value to the workbook_Name variable. Which value is actually assigned is determined by the Application.GetSaveAsFilename method, which I explain thoroughly below.

At its most basic level, the GetSaveAsFilename method, does the following 2 things:

  • Step #1: Displays the Save As dialog box.

    You’re probably quite familiar with this dialog box, as it’s the one Excel displays when you execute the Save As command.

    Save As dialog displayed by GetSaveAsFilename

  • Step #2: Once the user has provided a file name through the Save As dialog box, GetSaveAsFilename gets that particular name.

    This is the name that the whole statement we’re analyzing assigns to the variable workbook_Name.

Note that the Application.GetSaveAsFilename method doesn’t actually save a file. It simply gets a name.

To actually save the file using the name provided by the GetSaveAsFilename method, you usually rely on the Workbook.SaveAs method. This method is used in the last part of the Save_Workbook_NewName macro:

Part #3: If workbook_Name <> False Then ActiveWorkbook.SaveAs Filename:=workbook_Name End If

This is an If… Then… Else statement. These type of statements conditionally execute a particular group of statement depending on whether a condition is met or not. The statement begins with the word If. The whole block finishes with the End If statement.

In the case of the Save_Workbook_NewName macro, the If… Then… Else statement proceeds as follows:

Step #1: Test Whether workbook_Name <> False.

The first part of the If… Then… Else statement carries out a logical test. This logical test seeks to confirm whether the variable workbook_Name has a value that is different from (<>) the logical value False.

If the value of workbook_Name isn’t False, the logical test (workbook_Name <> False) evaluates to True. In such a case, the statements within the If… Then… Else are executed.

However, if the value of workbook_Name is equal to the Boolean value False, the logical test evaluates to False. In this case, the conditional statements aren’t executed.

For purposes of this logical test, the value of the variable workbook_Name is that assigned in the previous part. Therefore, the value depends on the input given by the user when the Save As dialog box is displayed. More precisely:

  • If the user cancels the Save As dialog box, the value of workbook_Name is False.
  • If the user provides a file name through the Save As dialog box, the value of the workbook_Name variable is (generally) that assigned by the user.

In other words:

  • If the user provides a file name:
    • The logical test carried out by the first part of the If… Then… Else statement is True; and
    • The conditional statements that follow are executed.
  • If the user cancels the Save As dialog box (by, for example, clicking on the Cancel button):
    • The logical test is False; and
    • The conditional statements within the If… Then… Else statement aren’t executed.

Step#2: Execute The Statement ActiveWorkbook.SaveAs Filename:=workbook_Name If The Tested Condition Is True.

You already know that, roughly speaking, the logical test workbook_Name <> False returns True if the user has assigned a file name through the Save As dialog box.

In such case, the following statement is executed:

ActiveWorkbook.SaveAs Filename:=workbook_Name

This is where the Workbook.SaveAs method comes into play. This statement does the following:

  • Step #1: Uses the Application.ActiveWorkbook property to return the workbook in the current active window.
  • Step #2: Saves the active workbook in a file whose name is that given by the user through the Save As dialog displayed by the GetSaveAsFilename method.

In this particular case, only 1 argument of the Workbook.SaveAs method is used: Filename. The Filename argument, as implied by its name, allows you to specify the name of the saved workbook.

I explain more about the Filename argument, and the other arguments of the SaveAs method, in the sections below.

If the tested condition isn’t true, no further statements are executed. In other words, the workbook isn’t saved when the used has cancelled the Save As dialog box.

The Workbook.SaveAs Method: Parameters

The following table introduces the 10 most important optional parameters of the Workbook.SaveAs method:

Position Name Description
1 Filename Name of saved workbook.
2 FileFormat File format for saved workbook.
3 Password Protection password for saved workbook
4 WriteResPassword Write-reservation password for saved workbook.
5 ReadOnlyRecommended Determines whether workbook is saved as read-only recommended.
6 CreateBackup Determines whether a backup file of the saved workbook is created.
7 AccessMode Determines the access mode of the saved workbook.
8 ConflictResolution Applies only if saved workbook is shared.

Determines how conflicts that show up when saving are resolved.

9 AddToMru Determines whether saved workbook is added to list of recently used files.
12 Local Determines whether the workbook is saved against the language of Excel (usually local) or VBA (usually US-English).

2 parameters of the SaveAs method (#10, TextCodepage and #11, TextVisualLayout) aren’t included in the table above nor explained below. According to Microsoft’s Official Documentation (at the time of writing), both of these parameters are ignored.

Let’s take a closer look at each of the individual arguments of Workbook.SaveAs:

Argument #1: Filename

As implied by its name, you use the Filename argument of the Workbook.SaveAs method to specify the name of the saved workbook.

When working with the Filename argument, you can either:

  • Specify the full file path; or
  • Don’t specify the file path.

If you don’t specify the file path, Excel saves the workbook in the current folder.

For most users, specifying the file path isn’t very convenient. You (or the user) need to specify accurate file paths, names and extensions. The approach is tedious and error prone.

This is the main reason why the Application.GetSaveAsFilename used in the Save_Workbook_NewName is so helpful: it allows the user to browse the different folders and easily specify the full file path and name of the saved Excel workbook.

The initial basic version of the Save_Workbook_NewName macro uses the Filename argument, as shown in the screenshot below:

VBA code saves workbook with Filename argument

Argument #2: FileFormat

You can use the FileFormat argument of the Workbook.SaveAs method to specify the file format of the saved file.

If you don’t use the FileFormat argument, Excel determines the file format as follows:

  • In the case of workbooks that already exist, the workbook is saved using the same file format as the last time.
  • If the workbook is new, the workbook is saved using the format of the Excel version you’re using.

Even though this parameter (as all other arguments of the SaveAs method) is optional, you may want to develop the habit of using it.

You specify a particular file format using the XlFileFormat enumeration. The Microsoft Developer Network lists more than 50 different possible values.

In practice, you’re unlikely to need/use so many different formats. In fact, some of the formats that are listed at the Microsoft Developer Network are not supported in the more recent versions of Excel.

Therefore, I provide a basic overview and breakdown of the XlFileFormat values that you may actually encounter. Even though this list is much shorter than that at the Microsoft Developer Network, you’re still likely to use only a subset of the values I explain below.

The following are the 4 main file formats in Excel 2007-2013:

  • 50: xlExcel12.
  • 51: xlOpenXMLWorkbook.
  • 52: xlOpenXMLWorkbookMacroEnabled.
  • 56: xlExcel8.

As a general rule, it’s better to use the FileFormat values (numbers) instead of the names. The reason for this is that this avoids some compilation problems whenever you execute the relevant macro in an older version of Excel that may not recognize the name.

So let’s a look at some of the values that the FileFormat argument can take:

Value Name Description
Add-Ins And Templates
17 xlTemplate / xlTemplate8 Template / Template 8.

Generally used in versions between Excel 97 and Excel 2003.

18 xlAddIn / xlAddIn8 Excel 1997 to 2003 Add-In.
53 xlOpenXMLTemplateMacroEnabled Macro-Enabled Open XML template.
54 xlOpenXMLTemplate Open XML template.
55 xlOpenXMLAddIn Open XML Add-In.
Text Files
-4158 xlCurrentPlatformText Text file format for platform in which workbook is saved.
2 xlSYLK Symbolic Link Format file.

Only the active sheet is saved.

6 xlCSV CSV (comma-separated values) text file format.
9 xlDIF Data Interchange Format file.

Only saves the current active sheet.

19 xlTextMac Mac text file format. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlTestMac saves only the active sheet.

20 xlTextWindows Windows text file format. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlTestWindows saves only the active sheet.

21 xlTextMSDOS MSDOS text file format. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlTestMSDOS saves only the active sheet.

22 xlCSVMac CSV file format for Mac platform. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlCSVMac saves only the active sheet.

23 xlCSVWindows CSV file format for Windows platform. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlCSVWindows saves only the active sheet.

24 xlCSVMSDOS CSV file format for MS-DOS platform. Ensures that basic formatting (such as tab and line breaks) and characters are interpreted correctly.

xlCSVMSDOS saves only the active sheet.

36 xlTextPrinter Formatted text file.

Only saves the current active worksheet.

42 xlUnicodeText Unicode text file format.
Spreadsheets (Excel and Others)
-4143 xlWorkbookNormal Excel workbook file format.
39 xlExcel5 / xlExcel7 Excel versions from 1993 (Excel 5.0) and 1995 (Excel 7.0).
43 xlExcel9795 Excel versions from 1995 and 1997.

However, as explained by author Richard Mansfield in Mastering VBA for Microsoft Office 2013, this file format is generally compatible with Excel 95 and later versions.

46 xlXMLSpreadsheet XML spreadsheet file format.

Generally used in Excel 2003.

50 xlExcel12 Excel 2007 version.
51 xlOpenXMLWorkbook / xlWorkbookDefault Open XML workbook / Workbook default file format.
52 xlOpenXMLWorkbookMacroEnabled Macro-Enabled Open XML workbook.
56 xlExcel8 Excel version from 1997.
60 xlOpenDocumentSpreadsheet Open Document Spreadsheet file format.

OpenDocument Spreadsheet files can be opened using spreadsheet applications that use the OpenDocument Spreadsheet format. Examples of such applications are Google Sheets, Open Office Calc and Excel itself.

Formatting may be affected when saving or opening Open Document Spreadsheet files.

61 (&H3D) xlOpenXMLStrictWorkbook ISO Strict Open XML file format.
Clipboard Files
44 xlHtml HTML / webpage file format.

If you save the Excel workbook to a CSV or text file format, the following 2 things happen:

  • Excel selects the code page to use by checking the system locale configuration in the computer where the workbook is saved. The code page used is the one corresponding to the language for the system locale in use. In Windows 10, you can find these settings by going to Settings > Time & Language > Region & Language.
  • Excel saves the file in logical layout. This is relevant, in particular, when working with files containing bi-directional text, where text may be in different directions (left-to-right and right-to-left). Whenever text in one direction is embedded within text in the other direction, the logical layout saves the file in such a way that the reading order is correct for all languages being used, regardless of their directionality. Then, when such a file is opened later, all the text within the file is (generally) displayed in the appropriate direction. This direction is determined by the character value ranges of the code page being used.

Let’s go back to the sample Save_Workbook_NewName. The following screenshot shows how the VBA code of this macro looks like when I add the FileFormat argument and set its value to 52 (Macro-Enabled Open XML workbooks).

VBA code saves workbook with FileFormat argument

Argument #3: Password

The Password argument of the Workbook.SaveAs method allows you to (as you may expect) enter a password to protect the saved Excel workbook.

The Password argument has the following 3 main characteristics:

  • Is a string.
  • Is case-sensitive.
  • Its maximum length is 15 characters.

The following screenshot shows the VBA code behind the Save_Workbook_NewName macro with a password. In this case, the password is “Excel Tutorial”.

VBA code to save workbook with Password argument

If you save a workbook using a macro such as the above, next time anyone (you or another user) tries to open the Excel workbook, Excel displays the Password dialog.

Password dialog box generated by VBA

If the wrong password is entered, Excel doesn’t open the workbook. Instead, it displays a warning.

Excel warns about incorrect password

Argument #4: WriteResPassword

The WriteResPassword parameter of the Workbook.SaveAs method is, in some ways, similar to the Password argument that I explain above. However, Password and WriteResPassword differ in one essential characteristic:

They protect different things.

As explained above, Password protects the workbook. If you (or the relevant user) fail to provide the correct password, Excel doesn’t open the workbook.

WriteResPassword protects the write-reservation characteristic of the workbook. To see what this is, and how it works in practice, I add the WriteResPassword argument to the Save_Workbook_NewName macro. The password for these purposes is “Excel Course”.

VBA code to save workbook with WriteResPassword

The dialog box that Excel displays to ask for the WriteResPassword is slightly different than the one it uses when asking for the Password. Notice how it informs that the user who has saved the workbook reserved it and provides 2 options:

  • You can enter the password and Excel grants you write access.
  • Otherwise, you can open the workbook as read-only.

Password dialog for WriteResPassword generated by VBA

If I choose to open the workbook as read-only, Excel does precisely so. In that case, it warns in a few places that the workbook is read-only and changes aren’t saved.

Excel warns workbook is read-only

If you enter the wrong WriteResPassword, Excel reacts in the same way as it does when you enter the wrong Password (as shown above). In other words, it doesn’t open the workbook and displays the following message:

Incorrect WriteResPassword warning in Excel

Argument #5: ReadOnlyRecommended

The ReadOnlyRecommended argument provides you with a less strict way (when compared with the WriteResPassword above) to protect the Excel workbook you’re saving.

More precisely, if you set a particular workbook to be read-only recommended, Excel displays a message making such recommendation whenever the file is opened.

Excel message when opening read-only recommended workbook

Setting a workbook to be read-only recommended doesn’t actually protect or reserve the workbook in the same way as the Password or the WriteResPassword do. Any user can open a read-only recommended Excel workbook normally (not as read-only) by, for example:

  • Clicking “No” in the dialog box above.
  • Setting the IgnoreReadOnlyRecommended argument of the Workbooks.Open argument to True when opening the workbook using VBA.

To determine that an Excel workbook is read-only recommended, you simply set the ReadOnlyRecommended argument to True.

VBA code to save workbook with ReadOnlyRecommended

Argument #6: CreateBackup

The CreateBackup argument of the Workbook.SaveAs method allows you to determine whether a backup of the workbook being saved is created.

If you want to create a backup of the saved Excel workbook, set the CreateBackup argument to True.

VBA code saves workbook and creates backup

Argument #7: AccessMode

The AccessMode argument allows you to specify the access mode for the saved workbook. This argument can take the following 3 values:

  • 1: Stands for xlNoChange. In this case, the default access mode is used.
  • 2: Represents xlShared. In this case, the access mode is share list.
  • 3: Value for xlExclusive. In this scenario, access mode is exclusive mode.

The following screenshot shows the VBA code of the Save_Workbook_NewName macro with the AccessMode parameter set to xlNoChange:

VBA Sub procedure with Workbook.SaveAs and AccessMode

Argument #8: ConflictResolution

ConflictResolution applies when you’re working with shared workbooks. More precisely, this argument allows you to determine how conflicts (while saving the Excel workbook) are resolved.

You can set the ConflictResolution parameter to any of the following 3 values:

  • 1: Stands for xlUserResolution. In this case, Excel displays a dialog box asking the user to resolve the conflict. This is the default setting in case you omit the ConflictResolution argument.
  • 2: Represents xlLocalSessionChanges. If you choose this value, the changes made by the local user are accepted always.
  • 3: The value for xlOtherSessionChanges. This is the opposite from the above: the changes made by the local user are rejected always.

The following screenshot shows the code of the Save_Workbook_NewName macro with the ConflictResolution parameter set to the default xlUserResolution.

Example VBA code with ConflictResolution when saving

Argument #9: AddToMru

MRU stands for Most Recently Used. This makes reference to Excel’s list of most recently used files which, generally, you find on the Backstage View.

List of Most Recently Used workbooks in Excel

The AddToMru argument of the Workbook.Save method allows you to determine whether the saved workbook is added to this most recently used list.

If AddToMru is set to True, the Excel workbook is added to the list. The default value of AddToMru is, however, False.

In the following image, you can see the VBA code behind the sample Save_Workbook_NewName macro with AddToMru set to True:

AddToMru argument in VBA

As mentioned above, I’m not covering in detail the TextCodePage and TextVisualLayout arguments (arguments #10 and #11).

Argument #12: Local

The last argument of the Workbook.SaveAs method is Local. As implied by its name, Local refers to language and localization aspects of the saved workbook.

More precisely, the Local parameter allows you to determine whether the saved workbook is saved against the language of:

  • Excel, as generally determined from the control panel setting; or
  • VBA, which is usually US-English. The basic exception to this rule of VBA’s language being US-English occurs when the VBA project that executes the Workbook.SaveAs method is an internationalized XL5/95 VBA project. My guess is that you’re unlikely to work with such projects often.

To determine how Excel proceeds in connection with this topic, you can set the Local argument to True or False.

  • True: Saves the workbook against Excel’s language.
  • False: Saves the Excel workbook against VBA’s language.

In the following image, you can see the sample Save_Workbook_NewName with the Local parameter set to True:

Example VBA code wih Local argument

How To Save A Copy Of An Excel Workbook Using The Workbook.SaveCopyAs VBA Method

The Save and SaveAs methods explained above are the basic methods you’ll need to save Excel workbooks using VBA.

However, both of these methods save and modify the current open Excel workbook. You may encounter some situations where this isn’t the outcome you desire.

In other words, you’ll probably be in situations where you want a macro to simply:

  • Save a copy of the current Excel workbook, but…
  • Don’t actually modify the current file in the memory of the computer.

These type of situations are great for using the Workbook.SaveCopyAs VBA method. This method does precisely this. It takes the workbook and:

  • Saves a copy to a file.
  • Doesn’t modify it in memory.

The syntax of the SaveCopyAs method is, once again, relatively simple:

expression.SaveCopyAs(Filename)

Just as with the other methods explored in this Excel tutorial, “expression” represents a Workbook object. “Filename”, the only parameter of the SaveCopyAs method is the full file path, name and extension of the copy that you’re saving.

Since you’re likely to use this method on the active workbook most of the time, you’ll probably end up using the following syntax often:

ActiveWorkbook.SaveCopyAs(Filename)

Another commonly used alternative is to use the ThisWorkbook property instead of ActiveWorkbook. The main difference between ThisWorkbook and ActiveWorkbook is that:

  • ActiveWorkbook refers to the current active workbook.
  • ThisWorkbook refers to the workbook where the macro is actually stored.

Let’s take a look at an example of a macro that uses the Workbook.SaveCopyAs method to save a copy of the current active workbook:

The screenshot below shows a macro called “Save_Copy_Workbook”.

VBA code to save copy of workbook

This macro has a single (quite long) statement. This goes as follows:

ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & “Copy ” & Format(Now, “yy-mm-dd”) & ” ” & ActiveWorkbook.Name

Notice that the structure I use in the Save_Copy_Workbook macro follows the basic syntax of the Workbook.SaveCopyAs method explained above. However, let’s split the statement in 2 parts in order to understand better what’s going on, and what can this particular method do for you:

VBA code saving Excel workbook copy

Part #1: ActiveWorkbook.SaveCopyAs

This is the reference to the SaveCopyAs method. It follows the basic syntax explained above.

“ActiveWorkbook” makes reference to the Application.Workbook property. This property returns a Workbook object representing the current active workbook. This active workbook is the one which is manipulated by the SaveCopyAs method.

In other words, the statement simply tells Excel to proceed as follows:

  • Step #1: Take the current active workbook.
  • Step #2: Save a copy of the current active workbook, without actually modifying it in memory.

Part #2: Filename:=ActiveWorkbook.Path & “Copy ” & Format(Now, “yy-mm-dd”) & ” ” & ActiveWorkbook.Name

This part of the statement specifies the only argument of the Workbook.SaveCopyAs method:

The Filename.

This particular file name for the copy is slightly long but, basically, is built by concatenating 5 items. You use the ampersand (&) operator to concatenate the different items.

Item #1: ActiveWorkbook.Path

This makes reference to the Workbook.Path property. The Path property returns the complete path to the relevant workbook.

In the case of the example above, “ActiveWorkbook.Path” is used to get the path to the current active workbook.

Let’s assume, for example, that the current active workbook (called “Book1”) is saved in the D drive. In this case the path is, simply “D:”.

This sample path (D:) isn’t very long or complicated. However, in practice, you’re more likely to work with longer and more complicated paths that you are to work with just the D drive.

Items #2 And #4: “Copy ” and ” “

This are, simply, text strings. The first string specifies that the first word in the file name is “Copy”. The second string adds a space ( ).

Item #3: Format(Now, “yy-mm-dd”)

This particular statement uses 2 VBA built-in functions, as follows:

  • Now returns today’s date and the current time. Alternatively, you can use the Date function, which returns the current date.
  • Format takes the date returned by Now and formats it according to the date format “yy-mm-dd”.

In other words, this part of the argument is responsible for returning the date in which the copy is saved in the format yy-mm-dd.

For example, if the date in which you save the copy of the workbook is November 30 of 2015, this item returns 15-11-30.

Item #5: ActiveWorkbook.Name

This item uses the Workbook.Name property to get the name of the workbook.

For example, if the name of the workbook is “Best Excel Tutorial”, Workbook.Name returns exactly that.

In order to make everything clear regarding the Workbook.SaveCopyAs method, let’s take a look at an example:

How To Save A Copy Of An Excel Workbook Using The Workbook.SaveCopyAs VBA Method: An Example

Let’s assume that the current active workbook is called “Best Excel Tutorial” and is saved in the D drive (D:). This is how the D drive looks like before I run the sample Save_Copy_Workbook macro:

D Drive before macro to save workbook copy

The following screenshot shows how the same drive looks after I run the macro. Notice how, now, there’s a new Excel workbook. This is the copy created by the Save_Copy_Workbook Sub procedure.

D Drive after saving copy of workbook using VBA

Let’s go back to the Filename argument of the SaveCopyAs method used within the Save_Copy_Workbook macro:

Filename:=ActiveWorkbook.Path & “Copy ” & Format(Now, “yy-mm-dd”) & ” ” & ActiveWorkbook.Name

Notice how, each of the 5 items explained above expresses itself in practice once the macro is run:

  • Item #1: The copy is saved in the same folder as the original workbook, as given by the Workbook.Path property.
  • Items #2 and #4: The first word in the actual workbook name is Copy, as determined by the string “Copy”. Also, there is a space between the date (15-11-19) and the original workbook’s name (Best Excel Tutorial) as specified by ” “.
  • Item #3: The date in which the workbook is saved (November 19 of 2015 in the example above) is added to the name in the format yy-mm-dd (15-11-19).
  • Item #5: The name of the original workbook (Best Excel Tutorial) is added at the end of the copy’s name.

The following image shows this:

D Drive showing items of VBA code for workbook name

How To Name A Workbook Using The Application.GetSaveAsFilename Method

I introduced the Application.GetSaveAsFilename method above. This method is used by one of the sample macros (Save_Workbook_NewName) for purposes of opening the Save As dialog box and allow users to easily browse and enter the path, name and file extension of the saved Excel workbook.

The screenshot below shows the VBA code of the Save_Workbook_NewName macro. Notice the presence of the Application.GetSaveAsFilename method.

VBA code to name an Excel workbook

The Application.GetSaveAsFilename method doesn’t actually save a file. However, GetSaveAsFilename is a helpful method to use whenever you have a macro that needs to get a file name from the user in order to, among others, save a workbook.

GetSaveAsFilename is useful when the procedure needs to receive/know the name of the file to save. This gives the user the possibility of specifying the file’s path and filename.

As I explain below, you can use the Application.GetSaveAsFilename method precisely for these purposes.

The GetSaveAsFilename method has a few parameters that allow you to customize some of its characteristics. Let’s take a closer look at the method itself and its arguments, starting with:

The Application.GetSaveAsFilename Method: Purpose

The Application.GetSaveAsFilename method does 2 things:

  1. Displays the Save As dialog box.
  2. Gets the file name entered by the user in the Save As dialog box.

GetSaveAsFilename doesn’t save a workbook by itself. That’s why, for example, the Save_Workbook_NewName macro above includes uses the Workbook.SaveAs method to actually save the Excel workbook.

The Application.GetSaveAsFilename Method: Syntax

The full syntax of the Application.GetSaveAsFilename method is as follows:

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

“expression” is used to represent the Application object. You’re, therefore, likely to usually use the following basic syntax for this method:

Application.GetSaveAsFilename

This is the syntax used in the version of the Save_Workbook_NewName method shown above.

All of the 5 arguments of the GetSaveAsFilename method are optional. Let’s take a look at them:

The Application.GetSaveAsFilename Method: Arguments

The following table provides a basic description of the 5 parameters of the Application.GetSaveAsFilename method. I explain each of them more thoroughly below.

Position Name Description
1 InitialFilename Specifies a suggested/default file name.
2 FileFilter Determines file filtering criteria.
3 FilterIndex Determines the default file filter.
4 Title Determines the title of the (usually called) Save As dialog box.
5 ButtonText Applies only in the Mac platform.

Determines the text of the (normally called) Save As button.

There are quite a few similarities between the GetSaveAsFilename method and the GetOpenFilename method (which I describe here). In terms of their arguments, the main differences are as follows:

  • GetSaveAsFilename has the InitialFilename argument. GetOpenFilename doesn’t.
  • GetOpenFilename has the MultiSelect argument. GetSaveAsFilename doesn’t.

Both of these differences make sense. For example, MultiSelect allows you to determine whether a user can select multiple file names at the same time. This makes sense in the context of opening files. But not in the context of saving files with the GetSaveAsFilename method.

Let’s take a look at each of the parameters introduced above:

Argument #1: InitialFilename

The InitialFilename of the Application.GetSaveAsFilename method allows you to set a suggested file name. This suggested file name is the one that appears, by default, in the File name box of the Save As dialog.

Excel Save As dialog with suggested file name

The Save As dialog box displayed above is the result of running the following version of the Save_Workbook_NewName macro. Notice that the InitialFilename argument is added and the suggested name is “Best Excel Tutorial”, as displayed in the image above.

VBA code to name workbook showing InitialFileName

Argument #2: FileFilter

The FileFilter argument of the Application.GetSaveAsFilename method allows you to determine the criteria for file filtering within the Save As dialog box.

These file filtering criteria determine what appears in the Save as type drop-down list box of the Save As dialog box. If you omit the FileFilter argument, the default (as shown in the image below) is All Files.

Excel Save as dialog with file filters

This isn’t ideal because it may lead to the saved Excel workbook being of an unrecognizable file type if the user doesn’t enter the file extension when saving the file.

However, my guess is that you’ll be in situations where specifying the file filtering criteria is more convenient or, even, necessary. In order to be able to determine which file filters appear in the Save As dialog box, you’ll need to follow the 4 guidelines below.

Don’t worry if the guidelines don’t seem that clear at first. I show you a practical example of VBA code after making the introduction and basic description.

Guideline #1: Each Filter Consists Of A Pair Of Strings.

Each filter you specify when using the FileFilter argument is made up of 2 strings separated by a comma. This looks, roughly, as follows:

String1,String2

String1 and String2 have different structures and purposes. More precisely:

  • String1: Is a descriptive string. This string determines what actually appears in the Save as type drop-down box of the Save As dialog box.
  • String2: Is the MS-DOS wildcard file-type filter specification. In other words, this string determines how the files are actually filtered depending on their file format.

You don’t need to follow many guidelines regarding the way in which the first string (String1) is specified. However, you do need to follow a more specific syntax when specifying the second string (String2). Let’s take a look at it:

Guideline #2: Syntax To Specify The File-Type Filter.

The second string that you use to specify a file filter is itself composed of 3 elements which are, generally speaking, as follows:

  • Element #1: An asterisk (*), used as a wildcard.
  • Element #2: A dot (.).
  • Element #3: An indication of the file extension used to filter the files. This particular element is usually composed of (where appropriate) an asterisk (*), used as a wildcard, and/or (if appropriate), some text.

The most basic filter is all files, which in practice means that there’s no filter. To specify a file-type filter than includes all files using the syntax above, you’d type asterisk dot asterisk (*.*).

Other examples of file-type filter specifications following this syntax are the following:

  • *.txt for text files.
  • *.xla for add-ins.
  • *.xlsx for Excel workbooks.
  • *.xlsm for Macro-Enable Excel workbooks.
  • *.xls for Excel 97 to Excel 2003 workbooks.
  • *.csv for CSV files.

Knowing these first 2 guidelines is enough for you to start using the FileFilter argument. However, they only explain how to specify a single filter according to a single file type.

However, when working with FileFilter, you can actually specify:

  • Several different filters; as well as
  • Several different file types for each filter.

The next 2 guidelines show how you can do each of these:

Guideline #3: Syntax To Specify Several Filters.

You can create more than a single filter with the FileFilter argument. In order to so, use commas (,) to separate the filters. In other words, separate each of the pair of strings that constitute a filter from the other pair of strings by using commas (,).

This looks, roughly, as follows:

String1Filter1,String2Filter1,String1Filter2,String2Filter2

Guideline #4: Syntax To Specify Several File Types In A Single Filter.

If you need to filter according to several different data types, you can use several filters by using the syntax explained above.

Alternatively, you can specify several data types for a particular single filter. To do this, separate the MS-DOS wildcard expressions that you use with semicolons (;). This looks roughly as follows:

String1,String2.1;String2.2

Those are the 4 basic guidelines you need to bear in mind to start using the FileFilter argument. Let’s go back to the Save_Workbook_NewName macro and create some file filters:

The following screenshot shows (again) the VBA code behind Save_Workbook_NewName. Notice that the FileFilter argument has been inserted and its syntax follows all of the guidelines I explained above.

VBA code to name saved workbook with file filters

To make this clearer, let’s break the argument value into its different parts and highlight how it complies with all of the guidelines described above.

The complete argument is as follows:

“Excel Workbook,*.xlsx,Excel Macro-Enabled Workbook,*xlsm,Excel Templates,*.xltx;*.xltm”

Notice the following things:

  1. There are 3 filters. Each of the filters is separated from the other by commas (,).

    VBA code to name saved workbook with 3 filters

  2. Each filter is composed of 2 parts: a descriptive string and the relevant MS-DOS wildcard file-type filter specification. These 2 parts are separated by commas (,).

    VBA code to name saved workbook with parts of filters

  3. MS-DOS wildcard file-type filter specifications follow the syntax described above: (i) asterisk (*); (ii) dot (.); and (iii) file extension specification, without wildcard asterisks in this case.

    VBA code with file type filters

  4. The last filter uses 2 different file types. These file types are separated by a semicolon (;).

    VBA code to name saved workbook with 2 file-type filters

The following image shows how all of the above looks like in practice. Notice how, now, there are 3 different options within the Save as Type box of the Save As dialog box. These 3 filters are those created by the FileFilter argument of the Application.GetSaveAsFilename method.

Excel Save As dialog with filters created in VBA

Argument #3: FilterIndex

Notice how, in the image above, the default file filtering criteria is “Excel Workbook”. This is the first filter that was specified with the FileFilter argument.

You can, however, change the default file filtering criteria by using the FilterIndex argument. You do this by specifying the index number of the criteria you want to set as default.

As a consequence of the above, the FilterIndex argument can take any value between 1 (the first filter) and the number of filters you’ve specified with the FileFilter argument (3 in the example above).

If you set the FilterIndex value to a number higher than the amount of available filters (4 or higher in the case of the Save_Workbook_NewName macro), the first filter is used. In other words, the practical result of specifying an index number that is too high, is the same as that of omitting the FilterIndex parameter.

The following screenshot shows the code of the Save_Workbook_NewName macro with the FilterIndex parameter set to 2.

VBA code to name saved workbook with filter index

In the case of this macro, a FilterIndex value of 2 means that “Excel Macro-Enabled Workbook” is the new default filter.

Save As dialog with filter index from VBA

Argument #4: Title

The Title argument of the Application.GetSaveAsFilename method allows you to modify the title of the (usually called) Save As dialog box. If you omit the argument, the default title (Save As) is maintained.

The following image shows how this argument can be used to change the title of the Save As dialog box when executing the Save_Workbook_NewName macro. In this case, the Title argument is set to “VBA Save Excel Workbook”.

VBA code to name saved workbook and Title argument

When this macro is executed, the (previously called) Save As dialog looks as follows. Notice that the title has indeed changed to “VBA Save Excel Workbook”.

Excel Save As dialog with title from VBA

Argument #5: ButtonText

The ButtonText parameter is only applicable in the Mac platform. If you use this argument in Windows, it’s simply ignored.

For those cases where it is applicable, the ButtonText argument allows you to set the text that appears in the (usually known as) Save button.

Excel Save As dialog with Save button

Conclusion

Knowing how to save Excel workbooks using VBA is essential.

If you’ve read this Excel tutorial, you now know the basics of how to save workbooks using VBA. In fact, you’ve seen 3 different ways to achieve this:

  • Using the Workbook.Save method.
  • Using the Workbook.SaveAs method.
  • Using the Workbook.SaveCopyAs method.

Each of these cases is explained with the help of a real example of VBA code.

Additionally, in the last section of this blog post, I explained the Application.GetSaveAsFilename method. Even though this method doesn’t actually save a file by itself, it allows you to display the Save As dialog so that the users of your macro can easily specify the path and file name of the workbook they’re saving.

Excel VBA Save As

VBA Save As is the method used to save the Excel file to a specific location. To save the workbook using VBA code, we use the object Workbook with the SaveAs function.

After all the hard work we have done in the workbook, we save it. It is painful to lose the data we have worked on. We have two kinds of saves in Excel or any file. One is “Save,” and another is “Save As.” Ctrl + S is the popular shortcut key as the Ctrl + C and Ctrl + V around the globe. But we are not that familiar with the concept of “Save As.” The worksheet shortcutAn Excel shortcut is a technique of performing a manual task in a quicker way.read more to Save As the file in the regular worksheet is the F12 key. In VBA, too, we can save the file as “Save As.”

Table of contents
  • Excel VBA Save As
    • What does VBA Save As Function do?
    • How to use Save As Function?
      • Example #1
      • Example #2
    • Recommended Articles

VBA-Save-As

What does VBA Save As Function do?

It is a general task of saving work in the automation process. Finally, after all the work, we wish to save the file.

Workbooks("Sales 2019.xlsx").Save

This code reads a Workbook named “Sales 2019.xlsx” to save.

Similarly, replicating the workbook we are working on can be created using the “Save As” method.

SaveAs Syntax

  • File Name: What is the file name you wish to give? One should combine this with the file folder path.
  • File Format: What should be the format for the file you are saving?
  • Password: Would you like to provide a password for the saving file?
  • Write Res Password: Mention the reserved password for the workbook.

We think these parameters are enough to understand the Save As method.

How to use Save As Function?

You can download this VBA Save As Excel Template here – VBA Save As Excel Template

Example #1

We save a workbook, right? so it is important to mention the workbook name and its extension to use the SaveAs method. So, mention the workbook you are saving.

Code:

Sub SaveAs_Example1()

  Workbooks("Sales 2019.xlsx").

End Sub

VBA Save As Example 1

Now, use the Save As method.

Code:

Sub SaveAs_Example1()

Workbooks("Sales 2019.xlsx").SaveAs

End Sub

VBA Save As Example 1-1

Now, identify where you want to save.

Code:

Sub SaveAs_Example1()

Workbooks("Sales 2019.xlsx").SaveAs "D:Articles2019

End Sub

Example 1-2

Now, put backslash and enter the file name as per your wish with a file extension.

Code:

Sub SaveAs_Example1()

Workbooks("Sales 2019.xlsx").SaveAs "D:Articles2019My File.xlsx"

End Sub

Example 1-3

Now, mention the file format as “xlWorkbook.”

Code:

Sub SaveAs_Example1()

Workbooks("Sales 2019.xlsx").SaveAs "D:Articles2019My File.xlsx", FileFormat:=xlWorkbook

End Sub

Example 1-4

It will save the file in D drive > Folder Name (Articles) > Sub Folder Name (2019).

Example #2

Save All the Opened Workbooks

Assume you are working with 10 workbooks on your computer. You want to create a backup of these workbooks by saving them on the computer as one of the copies. When you want to work with more than one workbook, it is necessary to use the loops.

The below code will help you save all the workbooks as a copy.

Code:

Sub SaveAs_Example2()

  Dim Wb As Workbook

  For Each Wb In Workbooks
  ActiveWorkbook.SaveAs "D:Articles2019" & ActiveWorkbook.Name & ".xlsx"
  'Change the file path
  Next Wb

End Sub

VBA Save As Example 2

You can use this code if you wish to select your folder path.

Code:

Sub SaveAs_Example3()

 Dim FilePath As String

FilePath = Application.GetSaveAsFilename

ActiveWorkbook.SaveAs Filename:=FilePath & ".xlsx", FileFormat:=xlOpenXMLWorkbook

End Sub

VBA Save As Example 3

When you run this code using the F5 key or manually, it will ask you to select the destination folder path. Select and click on “OK.” It will save the file.

Recommended Articles

This article has been a guide to VBA Save As. Here, we learn how to use Save As to save an Excel workbook, examples, and downloadable templates. Below are some useful articles related to VBA: –

  • Use of DoEvents in VBA
  • If Else in VBA
  • Intersect in VBA
  • Font Color in VBA
  • VBA Borders

Like this post? Please share to your friends:
  • Excel vba file not saved
  • Excel vba file not found
  • Excel vba file get
  • Excel vba exportasfixedformat from to
  • Excel vba export to pdf