Ах, хорошо, это один из тех классических "при удалении строки, цикла
от конца к началу "
По сути, причина, по которой Subscript out of range
была выброшена - после удаления элемента из коллекции через
disabledElems.Remove i
Уменьшен размер Collection
с Collection.Count
до Collection.Count - 1
, однако во время объявления цикла for
i
уже был жестко установлен по сравнению с предыдущим Collection.Count
В практическом примере:
Допустим, мой Collection
выглядит так
disabledElems = "button1", "button2"
После этого
controlName = "button1"
For i = 1 to disabledElems.Count ' <= 2
If disabledElems(i) = controlName ' < True for i = 1
disabledElems.Remove i ' < button1 was removed from collection, however it still loops
End If
' will loop to i = 2. However disabledElems(2) no longer exists, because upon removal _
the button2 was shifted to disabledElems(1) - hence Subscript out of range
Next i
Очевидный случай попытки получить доступ к элементу, который сместил свою позицию в очереди.
Есть два возможных исправления (о которых я могу думать) :
1. Принудительно Exit Sub
при удалении
For i = 1 to disabledElems.Count
If disabledElems(i) = controlName
disabledElems.Remove i
Exit Sub
End If
Next i
2. Цикл от конца к началу
Dim i as Integer ' needs to be redeclared to int, because Byte can't -1
For i = disabledElems.Count to 1 Step -1
If disabledElems(i) = controlName
disabledElems.Remove i
End If
Next i