Опция Base не влияет на подсчет строк
Обратите внимание, что Option Base
не влияет на подсчет строк и, следовательно, не влияет на массивы, которые были заполнены из значений диапазона, таких как
Dim MyArr() As Variant
MyArr = Range("A1:A10").Value
всегда приводить к массиву MyArr(1 To 10)
независимо от того, Option Base
равен 1
или 0
.
Следить за функциями, которые возвращают массивы
Вам также может понадобиться следить за тем, возвращает ли функция массив, созданный с помощью Array()
или без явных нижних границ.В этом случае вам также необходимо проверить обработку массива родительских функций / процедур, что может быть не так очевидно.
Это особенно сложно, если в разных модулях использовались разные Option Base
.
Option Base 1 'if you plan to change this to 0
Function MyArrayReturningFunction() As Variant
MyArrayReturningFunction = Array(1, 2, 3)
End Function
'in another module
Option Base 0 'this was already 0
'so you might assume no changes are needed in this module BUT WRONG!
Sub ParentProcedure()
Dim MyArr As Variant
MyArr = MyArrayReturningFunction
Dim iItem As Long
For iItem = 1 To 3 'You need to take care here even if this module was already Base 0
'because the array was recieved from a Base 1 function.
'Especially in combination with cells (see next paragraph)
Debug.Print MyArr(iItem)
Next iItem
End Sub
Нумерация массивов и нумерация строк
Также, если для циклического массива использовались циклы в комбинации с ячейками и диапазонами, вам необходимо обратить особое внимание на счетчики.
Option Base 1
Sub Test()
Dim MyArr() As Variant
MyArr = Array(1, 2, 3, 4, 5) 'MyArr(1 To 5)
Dim iRow As Long
For iRow = LBound(MyArr) To UBound(MyArr) 'It looks like safe to change because
'LBound/UBound is used BUT see below …
Cells(iRow, A) = MyArr(iRow)
Next iRow
End Sub
Необходимо изменить на
Option Base 0
Sub Test()
Dim MyArr() As Variant
MyArr = Array(1, 2, 3, 4, 5) 'MyArr(0 To 4)
Dim iRow As Long
For iRow = LBound(MyArr) To UBound(MyArr) 'even if LBound/UBound is already used,
Cells(iRow + 1, A) = MyArr(iRow) 'the counter for the cells needs to be changed,
'but NOT for the MyArr
Next iRow
End Sub
Заключение
В целом, я бы посчитал этот подход безопасным, но вам понадобится приличный просмотр вашего кода.Могут быть ловушки, которые неочевидны для просмотра.