Ошибка вызова функции VBA из другой функции - PullRequest
0 голосов
/ 19 ноября 2010

Ниже приведен код, который я написал, однако у меня продолжает возникать проблема со строкой, к которой я добавил комментарий, и только с этой строкой. Я закомментировал все остальные строки и выделил это как проблемную строку, но на всю жизнь и после часа или более исследований, которые я провел, я не могу понять, в чем проблема. Вероятно, это действительно очевидный, но я действительно застрял, и это сводит меня с ума.

В любом случае, код должен использоваться для получения диапазона данных, содержащих времена смены и языковые возможности, и показывает, сколько людей с конкретным языком доступно в течение данного периода времени (The_Time в приведенном ниже коде)

Любая помощь будет принята с благодарностью!

Function ReturnAvailability(The_Time As String, The_Info As Range)

Dim The_Lang As String
Dim The_Shift_Start As String
Dim The_Shift_End As String
Dim stGotIt As String
Dim stCell As Integer
Dim Counter As Integer

Counter = 0

For Each r In The_Info.Rows
    For Each c In r.Cells
        stCell = c.Value
        If InStr(stCell, "Eng") > 0 Then
            The_Lang = "Eng"
        ElseIf InStr(c, ":") > 0 Then
            stGotIt = StrReverse(c)
            stGotIt = Left(c, InStr(1, c, " ", vbTextCompare))
            The_Shift_End = StrReverse(Trim(stGotIt))
            stGotIt = Left(The_Shift, InStr(1, The_Shift, " ", vbTextCompare))
            The_Shift_Start = stGotIt
            stCell = ReturnAvailabilityEnglish(The_Time, The_Shift_Start, The_Shift_End) ' this is the line causing the error
        End If
    Next c
Next r

ReturnAvailability = Counter

End Function


Function ReturnAvailabilityEnglish(The_Time As String, The_Shift_Start As String, The_Shift_End As String)

Dim Time_Hour As Integer
Dim Time_Min As Integer
Dim Start_Hour As Integer
Dim Start_Min As Integer
Dim End_Hour As Integer
Dim End_Min As Integer
Dim Available As Integer

Available = 13

Time_Hour = CInt(Left(The_Time, 2))
Time_Min = CInt(Right(The_Time, 2))
Start_Hour = CInt(Left(The_Shift_Start, 2))
Start_Min = CInt(Right(The_Shift_Start, 2))
End_Hour = CInt(Left(The_Shift_End, 2))
End_Min = CInt(Right(The_Shift_End, 2))

If Start_Hour <= Time_Hour And Start_Min <= Time_Min Then
    If End_Hour > Time_Hour And End_Min > Time_Min Then
        Available = 1
    Else
        Available = 0
    End If
End If

ReturnAvailabilityEnglish = Available

End Function

Спасибо, Darragh J

1 Ответ

1 голос
/ 19 ноября 2010

Вы объявили

Dim stCell As Integer

Что означает, что эта часть не может работать:

stCell = c.Value
If InStr(stCell, "Eng") > 0 Then

Либо назначение c.Value завершится ошибкой, поскольку оно содержит текст, либо InStr (stCell, "Eng") никогда не будет истинным, поскольку все ячейки в диапазоне являются числовыми.

Вам не хватает текста для сравнения:

 If InStr(1, stCell, "Eng", vbTextCompare) > 0 Then

Это тоже проблема, вам нужно добавить чек, как показано:

If The_Time = vbNullString Or The_Shift_Start = vbNullString _
    Or The_Shift_End = vbNullString Then
    Available = -1
Else

    Time_Hour = CInt(Left(The_Time, 2))
    Time_Min = CInt(Right(The_Time, 2))
    Start_Hour = CInt(Left(The_Shift_Start, 2))
    Start_Min = CInt(Right(The_Shift_Start, 2))
    End_Hour = CInt(Left(The_Shift_End, 2))
    End_Min = CInt(Right(The_Shift_End, 2))

    If Start_Hour <= Time_Hour And Start_Min <= Time_Min Then
        If End_Hour > Time_Hour And End_Min > Time_Min Then
            Available = 1
        Else
            Available = 0
        End If
    End If
End If
ReturnAvailabilityEnglish = Available

Наконец, и самое главное, ваша функция всегда будет возвращать 0, потому что вы устанавливаете счетчик на 0 в начале и никогда не обновляете его.

...