プロが教えるわが家の防犯対策術!

お世話になります。
byvalとbyrefについてお伺いいたします。
以下テキストからの引用(加工)ですが、
上はメッセージボックスに200 下は100が表示されますが、
下はCall sample8(A)とsample8をわざわざ渡す必要はあるのでしょうか?
結果が変わらないなら、渡す必要がないのでは?と思います。
よって、どういう時にbyvalを使うのかイメージがつきません。
意味あるのでしょうか?
____________________
Sub test()
Dim A As Long
A = 100
Call sample7(A)
MsgBox A
End Sub

Sub sample7(ByRef b As Long)
B = B * 2
End Sub
_____________________

_____________________
Sub test2()
Dim A As Long
A = 100
Call sample8(A)
MsgBox A
End Sub

Sub sample8(ByVal B As Long)
B = B * 2
End Sub
_____________________

A 回答 (2件)

結果を変えてほしくない場合に、byvalを使用します。


下記のsub1はAの値を2倍した結果をBに設定します。
sub1の中でAの値を変えていますが、呼び出し元のxの値変わりません。
100
200
とメッセージボックスに表示されます。
Sub test3()
Dim x As Long
Dim y As Long
x = 100
Call sub1(x, y)
MsgBox (x)
MsgBox (y)
End Sub

Sub sub1(ByVal A As Long, ByRef B As Long)
A = A * 2
B = A
End Sub
    • good
    • 1
この回答へのお礼

分かりやすかったです!ありがとうございます!!

お礼日時:2022/04/27 14:57

test と test2 って、ただの比較用サンプルマクロででは?



ByRefだと、飛んだ先のプロシージャで変更された値が戻ってきますよ。
ByValだと、飛んだ先のプロシージャで変更されてももとのプロシージャでは値は代わりませんよ。

と、挙動を確認するだけのもの。
(Msgbox は、結果を表示して違いを確認しやすくするために入れてあるだけ。)


Sub test2()
Dim A As Long
  A = InputBox("数字を入力してください")
  Call sample8(A)
  Call sample9(A)
  Call sample10(A)
End Sub

Sub sample8(ByVal B As Long)
  【入力値 Aについての処理1】  
End Sub

Sub sample9(ByVal B As Long)
  【入力値 Aについての処理2】  
End Sub

Sub sample10(ByRef B As Long)
  【入力値 Aについての処理3】  
End Sub

とか、同じ値で複数のプロシージャの並行処理させたいときなどにときに有効。
    • good
    • 1
この回答へのお礼

ありがとうございます!!よくわかりました!!

お礼日時:2022/04/27 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!