Workbook

This page allows you to understand the Workbook object and the Workbooks collection in VBA macro programming.

In Excel, each workbook can contain several sheets which contain many cells.

If you use ThisWorkbook property of the Application object, the object return is the workbook where the Visual Basic code is running. Most of the time, this is the same as the active workbook.

There are a lot of methods, properties and events attached to the workbook object. The workbook object is, in fact, an element of the workbooks collection.

Below, several useful codes around the workbooks collxection and workbook object. You will find the main tools for handling workbooks. Knowing the object means being able to automatically create workbooks, save them, open them, protect them, delete them.

Island – Photo taken by me

Create a new workbook

The first thing to know about workbook is how can you create a new workbook using a VBA macro.

To create a workbook, we begin by declaring new objects as binders. Then, we can use the Add method of the Workbooks collection and finally use the Set tool to match this new workbook to our declared variable.

The following procedure will show you how to create a new workbook, and how can you copy a sheet from a workbook to another using the Copy method of the sheet object.

In order not to see the execution of your screen, do not forget the good practices by deactivating the setting of your screen.

Sub CreateNewWorkbook()
    
    'Deactivated
    Application.AskToUpdateLinks = False
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    Dim WbMacro, WbNew As Workbook
    
    Set WbMacro = ActiveWorkbook
    Workbooks.Add 'Create a new workbook
    Set WbNew = ActiveWorkbook

    'Copy Paste the tab Weather Data to the new wbk
    WbMacro.Sheets("Weather Data").Copy after:=WbNew.Sheets(1)
    WbNew.Sheets(1).Delete 'Remove the Sheet1

    'Activated
    Application.AskToUpdateLinks = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
End Sub

Open an existing workbook

The main method to know about the workbook are how you can create, open and save.

To open a workbook you just have to use the Open method with the path of the file as an argument.

In the example below, we write all the path of the file to open it :

Sub OpenWorkbook()

    Dim FilePath As String

    FilePath = "C:\Desktop\VBASKILLS\Startup.xls"
    Workbooks.Open (FilePath)

End Sub

In the example below, we use the GetOpenFilename method to select a file. This reduces the risks of the bug code because the user will choose his file in the system. This procedure works for Mac Os and Windows users.

Sub OpenWorkbook()

    Dim FilePath As String

    FilePath = Application.GetOpenFilename
    Workbooks.Open (FilePath)

End Sub

As seen in the article Project Explorer, you can also use the Application.FileDialog(msoFileDialogOpen) object to choose a file in the system, but it will work only for windows users.

Sub OpenWorkbook()
'works only for windows 

    Dim FilePath As String

    With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = False ' To select only one file
            .Show 'Display the dialog box
            'Write the path of the file selected on B2
            FilePath = .SelectedItems(1)
    End With

    Workbooks.Open (FilePath)

End Sub

A good practice is to let the users select the file needed before the launching of the macro.

Open a text file as workbook

It is also possible to open a “.txt” file using the OpenText method if your data to analyse are in a text file.

Sub OpenWorkbookTxt()

    Workbooks.OpenText filename:="Thesaurus.txt", dataType:=xlDelimited, tab:=True

End Sub

Loop on workbooks

To loop on all workbooks open you just have to use a For Each loop on the Workbooks collection.

Sub LoopWorkbooks()
'Loop on all workbooks

    Dim Wbki As Workbook 'The counter
  
    For Each Wbki In Workbooks

        '... your instructions ...

    Next Wbki

End Sub

Save a workbook for the first time

After your macro is created a workbook, retrieved data reworked this data for your analyzes and reports, your need will be to save your work for the first time. For this, use the SaveAs method.

In the arguments of the method, you can even protect your workbook with a password.

Below the list of arguments available : FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local.

You can use all Excel type of file format such as xlAddIn (*.xla), xlCSV (*.csv), xlCSVMac (*.csv), xlOpenXMLWorkbook (*.xlsx), xlOpenXMLWorkbookMacroEnabled (*.xlsm), xlTextMac (*.txt),xlTextMSDOS (*.txt), xlXMLSpreadsheet (*.xml)…

Sub SaveWorkbook()
'Save a workbook

    Dim WbkAnalyis As Workbook 'The counter

    Set WbkAnalyis = ActiveWorkbook

    WbkAnalyis.SaveAs Filename:="Finance.xlsm" FileFormat:=xlOpenXMLWorkbookMacroEnabled

End Sub

Save changes of a workbook

To save the change of workbook already in the computer you can just use the Save method.

Sub SaveChangesWorkbook()
'Save the changes of a workbook

    Dim WbkAnalyis As Workbook 'The counter

    Set WbkAnalyis = ActiveWorkbook

    WbkAnalyis.Save

End Sub

Save all changes of workbooks

To save the change of several workbooks already open in the computer use the Save method with a For Each loop.

