The above answer is correct but I just wanted to add a few details.
If you use the Preserve keyword, you can resize only the last array
dimension and you can't change the number of dimensions at all. For
example, if your array has only one dimension, you can resize that
dimension because it is the last and only dimension. However, if your
array has two or more dimensions, you can change the size of only the
last dimension and still preserve the contents of the array. The
following example shows how you can increase the size of the last
dimension of a dynamic array without erasing any existing data
contained in the array.
From the documentation :
This example uses the ReDim statement to allocate and reallocate storage space for dynamic-array variables. It assumes the Option Base is 1.
Dim MyArray() As Integer ' Declare dynamic array.
Redim MyArray(5) ' Allocate 5 elements.
For I = 1 To 5 ' Loop 5 times.
MyArray(I) = I ' Initialize array.
Next I
The next statement resizes the array and erases the elements.
Redim MyArray(10) ' Resize to 10 elements.
For I = 1 To 10 ' Loop 10 times.
MyArray(I) = I ' Initialize array.
Next I
The following statement resizes the array but does not erase elements.
Redim Preserve MyArray(15) ' Resize to 15 elements.
So your mistake : ReDim Preserve DynArray(5 To 5) where you changed the lower bound.
Option Basestatement that globally (for that module) defines the default lower bound of an array so you can declare an array withDim a(5)with the 5 being the upper bound and the lower bound being 0 or whatever you setOption Baseto. To whatever that is set, you can always declare your array explicitly with another lower bound (as the OP did), arbitrarily high.