[[20220410104319]] 『ByValの使い方?』(初心者のよっちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ByValの使い方?』(初心者のよっちゃん)

ByRefの使い方は、何となく理解しているつもりですが、
ByValの利用方法が判りません。

ByRefなら呼び出し先で変数が変化すれば呼び出し元も同じく変化するので
「行って来い」ですが、Byvalは呼び出し先が変化しても呼び出し元に変化はない。

Byvalはどんな時に使えば良いか?
簡単な具体例で説明をお願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


理解されてるとおり、呼び出し先で変わったときに呼び出し元に影響が出ると困る場合に使えばよろしいのではないですか?

http://officetanaka.net/excel/vba/tips/tips94.htm

(もこな2) 2022/04/10(日) 12:55


どこのネット記事を見てもそんなに変わらない内容の解説ばかりで
実際、ByValをこんな時に使いなさい的な内容の記事を現状探せてない。

挙げられたTANAKAさんの記事もByval,ByRefの違い有りきの内容で
実際、コードを書く場合の参考になるような内容にとは思えません。

(初心者のよっちゃん) 2022/04/10(日) 15:03


 もこな2さんの回答が真だと思うのですが、蛇足な補足になれば。

 Sub Macro1()
    'ByRef
    Dim num As Long
    num = 100
    Debug.Print "ByRef:" & Case_ByRef(num)
    Debug.Print "  num:" & num
    'ByVal
    num = 100
    Debug.Print "ByVal:" & Case_ByVal(num)
    Debug.Print "  num:" & num
    'ByRef2
    num = 100
    Debug.Print "ByRef2:" & Case_ByRef2(num)
    Debug.Print "  num:" & num
 End Sub

 Function Case_ByRef(ByRef n As Long) As Long
    n = n * 1.1
    Case_ByRef = n
 End Function

 Function Case_ByVal(ByVal n As Long) As Long
    n = n * 1.1
    Case_ByVal = n
 End Function

 Function Case_ByRef2(ByRef n As Long) As Long
    Dim m As Long
    m = n * 1.1
    Case_ByRef2 = m
 End Function

 簡単な具体例との事でしたので、上記コードを挙げました。
 渡した先で元の値を変更するコードを書かなければ、ByRef/ByVal どちらでも一緒の事(元の値に変化なし)なので、
 「呼び出し先で変わったときに呼び出し元に影響が出ると困る場合に使えばよろしいのでは」という事になります。

 あとはイベントプロシージャでByValを指定しないとエラーになったりするものもあります。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.change
(碧) 2022/04/10(日) 16:43

引数の基本は ByVal です。

引数経由で結果を受けとる等の
必要性がある場合にのみ ByRef にします。

http://addinbox.sakura.ne.jp/Excel_Tips01.htm

(AddinBox_角田) 2022/04/10(日) 17:18


仕様が変更になり、引数が2の時も0と同様の
処理をすることになった場合。
最初に2だったら0に置きかえる。
呼び出し元には影響なし。
(ax) 2022/04/10(日) 18:02

>引数の基本は ByVal です。

ByRefが基本では無いのですか、
Function Case_ByRef(ByRef n As Long) As Long は、略して
Function Case_ByRef(n As Long) As Long と書くことが可能ですが、
ByValは、略して書くことが出来ません。

なので、ByRefが基本だと私は思っていました。

>必要性がある場合にのみ ByRef にします。

なので、必要ある時のみByValと明記するのでは ?

	仕様が変更になり、引数が2の時も0と同様の
	処理をすることになった場合。
	最初に2だったら0に置きかえる。
	呼び出し元には影響なし。

上記は、私には何のことやら理解不能で判りません。

(初心者のよっちゃん) 2022/04/10(日) 18:42


 えっと
 ・「プログラミングの考え方の基本」と「言語処理系の既定」はちょっと違います。
 ・VBA(とその基となったVB6)はかなり古い言語処理系で、「言語処理系の既定」は ByRefです。 
 ・ByValでは、呼び出しのために、引数のコピーが作られます。ByRefは同じメモリ領域を参照します。
 ・ByRefでは、引数のコピーを作らないため、メモリ領域の節約、コピー処理の時間の節約などのメリットがあります。
 ・ByValでは、不意の(意図的でない)の変数の書き換えによるバグの入り込みが少なくなることがメリットです。
 ・ByRefのメリットは、計算機のメモリ領域の増大やCPUの処理能力の向上によって、あまり重要でなくなりました。
 ・相対的にバグ防止のためByValを使うことが推奨されるようになりました
 ・「プログラミングの考え方の基本」は時代(というか計算機の性能の向上)と共に変わったりします。
 ・なので、「プログラミングの考え方の基本」は今はByValです。
 ・最近の言語処理系などでは「言語処理系の既定」が値渡しのものも多いです。
ということでいかがでしょうか
(´・ω・`) 2022/04/10(日) 19:48

>プログラミングの考え方の基本」と「言語処理系の既定」はちょっと違います。
>ByValでは、不意の(意図的でない)の変数の書き換えによるバグの入り込みが少なくなることがメリットです。
>相対的にバグ防止のためByValを使うことが推奨されるようになりました

なるほど、
ByRefは、書き換えを認識しなくても書き換えられるのが仕様なので
ByValの方はその可能性がなくバグ防止のためByValを使うことが推奨さているし
メモリー効率は、昔に比較して有り余るほどのメモリーを利用できるので考慮する必要もない。

>ということでいかがでしょうか

ByValだけ考えたほうが良さそうなので
ByRefは使用しない事を基本にしたいと思うようになりました。

(初心者のよっちゃん) 2022/04/11(月) 08:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.