2017-06-02 26 views
2

変数としてVBA関数に引数として渡しましたが、元の変数ではなく関数内の引数のみを参照しました。元の変数が関数によって変更されているようです。つまり、同じアドレス空間を共有していますか?ここで何が起こっているのですか?ここで関数に渡されたVBA変数が変更されました

は、関数である:(単位、数十、数百と何千ものグローバル整数変数です)

Function Components(qty As Integer, stringSize As Integer) 

If qty < stringSize Then 
    units = qty 

ElseIf qty >= stringSize * 100 Then 
    thousands = qty \ (stringSize * 100) 
    qty = qty - (thousands * stringSize * 100) 
    Components qty, stringSize 


ElseIf qty >= stringSize * 10 Then 
    hundreds = qty \ (stringSize * 10) 
    qty = qty - (hundreds * stringSize * 10) 
    Components qty, stringSize 

ElseIf qty >= stringSize Then 
    tens = qty \ (stringSize) 
    qty = qty - (tens * stringSize) 
    Components qty, stringSize 

End If 

End Function 

と私は

Components charQty, 26 
charQtyは= 565それを

を使用して別の関数からそれを呼び出しますコンポーネントが完了した後、コンポーネントに引き数として渡され、 のcharQty = 19に渡されます。私は関数呼び出しの直前と直後の値を出力することでこれを判断しました。

私はVBAをかなり新しくしています。どんな助けでも大歓迎です。

+0

パラメータは暗黙[により渡されVBAの(ByRef')参照(https://stackoverflow.com/documentation/vba/7363/passing-arguments-byref-or-byval/24427/byref#t=201706020439138540139)。 [値を渡す](https://stackoverflow.com/documentation/vba/7363/passing-arguments-byref-or-byval/28511/byval#t=201706020440066200781)を考えてみましょう。 –

答えて

5

他のほとんどの言語とは異なり、VBAのパラメータのデフォルト動作は、ByRefです。つまり、元のオブジェクト/変数への参照が渡され、元のオブジェクト/変数が呼び出された関数によって変更されます。 。

代わりにByValを使用します。この場合、値の一時コピーが呼び出された関数に渡されます。一時的であるため、関数の終了時に変更が失われます。オブジェクトは常にオブジェクトへの参照によって参照されているため、...のように注意する

Function Components(ByVal qty As Integer, ByVal stringSize As Integer) 

一つのこと、その参照の一時的なコピーは、まだ元のオブジェクトを指すようになるだろう。したがって、ByValを指定した場合でも、オブジェクトがByRefを渡すかのように、ほとんど*です。 (*機能が他のオブジェクトにそのパラメータのSetを実行した場合、元のオブジェクトがまだ機能の外に指摘されるであろうことを除いて。)

MSDN documentation

+1

もちろん渡される変数がオブジェクトでない限り。次に、 'ByVal'変数は参照変数の単なるコピーですが、*同じ*オブジェクトを指しています。他のほとんどの言語は、「参照」ではなく「バイ・バリュー」にデフォルト設定されていることを指摘する価値があります。 – ThunderFrame

+0

@ThunderFrame - 私はオブジェクトについて少し入れようとしましたが、非常に混乱するほどです。 (これをさらに変更する必要があると思ったら、自由に回答を編集してください。この種のものの詳細な説明が始まると、私は通常混乱してしまいます。) – YowE3K