Sub SaveAllWorkbooks()

    Dim wb As Workbook

    For Each wb In Workbooks
        wb.Save
    Next wb

End Sub

Save all workbooks and check the ReadOnly status

The code below uses a loop For Each Next on open Excel workbooks and checks the status of read-only.

If the file is not read-only, then it saves the workbook. When the workbook is read-only, you can’t do any changes. To override the read-only, simply re-save the workbook in a different location, thus creating a copy.

Sub SaveWorkbookNotReadOnly()
'Save all workbooks which are not in read-only

    Dim Wbk As Workbook
 
    'Loop on all workbooks
    For Each Wbk In Application.Workbooks
        If Not Wbk.ReadOnly Then ' Condition on Read Only
            Wbk.Save 'Save the workbook
        End If
    Next Wbk

End Sub

Close the workbook and choose to save or not

To close a workbook, already save in a path location of your compute, nothing easier, use the Close method. As argument, the close method can save the workbook if needed using the boolean value True on the parameter SaveChanges.

If you are working on a VBA code which needs to open other Excel workbooks to retrieve data, if you do not change anything in the Excel workbook opened previously, then it is better to close this workbook without saving it, so you will save execution time especially if the latter is a big file.

As seen in good practices, it is also necessary to deactivate Excel alerts, doing that your code is not interrupted by a message indicating if you are sure that you do not want to save your workbook.

Sub CloseWorkbookWithoutSave()
'Close all workbooks without save

    Application.DisplayAlerts = False
    
    Dim WbNew As Workbook
    
    Workbooks.Add
    Set WbNew = ActiveWorkbook
    WbNew.Close SaveChanges:=False 'The False cancelled the saving

    Application.DisplayAlerts = True
    
End Sub

Protect & unprotect the workbook

The read-only file restricts changes being made, but this can easily be counteracted by saving it again.

The best security method is to use a password on a workbook with the VBA Protect method. As the Excel sheet, you can use a password to protect all the workbook.

Sub ProtectWorkbook()
'Lock the workbook with a password

    Dim WbkMacro As Workbook
    
    Set WbkMacro = ActiveWorkbook

    WbkMacro.Protect Password:="azerty123", _
       Structure:=True, Windows:=True

End Sub

To unprotect the file, use the method Unprotect and the password.

Sub UnprotectWorkbook()
'UnLock the workbook with a password

    Dim WbkMacro As Workbook
    
    Set WbkMacro = ActiveWorkbook

    WbkMacro.UnProtect Password:="azerty123"

End Sub


protect workbook password

Protect all workbooks

To protect all workbooks, we just need to add a For Each… Next loop in the procedure above.

Sub ProtectAllWorkbooks()
'Lock all workbooks with a password

    Dim Wbki As Workbook
  
    For Each Wbki In Workbooks
        Wbki.Protect Password:="azerty123", _
           Structure:=True, Windows:=True
    Next Wbki

End Sub

Test if the workbook has a password

When you work on a workbook, it can be useful to test if the workbook is protected or not by a password using the property HasPassword of the object.

Sub CheckIfPasswordOnWorkbook()
'Check if the workbook has a password

    Dim WbkMacro As Workbook
    
    Set WbkMacro = ActiveWorkbook

    If WbkMacro.HasPassword = True Then 
        MsgBox "The Workbook is protected by a password."
    End If

End Sub

To print the entire workbook, use the PrintOut method. This method take has arguments the following values : From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFilename, IgnorePrintAreas.

Sub PrintWorkbook()
'Print all the workbook

    Dim Wbki As Workbook 'The counter
    
    Set Wbki = ActiveWorkbook

    Wbki.PrintOut

End Sub

Divided each sheet in a new workbook

Based on filters, sometimes you need to divide your work with one sheet by workbook for the analysis required. It can be due to a perimeter, a location, an activity sector or other criteria.

So after having made your analysis, you can split the file into several files.

Sub CreateOneWorkbookforOneSheet()
  
    Dim Sh As Sheet
    Dim Wbk As Workbook
    
    'Loop on all sheets in your workbook using ThiWorkbook property
    For Each Sh In ThisWorkbook.Worksheets

        Set Wbk = Workbooks.Add
        '... others instructions ...
        Sh.Copy Before:= Wbk.Sheets(1) 'Copy your data
        Wbk.Sheets(1).Delete 'Delete a sheet
        Wbk.SaveAs "C:\Users\Desktop\Accounting\" & Sh.Name & ".xlsx" 'Save
        Wbk.Close 'Close the workbook already saved

    Next Sh

End Sub

Launch automatically a procedure with workbook action

Some specific macros can launch automatically depending on the actions.

These are called events.

For example, the instructions written in a macro having the name App_WorkbookOpen will automatically launch the instructions of the procedure when the file is opened. For more details, see the Automatic Sub article in the Tips category.


Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s