To save an Excel workbook using VBA, you need to use the SAVE method to write a macro. And in that macro, you need to specify the workbook that you want to save and then use the SAVE method. When you run this code, it works like the keyboard shortcut (Control + S).
- Specify the workbook hat you want to save.
- Type a dot to get the list of all the properties and methods.
- Select the “Save” method out of those or type “Save”
- In the end, run the code to save the workbook.
In this tutorial, we will look at different ways that we can use to save a workbook. So make sure to open the VBA editor from the developer tab to use the code you have in this tutorial.
Helpful Links: Run a Macro – Macro Recorder – Visual Basic Editor – Personal Macro Workbook
Save the ActiveWorkbook
If you want to save the active workbook in that case you can use a code like the following code, instead of specifying the workbook by its name.
ActiveWorkbook.Save
When you use the ActiveWorkbook as the workbook, VBA always refers to the workbook which is active despite in which file you are writing the code.
Save the Workbook where you are Writing Code
If you want to save the file where you are writing the code you need to use “ThisWorkbook” instead of the workbook name.
ThisWorkbook.Save
Save All the Open Workbooks
Here we can use a loop to loop through all the workbooks that are open and save them one by one. Look at the below code.
Sub vba_save_workbook()
'variable to use as a workbook
Dim wb As Workbook
'For each to loop through each open workbook and save it
For Each wb In Workbooks
wb.Save
Next wb
End Sub
The above code uses the FOR EACH loop in each workbook it uses the SAVE method to each file one by one.
Note: If you are trying to save a workbook with the SAVE method that is not saved already, Excel will show a dialog box to ask for your permission to save that file, and then you need to choose if you want to save that file on the default location in the default format.
Now here’s the point: As you are using a macro to save the workbook, that file should be saved in the macro-enabled format and the best way to deal with this situation is to use the SAVE AS method (we’ll see in the next section of this tutorial).
To SAVE a file that is not saved yet, using VBA, you need to use the SAVE AS method. In this method, you can define the file name and the path where you want to save the file, and apart from that, there are ten more arguments that you can define.
expression.SaveAs (FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
In the following code, you don’t have any argument with the “SAVE AS” method.
When you run this code, it asks you a few things, like, which format you want to use to save the file, do you want to replace the existing file that is already saved with the same name. So it’s better to define the use of some of the arguments.
Save As File on the Current Location
By default, VBA uses the current location to save the file. When you write code with the SAVE AS method and just specify the name that file straight goes to the current folder. You can see in the following code where you have the which saves the active workbook.
Sub save_as_file()
ActiveWorkbook.SaveAs Filename:="myNewWorkbook"
End Sub
Save As File on a Specific Location
The filename argument also allows you to use the location path in case you want to use a different location to save the file.
Sub save_as_file()
ActiveWorkbook.SaveAs _
Filename:="C:UsersDellDesktopmyNewBook"
End Sub
In the above code, you have the path in the FileName argument and VBA uses that path to the file.
Note: You can also use this method to check if a workbook exists in a folder or not before you use the SAVE AS method to save it on a particular location and you can learn more about SAVE AS method from here.
More on VBA Workbooks
VBA Close Workbook | VBA Delete Workbook | VBA ThisWorkbook | VBA Rename Workbook | VBA Activate Workbook | VBA Combine Workbook | VBA Protect Workbook (Unprotect) | VBA Check IF a Workbook is Open | VBA Open Workbook | VBA Check IF an Excel Workbook Exists in a Folder| VBA Create New Workbook (Excel File)
- VBA Workbook
In this Article
- Save Workbook – VBA
- Save a Specified Workbook
- Save the Active Workbook
- VBA Coding Made Easy
- Save the Workbook Where the Code is Stored
- Save all Open Workbooks
- Save all open workbooks that were not opened ReadOnly
- Save a workbook defined by a variable
- Save a workbook defined by a string variable
- Save a workbook defined by the order it was opened.
- Save a workbook based on a cell value
- Save As – VBA
- SaveAs Syntax:
- Save As Syntax Examples:
- Workbook Save As – Same Directory
- Workbook Save As – New Directory
- Workbook Save As – New Directory, Specify File Extension
- Workbook Save As – New Directory, Specify File Extension – Alt Method
- Workbook Save As – Add Password to Open File
- Workbook Save As – Add Password for Write Privileges
- Workbook Save As – Read-Only Recommended
- Other Save As Examples
- Create Save As Dialog Box
- Create Save As Dialog Box with Default File Name Provided
- Create Save As Dialog Box with Default File Name Provided
- Create & Save New Workbook
- Disable Save Alerts
This VBA Tutorial covers how to save a file using the Save and Save As commands in VBA.
Save Workbook – VBA
The VBA Save command saves an Excel file similarly to clicking the Save icon or using the Save Shortcut (CTRL + S).
Save a Specified Workbook
To save a workbook, reference the workbook object and use the Save command.
Workbooks("savefile.xlsm").Save
Save the Active Workbook
Note: This is the current active workbook from with in the VBA code, which is different from ThisWorkbook which contains the running code.
ActiveWorkbook.Save
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Save the Workbook Where the Code is Stored
ThisWorkbook.save
Save all Open Workbooks
This will loop through all open workbooks, saving each one.
Dim wb as workbook
For Each wb In Application.Workbooks
wb.Save
Next wb
Save all open workbooks that were not opened ReadOnly
Note: opening a workbook in ReadOnly mode prevents the file from being saved.
To save the file you will need to use Save As and save the file with a different name.
Dim wb as workbook
For Each wb In Application.Workbooks
If not wb.ReadOnly then
wb.Save
End if
Next wb
Save a workbook defined by a variable
This will save a workbook that was assigned to a workbook object variable.
Dim wb as workbook
set wb = workbooks("savefile.xlsm")
wb.save
Save a workbook defined by a string variable
This will save a workbook that’s name was saved to a string variable.
Dim wbstring as string
wbstring = "savefile.xlsm"
workbooks(wbstring).save
Save a workbook defined by the order it was opened.
Note: The first workbook opened would have 1, the second 2, etc.
workbooks(1).save
VBA Programming | Code Generator does work for you!
Save a workbook based on a cell value
This will save a workbook that’s name is found in a cell value.
Dim wbstring as string
wbstring = activeworkbook.sheets("sheet1").range("wb_save").value
workbooks(wbstring).save
Save As – VBA
The VBA Save As command saves an Excel file as a new file, similar to clicking the Save As icon or using the Save As Shortcut (Alt > F > A).
Above, we identified all the ways to specify which workbook to save. You can use those exact same methods to identify workbooks when using Save As.
Save As behaves similarly to Save, except you also need to specify the name of the new file.
In fact, Save As has many potential variables to define:
SaveAs Syntax:
workbook object .SaveAs(FileName, FileFormat, Password, WriteResPassword, _
ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, _
AddToMru,TextCodepage, TextVisualLayout, Local)
A full description of all of the SaveAs arguments is included below. For now we will focus on the most common examples.
Note: These arguments can be entered as string with parenthesis or as defined variables.
Save As Syntax Examples:
Workbook Save As – Same Directory
ActiveWorkbook.SaveAs Filename:= "new"
or
ActiveWorkbook.SaveAs "new"
or
Dim wbstring as string
wbstring = "new"
ActiveWorkbook.SaveAs Filename:= wbstring
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Workbook Save As – New Directory
ActiveWorkbook.SaveAs Filename:= "C:new"
or
Dim wbstring as string
wbstring = "C:new"
ActiveWorkbook.SaveAs Filename:= wbstring=
Workbook Save As – New Directory, Specify File Extension
ActiveWorkbook.SaveAs Filename:= "C:new.xlsx"
or
Dim wbstring as string
wbstring = "C:new.xlsx"
ActiveWorkbook.SaveAs Filename:= wbstring
Workbook Save As – New Directory, Specify File Extension – Alt Method
You can also specify the file format in it’s own argument.
.xlsx = 51 '(52 for Mac)
.xlsm = 52 '(53 for Mac)
.xlsb = 50 '(51 for Mac)
.xls = 56 '(57 for Mac)
ActiveWorkbook.SaveAs Filename:= "C:new", FileFormat:= 51
Workbook Save As – Add Password to Open File
ActiveWorkbook.SaveAs Filename:= "C:new.xlsx", Password:= "password"
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Workbook Save As – Add Password for Write Privileges
If correct password is not supplied then workbook opens as Read-Only
ActiveWorkbook.SaveAs Filename:= "C:new.xlsx", WriteRes:= "password"
Workbook Save As – Read-Only Recommended
TRUE to display a message box, recommending that the file is opened read-only.
ActiveWorkbook.SaveAs Filename:= "C:new.xlsx", ReadOnlyRecommended:= TRUE
Other Save As Examples
Create Save As Dialog Box
This Generates the Save As Dialog Box, prompting the user to Save the file.
Keep in mind that this simple code may not be appropriate in all cases.
Application.GetSaveAsFilename
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Create Save As Dialog Box with Default File Name Provided
Application.GetSaveAsFilename InitialFilename:="test.xlsx"
Create Save As Dialog Box with Default File Name Provided
Application.GetSaveAsFilename InitialFilename:="test.xlsx"
Create & Save New Workbook
This will create a new workbook and immediately save it.
Dim wb As Workbook
Set wb = Workbooks.Add
Application.DisplayAlerts = False
wb.SaveAs Filename:=”c:Test1.xlsx”
Application.DisplayAlerts = True
Disable Save Alerts
As you work with saving in VBA, you may come across various Save Warnings or Prompts. To disable warnings, add this line of code:
Application.DisplayAlerts=False
and to re-able alerts:
Application.DisplayAlerts=True
If you’ve worked with Excel before, you’re probably quite familiar with 2 basic commands for saving workbooks:
- Save.
- Save As.
It 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:
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.
This macro can be divided in the following 3 parts:
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.
- 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:
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).
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”.
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.
If the wrong password is entered, Excel doesn’t open the workbook. Instead, it displays a warning.
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”.
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.
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.
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:
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.
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.
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.
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:
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.
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.
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:
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:
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”.
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:
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:
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.
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:
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.
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:
- Displays the Save As dialog box.
- 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.
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.
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.
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.
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:
- There are 3 filters. Each of the filters is separated from the other by commas (,).
- 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 (,).
- 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.
- The last filter uses 2 different file types. These file types are separated by a semicolon (;).
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.
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.
In the case of this macro, a FilterIndex value of 2 means that “Excel Macro-Enabled Workbook” is the new default filter.
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”.
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”.
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.
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 и SaveAs объекта Workbook, параметр SaveChanges метода Close.
Сохранение существующего файла
Сохранить существующий открытый файл рабочей книги Excel из кода VBA можно несколькими способами. В примерах используется выражение ActiveWorkbook, которое может быть заменено на ThisWorkbook, Workbooks(«ИмяКниги.xlsx»), Workbooks(myFile.Name), где myFile — объектная переменная с присвоенной ссылкой на рабочую книгу Excel.
Простое сохранение файла после внесенных кодом VBA Excel изменений:
Сохранение файла под другим именем (исходная рабочая книга будет автоматически закрыта без сохранения внесенных изменений):
ActiveWorkbook.SaveAs Filename:=«C:ТестоваяНоваяКнига.xlsx» |
Сохранить файл рабочей книги можно перед закрытием, используя параметр SaveChanges метода Close со значением True:
ActiveWorkbook.Close SaveChanges:=True |
Чтобы закрыть файл без сохранения, используйте параметр SaveChanges метода Close со значением False:
ActiveWorkbook.Close SaveChanges:=False |
Сохранение файла под другим именем при закрытии рабочей книги:
ActiveWorkbook.Close SaveChanges:=True, Filename:=«C:ТестоваяНоваяКнига.xlsx» |
Если в примерах с методом Close параметр SaveChanges пропустить, будет открыто диалоговое окно с запросом о сохранении файла.
Новая книга сохраняется с указанием полного имени:
Workbooks.Add ActiveWorkbook.SaveAs Filename:=«C:ТестоваяНоваяКнига.xlsx» |
После этого к новой книге можно обращаться по имени: Workbooks ("НоваяКнига.xlsx")
.
Если не указать полное имя для сохраняемого файла:
Workbooks.Add ActiveWorkbook.Save |
тогда новая книга будет сохранена с именем и в папке по умолчанию, например: Книга1.xlsx, Книга2.xlsx, Книга3.xlsx и т.д. в папке «Документы».
VBA Save Sheet as Workbook Excel Macro Code
VBA code to save sheet as Workbook example code will help us to save a specific sheet as new workbook. We can use Copy and SaveAs methods of Workbook to copy and save the sheet into new workbook. In this example we will see how to save Active Sheet and specific worksheet as new excel file using VBA. And this code should work for all the version of Microsoft Excel 2003, Excel 2007, Excel 2010, and Excel 2013.
VBA code to save Sheet as New Workbook
Here is the Example VBA syntax and Example VBA code to save a Sheet as New Workbook. This will help you to how to save a worksheet as New Workbook using VBA.
VBA Save Sheet as Workbook: Syntax
Following is the VBA Syntax and sample VBA code to Save a Sheet as Workbook using VBA. We are using the Copy and SaveAs methods of the Excel Workbook object.
WORKBOOK1.SHEETS(“WORKSHEET1).COPY BEFORE:= WORKBOOK2.SHEETS(1)
WORKBOOK. SAVEAS “FILE PATH TO SAVE”
Here workbooks can be ActiveWorkbook, ThisWorkbook or a workbook assigned to an object.
ActiveWorkbook. Workbook1 is your source workbook and Worksheet1 is your sheet to copy. And Workbook2 is the destination sheet and sheets(1) and before key words tells Excel to copy the worksheet before the first sheet of workbook2.
Here you can observe that we are copying the worksheet in the first statement. We are using Copy method of workbook to copy the worksheet. Then we are saving the file in as specific location using SaveAs method of Workbook.
Save Worksheet as New Workbook using VBA: Examples
The following VBA code is to Copy the worksheet into new workbook and Save in a specific folder.
Sub sb_Copy_Save_Worksheet_As_Workbook() Dim wb As Workbook Set wb = Workbooks.Add ThisWorkbook.Sheets("Sheet1").Copy Before:=wb.Sheets(1) wb.SaveAs "C:temptest1.xlsx" End Sub
Instructions to run the vba code to save a worksheet as new Excel Workbook
Please follow the below steps to execute the vba code to save the worksheet as new excel file.
Step 1: Open any existing Excel workbook
Step 2: Press Alt+F11 – This will open the VBA Editor
Step 3: Insert a code module from then insert menu
Step 4: Copy the above code and paste in the code module which have inserted in the above step
Step 5: Change the code as per your requirement
Step 6: Change the file path as per your testing folder
Step 6: Now press F5 to execute the code
Now you can observe that your worksheet is saved as new Excel workbook in the specified folder.
Explained VBA Code to Save worksheet as new Workbook
‘Starting a procedure to save a worksheet as new workbook
Sub sb_Copy_Save_Worksheet_As_Workbook_C()
‘Declaring a variable as workbook to store the newly creating workbook
Dim wb As Workbook
‘adding a new workbook and seting to wb object
Set wb = Workbooks.Add
‘Copying a worksheet from ThisWorkbook into newly creadted workbook in the above statement
ThisWorkbook.Sheets(“Sheet1”).Copy Before:=wb.Sheets(1)
‘Saving the newly created Excel workbook into required folder with specific workbook name
wb.SaveAs “C:temptest1.xlsx”
‘Ending sub procdure to save a worksheet as new workbook
End Sub
Save Active Sheet as New Workbook using VBA: Examples
The following VBA code is to Copy the active worksheet into new workbook and Save in a specific folder.
Sub sb_Copy_Save_ActiveSheet_As_Workbook() Set wb = Workbooks.Add ThisWorkbook.Activate ActiveSheet.Copy Before:=wb.Sheets(1) wb.Activate wb.SaveAs "C:temptest3.xlsx"End Sub
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
Related Posts
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
38 Comments
-
The code works, however, I like to do a save as rather than to a particular drive that is written into the code. .Can you show me this change please.
-
renato lacerda
October 28, 2014 at 1:42 AM — ReplyHi.
Maybe this can help.
Sub sb_Copy_Save_ActiveSheet_As_Workbook(path As String, file As String)
Set wb = Workbooks.Add
ThisWorkbook.Activate
ActiveSheet.Copy After:=wb.Sheets(wb.Sheets().Count)
wb.Activate
If Right(path, 1) = ” Then path = Left(path, Len(path) – 1)
If MsgBox(“O nome do arquivo está correto? ” & path & ” & file & “.xls”, vbYesNo) = vbYes Then
wb.SaveAs path & ” & file & “.xls”
End IfEnd Sub
Sub testemain()
Call sb_Copy_Save_ActiveSheet_As_Workbook(“c:”, “teste”)
End Sub -
Anil Kumar
November 3, 2014 at 3:24 PM — ReplyHi,
Thanks a lot but is it possible to paste it in pastespecial in the destination sheet.
Thank you.
-
PNRao
November 3, 2014 at 8:20 PM — ReplyHi Anil,
We can do as follows:
Sub sb_Copy_Save_ActiveSheet_As_Workbook_PasteSpecial()
Set wb = Workbooks.Add
ThisWorkbook.Activate
ActiveSheet.Copy Before:=wb.Sheets(1)
wb.Activate
wb.SaveAs “C:temptest3.xlsx”
wb.Sheets(1).Cells.Copy
wb.Sheets(1).Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
wb.Save
End SubThanks-PNRao!
-
Jayant SIngh
January 29, 2015 at 1:14 PM — ReplyThis is very very helpful. thank you so much for this answer. Just one more litle thing : Can you add a code to delete those extra sheets(except the required sheet) in new workbook ?
-
PNRao
February 3, 2015 at 10:08 PM — ReplyHi Jayant Singh,
Here is the Code:
Sub deletAllSheetExcept() For Each sht In ActiveWorkbook.Worksheets If sht.Name <> "YourSheetName-WhichYouWantToKeep" Then sht.Delete Next End Sub
Thanks-PNRao!
-
Adina
March 11, 2015 at 12:24 AM — ReplyHi all,
I am very new to VBA, could you please tell me how can I activate the macro to save in different worksheet?
-
Jenna
April 13, 2015 at 8:24 AM — ReplyHi There,
Thanks this has been really useful, how would I add onto the end of the sub to close the file, as I don’t want it to leave the file open.. just saved down into the drive?
Also is it at all possible to include a cell reference in the worksheet in the new file name… eg I want to save the new file as a company name and date the report relates to. The date is a cell field in the worksheet.
-
Jenna
April 13, 2015 at 8:37 AM — ReplyAlso sorry to be a bother, but I have multiple worksheets in the one file that I am trying to save, however each worksheet is a filtered result but I get an error message saying the copy and paste area is not the same?
Any advice?
-
PNRao
April 13, 2015 at 8:52 PM — ReplyHi Jenna,
Let’s see your second question first:
You can use the file name from a Cell reference: The below code refers the file path from Range B1 of required sheet:Example Case: If B1 value is C:temptest1.xlsx
Dim strFileName strFileName=Sheets("SheetName").Range("B1") '...... your statements wb.SaveAs strFileName
Your Case: If B1 value is date, B2 value is a company name, And B3 value is target folder
B1=ABCCompany
B2=12/3/2015
B3=”C:temp”Then the code would be:
Dim strFileName strFileName=Sheets("SheetName").Range("B3") &Sheets("SheetName").Range("B2") &" &Sheets("SheetName").Range("B1") '...... your statements wb.SaveAs strFileName
Now your first question: you can use the Close method of a workbook to close the file
'...... your statements wb.Close ' to close the file
Thanks-PNRao!
-
PNRao
April 13, 2015 at 8:56 PM — ReplyDo you want to save all three sheets in one workbook, then you can just use wb.SaveAs ‘YourFilePathandName’
Please describe your issue with more information.
Thanks-PNRao!
-
Feroz
June 11, 2015 at 6:28 PM — ReplyHi Sir
Iam new to VBA coding,i have a problem please help to resolve.Problem :
I have a multiple sheets and sheet names are based on country name.
I want to create multiple workbooks based on the sheet names in a single run .Example : i have 5 sheets with different country name like (Ind,Brazil,china,russia,US)
i want to create a separate workbook for India ,separate workbook for Brazil..etc) it should be dynamically pick the sheet name and create a workbook.Please help to query this issue
-
Gene
August 15, 2015 at 6:09 PM — ReplyI’m trying to have Excel save a file with the contents of a cell (happens to be a date code) but give me the option to edit the file before saving so it would have to display the pop up save as dialog box enter the contents of the specified cell and wait for my further input and to press the save button. Can this be accomplished?
-
PNRao
August 16, 2015 at 2:24 AM — ReplyHi Gene,
Yes, we can read the file path and name from a excel range/cell and use VBA and FileDailog to SaveAS with required name. The below macro will wait for user to press Save button to SaveAs with altered file name at desired file ath:Sub sbSaveAsExcelDialog() Dim IntialName As String Dim sFileSaveName As Variant InitialName = Range("A1") 'Change the cell address as per your requirement sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, _ fileFilter:="Excel Files (*.xls*), *.xls*") ' You can change the file filters as per your requirement If fileSaveName <> False Then ActiveWorkbook.SaveAs sFileSaveName End If End Sub
Please make sure to format the date to accept as a file name (i.e; if you want to use date as a file name, you have to remove the special characters like: /,:,-)
Thanks-PNRao!
-
Gene
August 18, 2015 at 9:40 AM — ReplyThanks! worked like a charm.
-
PNRao
August 18, 2015 at 12:50 PM — ReplyWelcome Gene! I’m glad it worked. Thanks-PNRao
-
Costas Pap
September 28, 2015 at 3:06 AM — ReplyHallo from me to you all with great skills in programming (my opinion and you can’t change it – sorry!!!)
I did the code above (excel 2010) but when I save it I can’t see a anything anywhere !!!!
What am I doing wrong?
thank you for your timePrivate Sub cbSaveAs_Click()
Dim IntialName As String
Dim sFileSaveName As Variant
InitialName = Range(“B6”).Value & “-” & Range(“B9″).Value ‘it takes the B6-B9 name – its the only code I changed Change the cell address as per your requirement
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, _
fileFilter:=”Excel Files (*.xls*), *.xls*”) ‘ You can change the file filters as per your requirementIf fileSaveName False Then
ActiveWorkbook.SaveAs sFileSaveName
End If
End Sub -
Costas Pap
September 28, 2015 at 4:13 AM — ReplyWhat I want to do is this:
Working in workbook with userform with buttons
So it creates a new sheet with B6 & B9 cell values
Afterwards with this macro I want to create a new Excel file with the name of B6 cell and transfer in there the sheet with B6 & B9 cells value.
Just that most of the times the B6 value maybe the same for example:
sheet like this 8620-112233 and sheet with 8620-998877 these 2 sheets must be stored in a file 8620.xlsx.
The only thing is that today I create the 1rst sheet and 1 week later I create the 2nd sheet. So I must transfer the 2nd sheet INTO the old file (8620.xlsx) but keep the 1rst sheet in that file and I have to do with a button to be simple. -
Costas Pap
September 28, 2015 at 4:24 AM — ReplyElse we go to the 1rst solution as above but with the problem I mentioned
Sorry for making 3 posts -
Michael
October 11, 2015 at 10:55 PM — ReplyHI,
You posted this code back in August but I am now looking at this in Oct. I have situation where I need to tweak the following cole with something like this below. How would you tweak the August code with the one that I’m working on now:
My project is to create a separate sheet from a pivot table where I have the filter on Doctor (I make a sheet for each doctor using the Pivot Table).
I need to move this sheet from the current workbook to a new file – with the doctors name and billing period The file needs to be named something like “[Doctor’s Name from the sheet from the Pivot Table] – Q3 Billing”. I would also like to make this flexible enough to change the Q3 to another period in the future. this file is going to be reused on a monthly basis so I would like to set it up so it is flexible to accommodate the File name – all at one time (I may have 10-15 doctors in one pivot table for a particular month).
The code I’m working with now:
Sub CopySheets()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name “Master” Then
ws.Copy
With ActiveSheet.Cells
.Copy
.PasteSpecial xlPasteValues
End With
With ActiveWorkbook
.SaveAs “Drive:Filepath” & ActiveSheet.Range(“A1”).Value & “.Xlsx”, FileFormat:=51
.Close
End With
End If
Next ws
End SubThe August code you added
Sub sbSaveAsExcelDialog()
Dim IntialName As String
Dim sFileSaveName As Variant
InitialName = Range(“A1″) ‘Change the cell address as per your requirement
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, _
fileFilter:=”Excel Files (*.xls*), *.xls*”) ‘ You can change the file filters as per your requirementIf fileSaveName False Then
ActiveWorkbook.SaveAs sFileSaveName
End IfEnd Sub
-
Michael D
October 12, 2015 at 6:51 AM — ReplyGoing back to August 14, you posted the following code:
Sub sbSaveAsExcelDialog()
Dim IntialName As String
Dim sFileSaveName As Variant
InitialName = Range(“A1″) ‘Change the cell address as per your requirement
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, _
fileFilter:=”Excel Files (*.xls*), *.xls*”) ‘ You can change the file filters as per your requirementIf fileSaveName False Then
ActiveWorkbook.SaveAs sFileSaveName
End IfEnd Sub
I’m working on the following code (where I am making a sheet based upon a pivot table then moving it to a new file with the
Doctor’s name). How do I incorporate this piece (sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, _
fileFilter:=”Excel Files (*.xls*), *.xls*”) ‘ You can change the file filters as per your requirementinto the follwing code”Sub CopySheets()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Name “Master” Then
ws.Copy
With ActiveSheet.Cells
.Copy
.PasteSpecial xlPasteValues
End With
With ActiveWorkbook
.SaveAs “Drive:Filepath” & ActiveSheet.Range(“A1”).Value & “.Xlsx”, FileFormat:=51
.Close
End With
End If
Next ws
End SubThank you for your help.
-
Steve
October 30, 2015 at 8:12 AM — ReplyHello
I am new to this part of excel and was wondering if you could help me.
Could you show me the code I would need to do the following.
To save the current WORKBOOK
To create and save a new workbook with all the sheets copied (Time sheet, Pay sheet, Data, Pay Data, Tax)
The new workbook name being 14 days after either the current workbook name or “Time sheet”H4
I would then like the data in the new workbook Time sheet cells C8 to C14, D8 to D14, C17 to C23 and D17 to D23 erased or deleted.
I would also like the selected option in cells B8 to B14 and B17 to B23 to come up blank(waiting for a selection from the list) or to have the “DAY OFF” selection appear.
I would like the valve from the current workbook “Time sheet”G28 and “Time sheet”G29 to be linked to the new workbook “Time sheet”C28 and “Time sheet”C29Could you help with this. Cheers Steve
-
char
January 13, 2016 at 5:45 AM — ReplyHi There!
How do I copy select columns from multiple tabs to a work sheet (same columns in different tabs by month).
-
Peter Theodorou
April 16, 2016 at 5:08 PM — ReplyAt 72 years old, I decided to start playing with VBA. I have managed to get a few ‘programs’ working in my XL2007 and need some help with the following. I have an invoicing program that I wrote with the help of information from the net and what I got stuck with now is that I would like to print the resulting Invoice on a PDF file for sending to customer. Considering that I have 8 working sheets on the file and need to only print the one sheet (Invoice). Can you help me overcome this by sending me a code to type in. I will modify file names etc as well as the directory as each customer has he one directory. So the PDF saved will have the customer’s name & Invoice Number & Date. I will be most grateful with any help I can get. Thank you and keep up the great work you are doing. Knowledge must be spread and not limited or controlled by the few.
Peter Theodorou -
Mehul
June 2, 2016 at 6:24 PM — ReplyHello Every one,
Greetings!
Please help me on one thing,
I want to save current worksheet of open workbook
as new worksheet in the same workbook.
For example if SheetA is current w.s. then save this sheet
in the same w.b. with name CopySheetA
and save this sheet on every 1 or 2 second.thanks & rgds
-
TruVET
July 6, 2016 at 4:39 PM — ReplyI have a workbook with 10 sheets I only want to save 3 of the 10 sheets into a file how can i do this?
-
matthew r
September 9, 2016 at 2:45 PM — ReplyHi.
I wonder if you can help. I am trying to save a workbook with the data from one of the cells in one of the active worksheets. I have renamed all the sheet no. so I don’t know if this has an effect.
For example I have 5 active sheets within the workbook let call them RED ONE, GREEN ONE, BLUE ONE, ORANGE ONE, YELLOW ONE.
Im trying to save the entire workbook into a destination folder using the save name from cell C7 on sheet ‘RED ONE’.
Heres what I have so far.
Sub SaveInvWithNewName()
Dim NewFN As Variant
ActiveWorkbook.Sheets.Copy
NewFN = “C:MCM CloudEstimatingQuote NumbersQUOTE_” & Range(“C7”).Value & “.xlsx”
ActiveWorkbook.SaveAs NewFN, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close
NEXTINVOICE
End SubThis works apart from it doesnt save new name from cell ‘C7’ on worksheet ‘RED ONE’
Can you help.
Regards
Matt
-
matthew r
September 9, 2016 at 2:46 PM — ReplyHi.
I wonder if you can help. I am trying to save a workbook with the data from one of the cells in one of the active worksheets. I have renamed all the sheet no. so I don’t know if this has an effect.
For example I have 5 active sheets within the workbook let call them RED ONE, GREEN ONE, BLUE ONE, ORANGE ONE, YELLOW ONE.
Im trying to save the entire workbook into a destination folder using the save name from cell C7 on sheet ‘RED ONE’.
Heres what I have so far.
Sub SaveInvWithNewName()
Dim NewFN As Variant
ActiveWorkbook.Sheets.Copy
NewFN = “C:MCM CloudEstimatingQuote NumbersQUOTE_” & Range(“C7”).Value & “.xlsx”
ActiveWorkbook.SaveAs NewFN, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close
NEXTINVOICE
End SubThis works apart from it doesnt save new name from cell ‘C7’ on worksheet ‘RED ONE’
Can you help.
Regards
Matt
-
Rina
January 18, 2017 at 12:54 PM — ReplyHi Ankit,
I have a list of production Csv files, out of which the month column “B” needs to be changed every month for all the list of files, for which i have created a macro, which amends only colum “B” which is 85 % working files for all the files, except few where apart Column B , even colum “E ” (hold some value) .
Issue is because , the files are Csv files, if i amend the macro with .xls, it’s 100% working fine. I even tried by converting the Csv files to .xls but still however i could find the value changed files
Is there any way, i can make sure that except “B” colum , no other column gets changed -
Tanzeel
February 10, 2017 at 1:59 AM — ReplyDear Sir(s)
I have a situation where we sell different varieties of items at different prices to regular customers. the prices vary on a day to day basis and so does the quantity that each customer buys.
My requirements are that when we input the quantity and rates, we get the amount. i have made 31 work sheets in my masterfile for each date and has the list of all my customers with provision to insert their purchase and the price. Now I want a weekly total of the sales that we have made. I have linked the autosum to a differnt file named weekly report. This i would like to consolidate for monthly and then yearly basis. The problem is that the 31 sheets in my daily log book are finished and so is my weekly data completed for a month. Now i want to know how to write a code so that at the end of each month my daily log book and weekly report is saved by the name of the month at the end automatically and the process of updating each individual month then starts from the master file. Also once the file is saved with a new name will i lose my data that is still linked to the file? Kindly help me please.
Thanks in advance -
Marcin
February 10, 2017 at 7:48 PM — ReplyHi All,
I would like to assign a macro to a button which when pressed will copy and paste special a sheet into a new workbook. This workbook should get a name which is in a cell C8 of this active sheet. Also I would like to save this file into a folder name which will be in cell C9. Of course there will be a fixed path to this folder. If folder does not exist yet I would like this to be created.
Can you help me with this?
Thanks in advance
Marcin -
Jarrod Sandri
March 13, 2017 at 9:57 AM — ReplyHey,
I want to export one worksheet as a copy of the data that will just open when button (Marco) is pushed. Then I can save where ever i want and whoever uses the workbook can use the same.
Regards
-
dear sir
how to write this plz help me regards given below
Sub saveinvwithnewname()
Dim newfn As Variant
‘copy invoice to a new workbook
ActiveSheet.Copy
newfn = “c:ssinv” & Range(“i5”).Value & “.xlxs”
ActiveWorkbook.SaveAs newfn, FileFormat:=XlopenXMLWorkbook
ActiveWorkbook.Close
nextinvoice
End Sub -
Sot Sreng
April 9, 2018 at 2:04 PM — ReplyHow code copy two sheet to new workbook?
-
PNRao
April 14, 2018 at 10:12 AM — ReplySub sbCopySheetsToNewWorkbook() Sheets(Array("Sheet2", "Sheet3")).Copy End Sub Sub sbCopySheetsToSpecificWorkbook() Sheets(Array("Sheet2", "Sheet3")).Copy Before:=Workbooks("Book3").Sheets(1) End Sub
-
April Lancashire
October 10, 2018 at 7:38 PM — ReplyHello,
Thank you very much for all of the above, it has been really useful for me.
I have one issue, i need to save the new file as a csv file, how would i do this (forgive me i am a VB newbie)
So far i have;
Sub sb_Copy_Save_Worksheet_As_Workbook()
Dim strFileName
strFileName = Sheets(“JobCard”).Range(“E3″) & ” & Sheets(“JobCard”).Range(“E5”) & “.” & csv & ”Dim wb As Workbook
Set wb = Workbooks.Add
ThisWorkbook.Sheets(“csv”).Copy Before:=wb.Sheets(1)
wb.SaveAs strFileName
End SubThanks,
April -
April Lancashire
October 10, 2018 at 7:41 PM — ReplySorry this is the code i have;
Sub sb_Copy_Save_Worksheet_As_Workbook()
Dim strFileName
strFileName = Sheets(“JobCard”).Range(“E3″) & ” & Sheets(“JobCard”).Range(“E5”)Dim wb As Workbook
Set wb = Workbooks.Add
ThisWorkbook.Sheets(“csv”).Copy Before:=wb.Sheets(1)
wb.SaveAs strFileName
End Sub -
Harsh
September 22, 2020 at 2:18 PM — ReplyThere are multiple sheets from sheet1 to sheet13 in one workbook abc.xlsm (macro language file).The query is need to transfer sheets from sheet 1 to sheet13 into different workbook as sheet1 from abc.xlsm will transfer into r1.xls, sheet2 from abc.xlsm will transfer into r2.xls.
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
Go to Top