【问题标题】:VBA ByRef Argument Type Mismatch When Using Function In If Statement在 If 语句中使用函数时 VBA ByRef 参数类型不匹配
【发布时间】:2016-12-16 01:10:17
【问题描述】:

当我从 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

【问题讨论】:

  • 如果 GetMatch 在使用 Cstr() 将值更改为 str 时有效,为什么不在 IF 语句中使用它呢? If GetMatch(CStr(indexOrder(1)), CStr(indexOrder(1))) = 0 Then
  • 好的,这确实有效,但为什么呢? TypeName 在 Variant 上返回一个字符串值,为什么不将它作为一个传递给参数?

标签: vba variant


【解决方案1】:

您没有 Sub vartest() 或 Function vartest(),它正在尝试调用不存在的子/函数,或者至少不包含它。

编辑:你没有对函数做任何事情。一个函数将返回一个值,一个子将“做”一些事情。您需要将变量分配给它返回的任何内容,或者执行 MessageBox 或其他返回值的方式。

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

【讨论】:

  • 对不起,我有一个 vartest,它被替换了。我在我的代码中删除了错误的测试函数。
  • 没问题。当它要求一个变体并且你试图给它一个整数、长整数、双精度等时。你可以使用 CVar() 将该值转换为变体。 techonthenet.com/excel/formulas/cvar.php
  • 谢谢,很高兴知道这一点。它看起来将它转换为字符串,也可以,但我不知道为什么。
  • 我确实使用了 GetMatch 值。当我打电话给Debug.Print GetMatch(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多