2016-08-09 17 views
2

ifステートメント内の別の関数から関数を呼び出すときに奇妙な問題が発生しています。私はこの関数をテストするために使用しているSubを定義し、値を比較するために使用する別の関数に依存する関数を呼び出します。コードは以下の通りですが、これは明確にする必要があります。基本的には、printステートメントでコードが正常に動作し、GetMatch関数でエラーが発生する可能性があります。私はどんな助けにも感謝します。VBA ByRef引数型の不一致If関数内の関数の使用時に

編集:突然すべてが機能します。デバッグ中のブレークポイントはプログラムに影響しますか?私は何も変更していませんが、GetMatchを呼び出すときにCStr()は必要なくなりました。私は、サブまたは関数のいずれかに触れていないが、私はいくつかのブレークポイントをクリアした。それが原因で見つかった場合は、解決策を投稿します。みんな助けてくれてありがとう。

Edit2:おそらくこれはVBAのバグですか? indexOrder(...)呼び出しにCStr()オプションを追加すると、何かが機能します。以前は、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 
+2

Cstr()を使用して値をstrに変更するときにGetMatchが機能する場合は、なぜIF文で使用しないのですか? 'GetMatch(CStr(indexOrder(1))、CStr(indexOrder(1)))= 0 Then' –

+0

これはうまくいきますが、なぜですか? TypeNameはVariantに文字列値を返します。なぜそれが引数として渡されませんか? – RWA4ARC

答えて

0

あなたがサブvartestを持っていない()または機能vartest()は、存在しないサブ/関数を呼び出ししようとしている、あるいは少なくともそれが含まれていません。

編集:あなたはこの機能で何もしていません。関数は値を返し、サブは何か「何か」を行います。返すものに変数を代入するか、MessageBoxなどの方法で値を返す必要があります。

次の問題は、定義されていない、またはリストされていない関数getVariantLength()を呼び出そうとしていることです。

+1

申し訳ありませんが、私は一番あった、それは置き換えられました。私は自分のコードで間違ったテスト関数を消去しました。 – RWA4ARC

+0

問題ありません。それは、Variantを求めているときに整数、long、doubleなどを与えようとしているときに、その値をCVar()でVariantに変換することができます。 http://www.techonthenet.com/excel/formulas/cvar.php – Alex

+0

ありがとう、実際に知っておいてよかったです。文字列に変換しているように見えますが、それでも動作しますが、理由はわかりません。 – RWA4ARC

関連する問題