General arrays
An array is a single variable that is declared in such a way that
it can store multiple values of the same data type. If you want to access any
item in the array variable, you must provide the index number of the element
and the variable name.
Declaring an array variable
Arrays are declared like non-array variables, by using the Dim
statement, the Static statement, the Private statement, and the Public
statement. Non-array variables are also known as
scalar variables. The difference between array variables and scalar
variables is that you must specify the size of the array variable when you
declare it. The size of the array tells Visual Basic for Applications how many
elements can be stored in the array. However, you can create an array that
changes size during program execution. An array that changes size during
program execution is referred to as a dynamic array.
Declaring a fixed array
When you declare an array, you must specify the name of the
array, the size of the array, and the data type that is stored in the array.
The following is the default syntax for declaring an array:
Dim <array name> (# of elements - 1) As <data type>
For example, if you have an array that must have 10 integer values,
you create the array with the following statement:
Dim MyArray(9) As Integer
Note You dimension the array with 9. The first index number in the
array is assumed to be zero. Therefore, to access the first element in the
array, you use the following syntax:
The location of the line where you declare your array affects the
scope of the array and the lifetime of the array.
Try this exercise:
- Insert a new module into your project.
- Add the following code to the module:
Sub Array_Example()
'Create an array that has a total of three elements.
Dim MyArray(2) As Integer
'Fill in the array with some values.
MyArray(0) = 100
MyArray(1) = 300
MyArray(2) = 500
MsgBox "First element= " & Myarray(0) & _
" Second element= "& MyArray(1) & _
" Third element= " & MyArray(2)
End Sub
- Run the Array_Example macro. You receive the following
message:
First element= 100 Second element=
300 Third element= 500
- Click OK to close the message.
Changing the first index number of the array
If you do not want the first index number for your arrays to be
zero, either you can add an additional line that uses the Option Base statement
to your module, or you can dimension your array by using a slightly different
syntax.
The Option Base statement
You can add the Option Base statement at the top of your module
to specify the default index for the first element of the arrays in the module.
The value that you specify can be only zero or one.
Try this
exercise:
- Modify the module that contains the Array_Example macro to
the following:
Option Base 1
Sub Array_Example()
'Create an array that has a total of two elements.
Dim MyArray(2) As Integer
'Fill in the array with some values.
MyArray(1) = 200
MyArray(2) = 400
MsgBox "First element= " & Myarray(1) & _
" Second element= "& MyArray(2)
End Sub
- Run the Array_Example macro. You receive the following
message:
First element= 200 Second element= 400
- Click OK to close the message.
Note You must be careful with the default index for your arrays. It is
a common mistake to assume that the size of the array matches the number that
is specified in the line where you dimensioned the array.
Dimensioning the upper index and the lower index of an array
There is another way to dimension your array. You can use a second
syntax that uses two numbers to specify the indexes for the array.
Try this exercise:
- Add the following code to the module that contains the
Array_Example macro:
Note Leave the Option Base statement from the previous example in the
module. Sub Array_Example_2()
'Create an array with two elements with indexes 3 and 4.
Dim NewArray(3 to 4) As Integer
'Fill in the array with some values.
NewArray(3) = 50
NewArray(4) = 60
MsgBox "First element= " & NewArray(3) & _
" Second element= " & NewArray(4)
End Sub
- Run the Array_Example_2 macro. You receive the following
the following message:
First element= 50 Second
element= 60
- Click OK to close the message.
Determining the bounds of an array
You can determine the upper bound and the lower bound of an array
by using the UBound function and the LBound function, respectively. The default
lower bound for any array is either zero or one, depending on how you are using
the Option Base statement. However, as in an earlier example, you can set the
lower bound for an array to something other than zero or one. If you do this,
you must use the LBound function and the UBound function to determine the
bounds of an array.
Try this exercise:
- Change the Array_Example_2 macro from the earlier example
to the following:
Sub Array_Example_3()
'Create an array with three elements with indexes 2 through 4.
Dim NewArray(2 to 4) As Integer
'Fill in the array with some values.
NewArray(2) = 40
NewArray(3) = 50
NewArray(4) = 60
MsgBox "Lowest array index is " & LBound(NewArray) & _
" and Highest array index is " & UBound(NewArray)
End Sub
- Run the Array_Example_3 macro. You receive the following
message:
Lowest array index is 2 and Highest array
index is 4
Note The message displays the index numbers instead of the values that
are stored in the array.
Multidimensional arrays
In Visual Basic for Applications, arrays can have up to 60
dimensions. The simplest example of a multidimensional array is a
two-dimensional array. A two-dimensional array can be treated just like a
multi-columned table on a worksheet.
Declaring a multidimensional array
To declare a multidimensional array, use the default syntax:
Dim <array name>(r, c) As <data type>
This syntax uses the value that you have set with the Option Base
statement as the lower bound for each dimension. (This syntax uses zero if you
are not using Option Base.) You can also use the following:
Dim <array name>(1 to r , 1 to c) As <data type>
This syntax has a lower bound of one for each dimension of the
array.
Either syntax will create a two-dimensional array that has
r rows and
c columns. If
you use the first syntax, the number of elements in each dimension will vary
according to the Option Base setting.
If you use the following
example declaration for an array, you create a three-row-by-two-column array
that is similar to the range A1:B3 on a Microsoft Excel worksheet:
Dim MyArray(1 to 3, 1 to 2) As Integer
Try this exercise:
- Start Excel, and then open a new workbook.
- Start the Visual Basic Editor, and then insert a new module
into your project.
- Type the following code into this module:
Option Base 1
Sub Multi_Array()
'Create a 3-row-by-2-column array.
Dim MyArray(3, 2) As Integer
MyArray(1,1) = 11 'first row, first column
MyArray(1,2) = 12 'first row, second column
MyArray(2,1) = 21 'second row, first column
MyArray(2,2) = 22 'second row, second column
MyArray(3,1) = 31 'third row, first column
MyArray(3,2) = 32 'third row, second column
Sheet1.Range("A1").Value = MyArray(1,1)
Sheet1.Range("B1").Value = MyArray(1,2)
Sheet1.Range("A2").Value = MyArray(2,1)
Sheet1.Range("B2").Value = MyArray(2,2)
Sheet1.Range("A3").Value = MyArray(3,1)
Sheet1.Range("B3").Value = MyArray(3,2)
End Sub
- Run the Multi_Array macro.
- Return the focus to Excel by pressing ALT+F11.
The range A1:B3 will be populated with the contents of the
array.
Dynamic arrays
You can declare an array so that the dimensions of the array can
be increased or decreased while your macro is running. However, the contents of
the array will be lost when you redimension the array.
Declaring a dynamic array
To declare an array as a dynamic array, use the following syntax:
Dim <array name>() As <data type>
Note No size is specified for the array when you declare a dynamic
array.
Try this exercise:
- Insert a new module into your project.
- Type the following code into this module:
Option Base 1
Sub Dynamic_Array()
'Create a dynamic array.
Dim MyArray() As Integer
'Redimension the array to two elements.
ReDim MyArray(2)
'Populate the array elements.
MyArray(1) = 1
MyArray(2) = 2
MsgBox "First element= " & MyArray(1) & _
" Second element= " & MyArray(2)
'Redimension the array to three elements.
'The contents of the array are lost.
ReDim MyArray(3)
MyArray(3) = 3
MsgBox "First element= " & MyArray(1) & _
" Second element= " & MyArray(2) & _
" Third element= " & MyArray(3)
End Sub
- Run the Dynamic_Array macro. You receive the following
message:
First element= 1 Second element= 2
- Click OK to close the first message. You
receive the following message:
First element=
0 Second element= 0 Third element= 3
- Click OK to close the message.
The second message displays values of zero for the first element
and for the second element because the second ReDim statement clears the
contents of the array.
Preserving array contents with redimensioned array
When you use the ReDim statement to redimension an array, the
contents of the array are lost. This is acceptable as long as you know about it
when you are developing your macro. If you want to keep the contents of your
array when you redimension it, use the Preserve keyword together with the ReDim
statement.
Try this exercise:
- Change the second ReDim statement in the Dynamic_Array macro so that the macro
looks similar to the following:
Option Base 1
Sub Dynamic_Array()
'Create a dynamic array.
Dim MyArray() As Integer
'Redimension the array to two elements.
ReDim MyArray(2)
'Populate the array elements.
MyArray(1) = 1
MyArray(2) = 2
MsgBox "First element= " & MyArray(1) & _
" Second element= " & MyArray(2)
'Redimension the array to three elements.
'The contents of the array are not lost when you use the Preserve keyword.
ReDim Preserve MyArray(3)
MyArray(3) = 3
MsgBox "First element= " & MyArray(1) & _
" Second element= " & MyArray(2) & _
" Third element= " & MyArray(3)
End Sub
- Run the Dynamic_Array macro. You receive the following
message:
First element= 1 Second element=
2
- Click OK to close the first message. You
receive the following message:
First element=
1 Second element= 2 Third element= 3
- Click OK to close the message.
The second message displays the same values as the first
message. This behavior occurs because the Preserve keyword was used with the
ReDim statement.
Note When you use the Preserve keyword with a dynamic array, you can
only change the upper bound of the last dimension in the array and you cannot
change the number of dimensions in the array.
Populating an array with worksheet data
Taking data from a worksheet and putting it in an array is a
common use of arrays in Visual Basic for Applications. If you populate an array
from worksheet data, you can do things like sort the data, perform a numeric
analysis on the data, or export the data.
Variant variable that contains an array
If you want to transfer data from a range of cells on a worksheet
to an array, you can either loop through the cells and populate each element in
the array with the cell value every time through the loop, or you can directly
assign the range to the array. The latter method is quicker. However, the array
that you are passing the cell range to is really a Variant variable that
contains an array.
For additional information about
looping, click the following article number to view the article in the
Microsoft Knowledge Base:
843146
Description of Excel for Windows sub-procedures in Visual Basic for Applications (control structures)
Note A Variant variable that contains an array is different from an
array variable that contains elements of variant type. Be careful when you work
with one-dimensional arrays.
Try this exercise:
- Save and close any open workbooks, and then open a new
workbook.
- Type the following in Sheet1:
- Start the Visual Basic Editor, and then insert a module.
- Type the following code in the module:
Option Base 1
Sub Array_from_sheet_data()
'Create a Variant variable.
Dim MyArray As Variant
'Assign the range A1:A3 to the Variant variable.
MyArray = Sheet1.Range("A1:A3").Value
MsgBox "Cell A1 is: " & MyArray(1,1) & _
" Cell A2 is: " & MyArray(2,1) & _
" Cell A3 is: " & MyArray(3,1)
End Sub
- Run the Array_from_sheet_data macro. You receive the
following message:
Cell A1 is 1 Cell A2 is 2
Cell A3 is 3
- Click OK to close the message.
Note The references to the MyArray elements use both the row index and
the column index, even though the data is a single column. The single-column
data means that this array is a one-dimensional array. The MyArray variable is
really not an array. Instead, the MyArray variable is a Variant that contains
an array. Therefore, you must use both the row indexes and the column indexes
when you reference this kind of array.