Read our blogs, tips and tutorials
Try our exercises or test your skills
Watch our tutorial videos or shorts
Take a self-paced course
Read our recent newsletters
License our courseware
Book expert consultancy
Buy our publications
Get help in using our site
544 attributed reviews in the last 3 years
Refreshingly small course sizes
Outstandingly good courseware
Whizzy online classrooms
Wise Owl trainers only (no freelancers)
Almost no cancellations
We have genuine integrity
We invoice after training
Review 30+ years of Wise Owl
View our top 100 clients
Search our website
We also send out useful tips in a monthly email newsletter ...
In the previous part of the lesson you saw how to extend the scope of a variable from a single subroutine to an entire project. This part of the lesson explains how to make variables available to every module in a project.
You can click here to download the file for this page.
You can click here to download a file containing the completed code.
Extract and open the file linked to in the Files Needed section above. In the VBE you'll find a copy of the code we created in the previous part of this lesson:
There are four module-level variables declared as Private at the top of the module. The ProcessBMIList subroutine calls the CalculateBMI and CalculateBMIBand subroutines.
In large and complex projects you'll find it helpful to organise related procedures into different modules. To demonstrate this, we'll create a module to hold the subroutines which calculate the BMI and the BMI band. Start by inserting a new module into the project:
Right-click in Project Explorer window and choose Insert | Module to create a new module.
Check that the new module contains the Option Explicit statement:
If you've followed the previous parts of this lesson you should find that Option Explicit appears automatically. If not, you can simply type it in.
Change the name of the new module so that it describes the code it will contain:
Change the module name in the Properties window. Here we've called it BMICalculations.
Double-click on Module1 to return to it, then cut the CalculateBMI subroutine to the clipboard:
Select the code then right-click and choose Cut.
Double-click on the BMICalculations module and paste the cut code into it:
Paste the subroutine into the new module, below Option Explicit.
Return to the Excel window and click the first button on the worksheet to run the ProcessBMIList subroutine:
Click the Calculate BMI button to test your code.
You'll immediately receive an error message:
The error message indicates that the CalculateBMI subroutine doesn't have access to the WeightKg variable.
Click OK on the error message shown above and stop the procedure running.
Now that the CalculateBMI subroutine is in the BMICalculations module, it doesn't have access to the Private variables declared in Module1:
The CalculateBMI subroutine needs access to the first three variables shown here. The scope of these variables is currently limited to Module1.
To make the required variables available to another module we can change their declarations from Private to Public:
Changing the variables to Public extends their scope to every module in the project.
You can use the word Global instead of Public to declare public variables but this is an old-fashioned technique. You should use Public to declare public variables in any new code that you write.
Return to Excel and click the Calculate BMI button on the worksheet to test that your code works:
Click the button to run the code.
In a large and complex project, you may find it useful to arrange all of your public variables into a single module. Insert a new module into the project and assign a sensible name to it:
Here we've called the module PublicVariables.
Now cut the three public variables from Module1:
Cut these three variables from Module1.
Paste the cut code into the PublicVariables module:
The PublicVariables module should contain only this code at this point.
Try running the ProcessBMIList subroutine again to check that the code still works.
One disadvantage to placing public variables in a separate module is that they don't appear in the Locals Window when you're debugging your code:
The Locals Window displays only those variables that are declared in the module in which the active code is running.
You can use the Watch Window to keep track of the contents of public variables:
Right-click the name of a public variable and choose Add Watch...
On the dialog box that appears, choose to watch the value of the selected variable in all modules:
Choose (All Modules) from the drop down list shown here, then click OK.
Begin stepping through the ProcessBMIList procedure in Module1 by clicking within the subroutine and pressing F8repeatedly:
You'll see the value of the watched variable in the Watch Window regardless of which module is active as you step through your code. If you can't see this window, choose View | Watch Window from the menu.
To practise using public variables:
Cut this subroutine from Module1.
Paste the cut code at the bottom of the module.
You should see this error message appear. Click OK and stop running the procedure.
Make the BMIBand variable Public.
Paste the variable declaration at the bottom of the list in the PublicVariables module.
Kingsmoor House
Railway Street
GLOSSOP
SK13 2AA
Landmark Offices
99 Bishopsgate
LONDON
EC2M 3XD
Holiday Inn
25 Aytoun Street
MANCHESTER
M1 3AE
© Wise Owl Business Solutions Ltd 2024. All Rights Reserved.