3

私の小さなサンプルコード

Function AddNr(ByRef x As Integer) As Integer
    x = x + 2
    AddNr = x
End Function

Sub test()
    Dim ana As Integer
    ana = 1
    AddNr (ana)
    MsgBox ana
End Sub

3 を出力する必要がありますが、1 を出力します。より具体的には、ana変数はAddNr関数の呼び出し後に変更されません。

私の環境は、Excel 2007 内の Microsoft Visual Basic 6.5 です。

4

2 に答える 2

10

Remou はすでにそれを釘付けにしていましたが、関数呼び出しでの括弧の役割を少し具体化できると思いました。プロシージャ コールの引数に余分な括弧のセットを追加すると、呼び出されたプロシージャが引数を参照渡しまたは値渡しするかどうかに関係なく、その引数が強制的に値渡しされます。このトピックに関する Microsoft の公式ヘルプ ページは次のとおりです:方法: 引数を強制的に値で渡す (Visual Basic)

この概念は、例によって最も簡単に説明されます。

Sub Foo(ByRef Bar)
    Bar = 1
End Sub

Sub TestFoo()
Dim Bar
    Bar = 0
    Foo Bar   'The variable Bar is passed ByRef to Foo
    Debug.Print Bar '--> 1

    Bar = 0
    Foo (Bar)  'The expression (Bar) is evaluated and 
               '  the resultant value 0 is passed ByVal to Foo
    Debug.Print Bar '--> 0

    Bar = 0
    Call Foo(Bar)  'The variable Bar is passed ByRef to Foo
    Debug.Print Bar '--> 1

    Bar = 0
    Call Foo((Bar))  'The expression (Bar) is evaluated and 
                     '  the resultant value 0 is passed ByVal to Foo
    Debug.Print Bar '--> 0
End Sub
于 2011-02-02T16:28:24.593 に答える
6

それは次のようになります。

 AddNr ana

つまり、ブラケットはありません。

Microsoft ヘルプから:

備考

プロシージャを呼び出すときに Call キーワードを使用する必要はありません。ただし、Call キーワードを使用して引数を必要とするプロシージャを呼び出す場合は、argumentlist を括弧で囲む必要があります。Call キーワードを省略する場合は、argumentlist を囲む括弧も省略する必要があります。いずれかの Call 構文を使用して組み込み関数またはユーザー定義関数を呼び出す場合、関数の戻り値は破棄されます。

于 2011-02-02T15:54:57.107 に答える