LArray = Split(LString, ",")
По умолчанию это создает 1-D массив на основе нуля.Для вашего примера это будет LArray(0 to 4)
, что в общей сложности 5 элементов массива.Ноль, один, два, три, четыре - это 5 элементов массива.
При использовании
Size = UBound(LArray) - LBound(LArray) + 1
... это то же самое, что Size = 4 - 0 + 1
, который правильно отображает 5 элементов массива,Однако при использовании
For i = 0 To Size
... вы пытаетесь получить доступ к 6 элементам массива с помощью LArray(i)
.Ноль, один, два, три, четыре, пять - это шесть элементов массива, а не 5.
Решение:
Всегда использовать,
for i = lbound(LArray) to ubound(LArray)
...
next i
Вы никогда не выйдете за пределы этого метода.
- Используйте Опция Явная .
- Не используйте
On Error Resume Next
. - «не работает» не является ни действительным кодом ошибки, ни описанием ошибки.
Перезапись кода
Option Explicit
Sub main()
Debug.Print DISCOUNT("1-2,3,4,5-10,23")
End Sub
Function DISCOUNT(quantity) ' "1-2,3,4,5-10,23" is the data in <quantity>
Dim LString As String
Dim LArray() As String
Dim Daysfromto As Variant
Dim Days As Double
Dim Totaldays As Double
Dim i As Long, Contains As Long
Totaldays = 0
LString = quantity
LArray = Split(LString, ",")
For i = LBound(LArray) To UBound(LArray)
Contains = InStr(LArray(i), "-")
If Contains > 0 Then
Daysfromto = Split(LArray(i), "-")
Totaldays = Totaldays + CLng(Daysfromto(1)) - CLng(Daysfromto(0)) + 1
ElseIf Contains = 0 Then
Totaldays = Totaldays + 1
End If
'Debug.Print Totaldays ' this works here
Next i
'Debug.Print Totaldays
DISCOUNT = Totaldays
End Function