Пользовательская функция в EXCEL не работает, если возврат или вывод находится вне цикла FOR - PullRequest
0 голосов
/ 28 октября 2018
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 String
    Dim Size As Double
    Dim Days As Double
    Dim Totaldays As Double


        Totaldays = 0
        LString = quantity
        LArray = Split(LString, ",")
        Size = UBound(LArray) - LBound(LArray) + 1
                For i = 0 To Size
                        Contains = InStr(LArray(i), "-")
                        If Contains = 2 Then
                            Daysfromto = Split(LArray(i), "-")
                            Totaldays = Totaldays + Daysfromto(1) - Daysfromto(0) + 1
                        ElseIf Contains = 0 Then
                            Totaldays = Totaldays + 1
                        End If
                        MSGBOX Totaldays ' this works here
                Next i
    MSGBOX Totaldays ' this does not work here
    DISCOUNT = Totaldays ' this does not work here
End Function

1 Ответ

0 голосов
/ 28 октября 2018
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

Вы никогда не выйдете за пределы этого метода.

  1. Используйте Опция Явная .
  2. Не используйте On Error Resume Next.
  3. «не работает» не является ни действительным кодом ошибки, ни описанием ошибки.

Перезапись кода

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...