Arrays in Visual Basic
Visual Basic array is a set of elements which is stored in the single variable and can be accessed by index.
In order to declare array it is required to append the variable name with parenthesis () symbol;
Dim arr() As Double 'declaring the array of doubles
Array elements can be accessed by the index
Dim arr(2) As String
Dim elem As String
elem = arr(0) 'getting first element
Initializing arrays in Visual Basic
Arrays is a set of the fixed size. Size can be assigned while declaration.
Dim arr(2) As Double 'declaring the array of 3 doubles (from 0 to 1)
The single number between the parenthesis represents the upper boundary of the array. By default arrays are 0-based. So specifying (5) as array size means that there will be 6 elements in the array.
It is possible to explicitly specify the upper and inner boundaries of the array
Dim arr(1 To 5) As Double 'declaring the array of 5 doubles (from 1 to 5)
It is recommended to use 0-based array as it is a common practice across different programming languages.
Array elements can be accessed and changed by their index. If specified index is outside of the boundaries of the array, run-time error is raised.
In some cases size of the array cannot be known at the compile time and it will be identified during the run-time. In this case array can be declared without the size (i.e. not initialized). Such array can be then resized dynamically using the ReDim keyword.
Dim arr() As Double
ReDim arr(2) 'initializing the size of the array
In order to retrieve the upper and lower boundaries of the array UBound and LBound can be used respectively.
UBound function cannot be used to identify if the array is initialized as it will throw an exception when used on not initialized array. Use the IsArrayInitialized function from the example below to safely identify the state of the array.
{ width=350 }
Sub InitializeArray()
Dim doubleArr() As Double 'not initialized array
'Array is initialized = False
Debug.Print "Array is initialized = " & IsArrayInitialized(doubleArr)
ReDim doubleArr(2) 'resizing array to hold 3 doubles
'Array is initialized = True of size 3
Debug.Print "Array is initialized = " & IsArrayInitialized(doubleArr) & " of size " & GetArraySize(doubleArr)
Dim textArr(4) As String 'initialized at declaration
'Array is initialized = True of size 5
Debug.Print "Array is initialized = " & IsArrayInitialized(textArr) & " of size " & GetArraySize(textArr)
'initializing with custom boundaries
Dim intArr(1 To 5) As Integer
'Array is initialized = True of size 5 (1 to 5)
Debug.Print "Array is initialized = " & IsArrayInitialized(intArr) & " of size " & GetArraySize(intArr) & " (" & LBound(intArr) & " to " & UBound(intArr) & ")"
'Debug.Print intArr(0) 'Run-time error 9: subscript out of range
End Sub
Function IsArrayInitialized(vArr As Variant) As Boolean
If IsArray(vArr) Then
On Error GoTo End_
If UBound(vArr) >= 0 Then
IsArrayInitialized = True
Exit Function
End If
End If
End_:
IsArrayInitialized = False
End Function
Function GetArraySize(vArr As Variant) As Integer
If IsArrayInitialized(vArr) Then
GetArraySize = UBound(vArr) - LBound(vArr) + 1
Else
GetArraySize = 0
End If
End Function
Filling array with data
Array elements can be treated as individual variables and the same rules of reading and editing the data applies to array elements as any other variable. Refer Variables article for more information.
Dim arr(2) As Double
arr(<INDEX>) = 10 'changing the value of the variable at <INDEX>
Debug.Print arr(<INDEX>) 'reading the value of the variable at <INDEX>
Sub FillArray()
Dim doubleArr(2) As Double 'array initialized from the declaration
Dim i As Integer
For i = 0 To UBound(doubleArr)
doubleArr(i) = i + 1
Next
'1 2 3
For i = 0 To UBound(doubleArr)
Debug.Print doubleArr(i)
Next
Dim vArr As Variant
vArr = Array("A", "B", "C", "D") 'filling the variant array on initialization
'A B C D
For i = 0 To UBound(vArr)
Debug.Print vArr(i)
Next
End Sub
Resizing array
Array size can be changed at run-time. But that can only be done for the array whose size was not explicitly specified on declaration
Dim arrCanResize() As Integer 'size of this array can be resized
Dim arrCannotResize(3) As Integer 'size of this array cannot be resized
Attempt of resizing the already dimensioned array will result in the compile error:
{ width=350 }
Clearing the existing values
ReDim keyword allows to resize the array. In this case all existing values will be cleared.
Sub ResizeAndClearArray()
Dim doubleArr() As Double
Dim i As Integer
ReDim doubleArr(2)
For i = 0 To UBound(doubleArr)
doubleArr(i) = i + 1
Next
'resizing and clearing the array
ReDim doubleArr(3)
doubleArr(3) = 4
'0 0 0 4
For i = 0 To UBound(doubleArr)
Debug.Print doubleArr(i)
Next
End Sub
Preserving existing values
In order to keep the existing values of the array it is required to use ReDim Preserve keyword.
Sub ResizeAndPreserveArray()
Dim doubleArr() As Double 'array initialized from the declaration
Dim i As Integer
ReDim doubleArr(3)
For i = 0 To UBound(doubleArr)
doubleArr(i) = i + 1
Next
'resizing the array and preserving the values
ReDim Preserve doubleArr(4)
doubleArr(4) = 5
'1 2 3 4 5
For i = 0 To UBound(doubleArr)
Debug.Print doubleArr(i)
Next
End Sub
Resizing arrays dynamically
In some cases it might be unknown in advance the size of the array or when the first item (if any) will be added.
In this cases it is beneficial to only init array when needed. It is possible to use the following statement to identify if the array is not initialized (Not array) = -1
and init with a first item or dynamically resize preserving the existing values.
Dim evenNumbersArr() As Integer
Dim i As Integer
For i = 0 To 100
If i Mod 2 = 0 Then
If (Not evenNumbersArr) = -1 Then
ReDim evenNumbersArr(0)
Else
ReDim Preserve evenNumbersArr(UBound(evenNumbersArr) + 1)
End If
evenNumbersArr(UBound(evenNumbersArr)) = i
End If
Next
Two dimensional array
Two-dimensional array allows to store the table data and can be declared in the following format
Dim table(<ROWS COUNT>, <COLUMNS COUNT>) As String
2-dimensional array can be resized, but if it is required to preserve the values only second (column) dimension can be resized.
Sub TwoDimensionalArrays()
'3 rows and 4 columns
Dim matrixArr() As String
ReDim matrixArr(2, 3)
Dim i As Integer
Dim j As Integer
For i = 0 To UBound(matrixArr, 1)
For j = 0 To UBound(matrixArr, 2)
matrixArr(i, j) = (i + 1) & "." & (j + 1)
Next
Next
'first dimension cannot be resized
'ReDim Preserve matrixArr(5, 5) 'Run-time error 9: subscript out of range
'second dimension can be resized preserving the data
ReDim Preserve matrixArr(2, 4)
ReDim matrixArr(5, 5) 'dimensions of the array can be changed when cleared
End Sub