В коде ниже
For i = LBound(arr) To UBound(arr)
Какой смысл спрашивать, используя LBound? Конечно, это всегда 0.



Наверное, от VB6. Поскольку с помощью оператора Вариант База в VB6 вы можете изменить нижнюю границу массивов следующим образом:
Option Base 1
Также в VB6 вы можете изменить нижнюю границу определенного массива следующим образом:
Dim myArray(4 To 42) As String
Почему бы не использовать For Each? Таким образом, вам не нужно заботиться о том, что такое LBound и UBound.
Dim x, y, z
x = Array(1, 2, 3)
For Each y In x
z = DoSomethingWith(y)
Next
Я всегда использовал цикл For Each.
Есть веская причина НЕ ИСПОЛЬЗОВАТЬ For i = LBound(arr) To UBound(arr)
dim arr(10) выделяет одиннадцать элементов массива от 0 до 10 (при условии, что VB6 по умолчанию Option Base).
Многие программисты VB6 предполагают, что массив основан на единице, и никогда не используют выделенный arr(0). Мы можем удалить потенциальный источник ошибки, используя For i = 1 To UBound(arr) или For i = 0 To UBound(arr), потому что тогда ясно, используется ли arr(0).
For each делает копию каждого элемента массива, а не указателя.
Здесь есть две проблемы.
Когда мы пытаемся присвоить значение элементу массива, оно не отражается на исходном. Этот код присваивает значение 47 переменной i, но не влияет на элементы arr.
arr = Array(3,4,8)
for each i in arr
i = 47
next i
Response.Write arr(0) '- returns 3, not 47Мы не знаем индекс элемента массива в for each, и нам не гарантируется последовательность элементов (хотя, похоже, она в порядке).
Почему программисты VB6 предполагают, что массив основан на единице? Отсчет от нуля является значением по умолчанию для массивов в VB6, если иное не указано в инструкции Option Base или путем явного определения нижней границы при объявлении массива. Я предпочитаю использовать LBound из-за того, что он не всегда может быть равен 0 (хотя, как заметил AnthonyWJones, в VBS это почти всегда будет). Но я бы сказал, что это плохая практика - иметь массив с нулевым отсчетом и не использовать выделенный arr(0) (и, следовательно, мы не должны предполагать, что кто-то это сделал). Однако я согласен с аргументами против использования For Each.
LBound не всегда может быть 0.
Хотя в VBScript невозможно создать массив, который имеет что-либо, кроме нижней границы 0, все же возможно получить массив вариантов из компонента COM, который мог указать другой LBound.
Тем не менее, я никогда не встречал человека, который бы делал что-то подобное.
Это мой подход:
dim arrFormaA(15)
arrFormaA( 0 ) = "formaA_01.txt"
arrFormaA( 1 ) = "formaA_02.txt"
arrFormaA( 2 ) = "formaA_03.txt"
arrFormaA( 3 ) = "formaA_04.txt"
arrFormaA( 4 ) = "formaA_05.txt"
arrFormaA( 5 ) = "formaA_06.txt"
arrFormaA( 6 ) = "formaA_07.txt"
arrFormaA( 7 ) = "formaA_08.txt"
arrFormaA( 8 ) = "formaA_09.txt"
arrFormaA( 9 ) = "formaA_10.txt"
arrFormaA( 10 ) = "formaA_11.txt"
arrFormaA( 11 ) = "formaA_12.txt"
arrFormaA( 12 ) = "formaA_13.txt"
arrFormaA( 13 ) = "formaA_14.txt"
arrFormaA( 14 ) = "formaA_15.txt"
Wscript.echo(UBound(arrFormaA))
''displays "15"
For i = 0 To UBound(arrFormaA)-1
Wscript.echo(arrFormaA(i))
Next
Надеюсь, это поможет.
Вы не можете использовать
For Eachдля непосредственного редактирования ячеек массива, посколькуyв вашем примере является копией ячейки массива, а не ссылкой. Для редактирования массиваFor i = LBound(arr) To UBound(arr)позволит ссылаться на ячейку напрямую, используяarr(i), и редактировать содержимое ячейки (например,arr(i) = Trim(arr(i))).