Excel 从另一个函数中调用VBA函数时出现问题

Excel 从另一个函数中调用VBA函数时出现问题,excel,function,vba,return,Excel,Function,Vba,Return,下面是我写的代码,但是我在添加注释的那一行中不断遇到问题,只有那一行。我已经注释了所有其他行,并将其作为问题行隔离,但就我的一生而言,经过一个多小时的研究,我无法找出问题所在。这可能是非常明显的一个,但我真的被卡住了,这让我发疯 无论如何,该代码用于获取一系列包含轮班时间和语言能力的数据,并显示在给定时间段(以下代码中的时间)内有多少人可以使用特定语言 任何帮助都将不胜感激 Function ReturnAvailability(The_Time As String, The_Info As R

下面是我写的代码,但是我在添加注释的那一行中不断遇到问题,只有那一行。我已经注释了所有其他行,并将其作为问题行隔离,但就我的一生而言,经过一个多小时的研究,我无法找出问题所在。这可能是非常明显的一个,但我真的被卡住了,这让我发疯

无论如何,该代码用于获取一系列包含轮班时间和语言能力的数据,并显示在给定时间段(以下代码中的时间)内有多少人可以使用特定语言

任何帮助都将不胜感激

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
函数ReturnAvailability(时间作为字符串,信息作为范围)
把这条线调暗
调暗\u Shift\u开始为字符串
将\u Shift\u End变暗为字符串
将其设置为字符串
将stCell设置为整数
作为整数的Dim计数器
计数器=0
对于_Info.行中的每个r
对于r.单元格中的每个c
stCell=c.值
如果仪表(stCell,“Eng”)>0,则
_Lang=“Eng”
其他指令(c,“:”)则大于0
stGotIt=StrReverse(c)
stGotIt=左(c,InStr(1,c,“,vbTextCompare))
_Shift_End=StrReverse(修剪(stgott))
stGotIt=左(移位,InStr(1,移位,“,vbTextCompare))
_Shift_Start=stgott
stCell=ReturnAvailabilityEnglish(时间、轮班开始、轮班结束)这是导致错误的行
如果结束
下一个c
下一个r
返回可用性=计数器
端函数
函数ReturnAvailabilityEnglish(时间为字符串,移位开始为字符串,移位结束为字符串)
Dim Time_Hour为整数
Dim Time_Min为整数
Dim Start_小时为整数
Dim Start_Min为整数
Dim End_小时为整数
Dim End_Min为整数
Dim以整数形式提供
可用=13
时间=分钟(左(时间,2))
Time_Min=CInt(右(时间,2))
开始时间=分钟(左(换档开始时间,2))
Start\u Min=CInt(右(换档\u Start,2))
结束时间=分钟(左(班次结束,2))
End_Min=CInt(右(移位_End,2))
如果开始时间为小时,则
可用=1
其他的
可用=0
如果结束
如果结束
ReturnAvailabilityEnglish=可用
端函数
谢谢, Darragh J

您已经声明

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
如果\u Time=vbNullString或\u Shift\u Start=vbNullString_
或者_Shift_End=vbNullString
可用=-1
其他的
时间=分钟(左(时间,2))
Time_Min=CInt(右(时间,2))
开始时间=分钟(左(换档开始时间,2))
Start\u Min=CInt(右(换档\u Start,2))
结束时间=分钟(左(班次结束,2))
End_Min=CInt(右(移位_End,2))
如果开始时间为小时,则
可用=1
其他的
可用=0
如果结束
如果结束
如果结束
ReturnAvailabilityEnglish=可用

最后,也是最重要的一点,您的函数将始终返回0,因为您在开始时将计数器设置为0,并且从不更新它。

哪一行导致错误?是编译错误还是运行时错误?很抱歉,我的工作表中没有正确的值,它只返回#值!不确定这是否重要,但您尚未为
ReturnAvailabilityEnglish
定义返回类型。当您调试时,是否返回您期望的值?嗯,代码的逻辑是关闭的,因为我的VB有点生锈,但该函数工作正常,当我直接从工作表调用该函数时,我收到了一个实际值。我刚刚解决了这个问题,但没有任何区别。我还是刚刚得到了价值!在我的工作表中。谢谢你指出这一点!任何其他想法…?感谢这些笔记,我实际上和之前在试图纠正这个问题时发现的比较有问题,所以我把它们去掉了。我已将它们添加回,它们不会导致任何问题,而且我知道始终返回0问题,这无关紧要,因为我目前没有收到任何有效值。也谢谢你的支票。然而,这仍然没有解决问题,这是怎么回事?我已经测试过了,在这种格式下,
=ReturnAvailability(“16:42”,A1:A2)
=ReturnAvailability(“16:42”,info)
,其中info是一个命名范围,代码对我有效。是的,现在在家似乎对我有效:感谢所有的帮助,我想剩下的都只是逻辑错误