在If语句中使用函数时,VBA ByRef参数类型不匹配

时间:2016-08-09 20:40:51

标签: vba variant

当我从if语句中的另一个函数调用函数时,我遇到了一个奇怪的问题。我定义了一个Sub,我用它来测试这个函数,它调用一个函数,它依赖于我用来比较值的另一个函数。代码如下,这应该清楚。基本上,我不明白代码如何在print语句中正常工作,然后在GetMatch函数中抛出错误。我感谢任何帮助。

编辑:突然间一切正常。调试断点会影响程序吗?我没有改变任何东西,但在调用GetMatch时不再需要CStr()。我还没有触及任何潜艇或功能,但我确实清除了一些断点。如果我找到了导致它的原因,我会发布一个解决方案。感谢大家的帮助。

Edit2:也许这是VBA的错误?如果我将CStr()选项添加到indexOrder(...)调用,那么事情就可以了。以前,没有CStr()选项,事情就不起作用了。现在,奇怪的是,在使用CStr()之后,我能够完全从程序中删除CStr(),并且事情再次起作用。如果我撤消到他们原本不在那里的地方,它就会破裂。我不知道这可能是什么,但如果有人有解释,我很感兴趣。感谢

Sub testFind()
    Dim SortOrder() As Variant
    Dim indexOrder() As Variant
    SortOrder = Array("Contact Email", "Last Name", "First Name", "Attempt #", "Customization", "Template #")
    indexOrder = Array("First Name", "First Name", "Template #", "Customization")
    findAndReplace(indexOrder, SortOrder)
End Sub


Function findAndReplace(indexOrder As Variant, list As Variant) As Variant
    Dim indexLength As Integer
    Dim listLength As Integer
    Debug.Print TypeName(indexOrder(0)) ' Identifies as String
    indexLength = getVariantLength(indexOrder)
    listLength = getVariantLength(list)
    Debug.Print GetMatch(CStr(indexOrder(1)), CStr(indexOrder(1))) ' This works fine. Returns 0 as it should
    If GetMatch(indexOrder(1), indexOrder(1)) = 0 Then ' Fails with ByRef error
        Debug.Print ("Why don't I work?")
    End If
End Function


Function GetMatch(A As String, B As String) As Integer
    A = Trim(A)
    B = Trim(B)
    If (IsEmpty(A) Or Trim(A) = "") Then
        GetMatch = 1
        Exit Function
    ElseIf (IsEmpty(B) Or Trim(B) = "") Then
        GetMatch = -1
        Exit Function
    End If
    GetMatch = StrComp(A, B, vbTextCompare)
End Function

Function getVariantLength(vari As Variant) As Integer
    If IsNull(index) Then
        getVariantLength = 0
    Else
        getVariantLength = UBound(vari) - LBound(vari) + 1
    End If
End Function

1 个答案:

答案 0 :(得分:0)

你没有Sub vartest()或Function vartest(),它试图调用一个不存在的子/函数,或者至少它不是包括在内。

编辑:你没有对这个功能做任何事情。一个函数会返回一个值,一个子函数将会返回一个值。一些东西。您需要为它返回的任何内容分配一个变量,或者执行MessageBox或其他一些返回值的方法。

下一个问题是它试图调用一个未定义或列出的函数getVariantLength()。