VBA中的ByRef参数类型不匹配。

3

在我的主代码部分,我最初有一个丑陋的if语句 - 虽然它很丑陋,但可以运行。我决定将其制作成一个我将调用的函数,这导致我出现了一个错误“编译错误:ByRef参数类型不匹配”。我的假设是函数需要正确引用,尽管我一直在阅读文档,但无法理解为什么 >.<

声明ShiftValue变量: Dim ShiftValue As String
ShiftValue = LCase(Sheets("Raw_Rota").Cells(Counter, "C").Value)

函数内容和声明:

Function ShiftCompare(ByRef ShiftValue As String)

If StrComp(ShiftValue, "am", vbTextCompare) = 0 Then
        Call IncAMs(AMs)   'this function increments the variable by 1.
        Call Inc(Counter)

    ElseIf StrComp(ShiftValue, "pm", vbTextCompare) = 0 Then
        Call IncPMs(PMs)
        Call Inc(Counter)

    ElseIf StrComp(ShiftValue, "days", vbTextCompare) = 0 Then
        Call IncDays(Days)
        Call Inc(Counter)

    ElseIf StrComp(ShiftValue, "leave", vbTextCompare) = 0 Then
        Call IncLeave(Leave)
        Call Inc(Counter)

    Else 'If the string doesn't compare to the above values tally it as unknown
        Call IncUnknown(Unknown)
        Call Inc(Counter)
    End If
End Function

更新:

我的函数调用在 If 部分的 Else 分支中,如下所示:

If X
"'Do stuff..."

Else 

Call ShiftCompare(ShiftValue)

EndIf

错误发生在 Function 行: Function ShiftCompare(ByVal ShiftValue As String) 所引用的单元格中的值可能为空或为字符串。

你需要将它声明为“ByRef”吗?看起来你并没有将其用作返回给调用函数的任何内容,所以建议使用“ByVal”。 - braX
ByVal 没有改变任何东西 - 只是传递变量本身而不指定也没有改变。已更新帖子以回答那些问题,Alex :) - John Higgs
将函数改为子程序,或者将参数作为括号中的字符串传递。像这样:Call ShiftCompare("ShiftValue") - Vityata
很遗憾,我会继续自己阅读文档 - 感谢大家迄今为止的帮助! - John Higgs
@JohnHiggs - 在调用函数之前,你能否在代码行中写入 debug.print ShiftValue - Vityata
2个回答

1
除了Vityata上面的回答,考虑使用Select语句来避免所有那些ElseIf语句。它运行得更快。
Option Compare Text
Public Sub ShiftCompare(ByVal ShiftValue As String)
    Select Case True
        Case StrComp(ShiftValue, "am") = 0:
            Call IncAMs(AMs)   'this function increments the variable by 1.
            Call Inc(Counter)

        Case StrComp(ShiftValue, "pm") = 0:
            Call IncPMs(PMs)
            Call Inc(Counter)

        Case StrComp(ShiftValue, "days") = 0:
            Call IncDays(Days)
            Call Inc(Counter)

        Case StrComp(ShiftValue, "leave") = 0:
            Call IncLeave(Leave)
            Call Inc(Counter)

        Case Else:  'If the string doesn't compare to the above values tally it as unknown
            Call IncUnknown(Unknown)
            Call Inc(Counter)
    End Select
End Sub

0
调用函数时,参数的值不是字符串。请检查 ShiftValue 的值并重试。如果您想确保它是一个字符串,请像这样传递它:Call ShiftCompare("MyStringValue")
函数的意义在于它返回一个值是很好的。 而你的函数没有返回值。请将Function改为Sub

1
没错 - 在调用时该值为空。我的初始for循环正在获取null或空变量值并在最后一个if语句中处理它们,而在调用函数时,该值不能为null/empty。在调用该子程序之前将验证该值不为null/empty。感谢您的帮助! - John Higgs
1
@JohnHiggs - 只是提醒一下 - 在 VBA 中,“null”和“empty”是不同的术语。请注意您正在检查哪一个。 - Vityata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接