Variables Scope in Visual Basic
In Visual Basic language variables can be declared in different scopes (module level, local in the function, within the code block) with different access modifiers (private or public) which define their visibility in the code.
Class or module (aka members)
Usually declared in the header of the class (outside of functions and procedures). Member variables have 2 levels of visibility (private and public).
Private
Declared using Dim or Private keyword and only visible by the function and procedures within the scope of this class or module.
Module1
Dim member As Integer Private member1 As String Sub Init() member = 10 'visible within the Init function of the Module member1 = "A" End Sub
Private variables cannot be accessed from outside of the module or class. Compile error: method or data member not found occurs when attempting to access the private member from outside class or module.
Public
Public variables declared using the Public keyword and can be accessed both from current module or class and external module or class.
Module1
Dim publicMember As Integer
Module2
Sub main() Module1.publicMember = 20 'variable is accessed and assigned from the external module End Sub
Alternatively public member can be declared with the Global keyword. It will act exactly the same as Public however can only be declared within the module and cannot be declared in the user form or class module.
Local
Local variables declared in the scope of specific code block or function and only visible within that block for the code appearing after the declaration of the variable
Dim var1 As Double var1 = 0.5 'var1 is visible here var2 = 0.25 'var2 is not visible at this step as it is declared in the next line Dim var2 As Double
Code block
Variables defined in the loops or conditional statements
If res Then Dim localVar As Integer 'local variable defined within the If code block localVar = 25 End If
Although, local code block variables are only visible within this code block, same variable name cannot be used in other code block.
Function or procedure
Variables defined in the context of function or procedure. These variables are visible within the function or any nested code blocks.
Sub main() Dim localVar As String Dim localBoolVar As Boolean localVar = "Hello World" If localBoolVar Then 'local variable accessed in the conditional statement localVar = "New Hello World" 'local variable modified within the body of conditional statement End If End Sub
Function or procedure parameter
Variables are defined in the signature of the function. These variables declaration equivalent to the local function variable declared at the first line of the function body, i.e. the variables are visible for all code blocks within this function.
Sub DoWork(paramVar As Double, paramVar2 As Integer) End Sub
This example demonstrates the behaviour of variables declared in the different scopes:
Module1
Public Module1PublicText As String 'public variable is visible outside of the module Dim Module1PrivateText As String 'only visible by functions and properties of this module Sub Init() Module1PublicText = "Module1 Public Text" Module1PrivateText = "Module1 Private Text" End Sub
Main Module
Dim memberInt As Integer Sub main() memberInt = 10 Dim localString As String localString = "Hello World" Debug.Print memberInt 'Prints 10 Debug.Print localString 'Prints Hello World proc proc2 module End Sub Sub proc() Dim localString As String localString = "New Hello World" memberInt = 20 Debug.Print localString 'Prints New Hello World Debug.Print memberInt 'Prints 20 End Sub Sub proc2() Debug.Print localString 'prints empty string as localString local variable from main and proc functions are not visible in this scope Debug.Print memberInt 'prints 20 as module level variable was modified in proc function End Sub Sub module() Module1.Init 'Debug.Print Module1.Module1PrivateText 'compile error as variable is not visible outside of module 1 Debug.Print Module1.Module1PublicText 'prints Module1 Public Text End Sub
Output to Immediate Window
Scope Table
Given the following project structure:
Each of the files has the following declarations:
UserForm
Public VarFormPublic As String Private VarFormPrivate As String Dim VarFormDim As String Dim VarFormGlobal As String 'cannot be declared
Module
Public VarModulePublic As String Global VarModuleGlobal As String Dim VarModuleDim As String Private VarModulePrivate As String
Class
Public VarClassPublic As String Dim VarClassDim As String Private VarClassPrivate As String Dim VarClassGlobal As String 'cannot be declared
Table below describes the visibility of variables across different files
Variable Name | UserForm | Module | Module1 | Class |
---|---|---|---|---|
VarFormPublic | ✓ | ✓ | ✓ | ✓ |
VarFormPrivate | ✓ | ☓ | ☓ | ☓ |
VarFormDim | ✓ | ☓ | ☓ | ☓ |
VarFormGlobal | - | - | - | - |
VarModulePublic | ✓ | ✓ | ✓ | ✓ |
VarModuleGlobal | ✓ | ✓ | ✓ | ✓ |
VarModuleDim | ☓ | ✓ | ☓ | ☓ |
VarModulePrivate | ☓ | ✓ | ☓ | ☓ |
VarClassPublic | ✓ | ✓ | ✓ | ✓ |
VarClassPrivate | ☓ | ☓ | ☓ | ✓ |
VarClassDim | ☓ | ☓ | ☓ | ✓ |
VarClassGlobal | - | - | - | - |