【发布时间】: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 上返回一个字符串值,为什么不将它作为一个传递给参数?