「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ByVal

pointこの用語のポイント

point値渡しを示す目印だよ

point変数のコピーを渡すよ

pointVBとかVBAの話で出てくるよ

スポンサーリンク

簡単に書くよ

ByVal(読:バイバル)とは

VB(プログラムの元ネタを書くときに使う言葉(プログラミング言語)のひとつ)とかVBA(Microsoft Office製品用にあれこれ調整したVisual Basic)の話で出てくるかもしれない用語のひとつ
であり

「この変数(プログラミングにおける値を入れておく箱)(引数(関数に渡す値)は値渡し(渡す変数をコピーして、コピーした変数を「これを使ってね」と渡すやり方)ですよ!」を示す目印
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

VB
VBA
変数
関数
引数(ヒキスウ)
値渡し(と参照渡し


について説明します。
特に値渡し(と参照渡し)については結構ガッツリ説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

VBVBAプログラミング言語です。
詳細は、それぞれの用語の説明を ご覧ください。

ByVal

変数は「プログラミング言語における『値を入れておく箱』」です。
処理の途中で値を入れたり、逆に取り出したりできます。

ByVal2

関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。

ByVal3

引数は「プログラムや関数に渡す値」です。

ByVal4

ちょっと汚い話で恐縮ですが、人間は ご飯を食べて、ウンチを出します。

ByVal5

人間を関数だとすれば、ご飯に相当するものが引数です。
あと、ついでなので書いておくと、ウンチに相当するものは戻り値です。

ByVal6

値渡しは引数の渡し方のひとつで「変数をコピーして渡すやり方」です。

関数に変数を引数として渡すときの渡し方には、実は2種類あります。
それは

1.元の変数をコピーして渡すやり方
2.元の変数の置いてある場所を書いた紙を渡すやり方


の2つです。

ByVal7

この2つの渡し方のうち

1.元の変数をコピーして渡すやり方

が値渡しです。

ByVal8

あと、ついでなので書いておくと

2.元の変数の置いてある場所を書いた紙を渡すやり方

の方は「参照渡し」と言います。
気が向いたら、併せて覚えてあげてください。

ByVal9

例えば、そうですね。

ここにピヨ太関数が ありました。

ByVal10

ピヨ太関数は変数「ミカン箱」に値「ミカン1つ」を入れました。

ByVal11

ピヨ太関数は値「ミカン1つ」が入った変数「ミカン箱」をピヨ子関数に引数として渡すことにしました。

ByVal12

まずは値渡しから説明します。

値渡しの場合、ピヨ太関数は変数「ミカン箱」をコピーします。

ByVal13

※ピヨの左手ピヨの右手(ピヨピヨフェイク)の詳細が気になる方は、用語「ピヨの左手ピヨの右手」の説明を ご覧ください。

次に、コピーした変数「ミカン箱」を「これを使ってね」とピヨ子関数に渡します。

ByVal14

これが値渡しです。
変数「ミカン箱」は2つに分身します。

ByVal15

おっと!大変です。
ピヨ子関数が変数「ミカン箱」の中にあるミカンを食べてしまいました。

ByVal16

でも大丈夫です。

ピヨ子関数に渡したのはコピーした変数「ミカン箱」です。
ピヨ太関数の手元にある変数「ミカン箱」の中身のミカンは残っています。

ByVal17

これが値渡しの特徴です。

呼び出した関数内で変数の値を書き換えても、呼び出し元の変数は影響を受けない

のです。

「えっ?それって普通じゃないの?」と思う人もいるでしょう。
プログラミングを始めたばっかりの人ほど「普通のことを何もったいぶって説明してるんだ」と感じるはずです。

まぁ、落ち着いて最後まで読んでくださいな。

次に参照渡しの説明をします。

参照渡しでは、ピヨ太関数はピヨ子関数に「変数『ミカン箱』の置いてある場所」を書いた紙を渡します。
「変数『ミカン箱』を使いたければ、この紙を頼りに探して、見つかった変数『ミカン箱』を使ってね!」なのです。

ByVal18

これが参照渡しです。
値渡しのときと違って、変数「ミカン箱」は分身しません。
1つだけです。

ByVal19

おっと!大変です。
ピヨ子関数が「変数『ミカン箱』の置いてある場所」を書いた紙をもとにして変数「ミカン箱」を見つけ、変数「ミカン箱」の中にあるミカンを食べてしまいました。

ByVal20

ピヨ子関数がミカンを食べた変数「ミカン箱」は、ピヨ太関数の手元にある変数「ミカン箱」と同じものです。
ピヨ太関数の手元にある変数「ミカン箱」の中にあるミカンが、なくなってしまいました。

ByVal21

これが参照渡しの特徴です。

呼び出した関数内で変数の値を書き換えると、呼び出し元の変数の中身も書き変わる

のです。

並べて書くと、以下のようになります。

■値渡し
・変数のコピーを渡す
・変数の中身を書き換えても呼び出し元には影響しない

■参照渡し
・変数の置いてある場所を書いた紙を渡す
・変数の中身を書き換えると呼び出し元の変数の中身も書き変わる


せっかくなので、もう少しプログラミングっぽい例も挙げてみましょう。

例えば、引数を値渡しする以下の処理があったとします。

ピヨ太関数(){
 ミカン箱=ミカン1

 ピヨ子関数呼び出し(【値渡し】ミカン箱)

 ミカン箱の中身を表示

}

ピヨ子関数(ミカン箱){
 ミカン箱=ミカン0
}


この処理を実行すると

ミカン1

と表示されます。

ピヨ子関数の中で何が起ころうと影響を受けないからです。
ピヨ太関数がミカン箱に対してやった処理は

1.ミカン箱=ミカン1
2.ミカン箱の中身を表示


の2つだけです。

引数を参照渡しする以下の処理もありました。

ピヨ太関数(){
 ミカン箱=ミカン1

 ピヨ子関数呼び出し(【参照渡し】ミカン箱)

 ミカン箱の中身を表示

}

ピヨ子関数(ミカン箱){
 ミカン箱=ミカン0
}


こちらの処理は、実行すると

ミカン0

と表示されます。

ピヨ太関数のミカン箱とピヨ子関数のミカン箱は同じものだからです。
ピヨ太関数がミカン箱に対してやった処理は

1.ミカン箱=ミカン1
2.ミカン箱=ミカン0(ピヨ子関数の中でやった処理結果が反映される)
3.ミカン箱の中身を表示


の3つになります。

これが値渡しと参照渡しの違いです。

基本的に、関数に対して情報を与えたいだけの場合は値渡しを使います。
呼び出し元から呼び出し先の関数に対する一方通行の場合です。

ByVal22

関数内での変更を呼び出し元にも反映したい場合は参照渡しを使います。
呼び出し元と呼び出し先の関数で双方向のやり取りをしたい場合です。

ByVal23

「どっちにすれば良いのかな?」と迷った場合は「値渡し」にしてください。
値渡しの方が考え方も単純ですし影響範囲も分かりやすいはずです。
それで進めてみて「値渡しでは無理だな!」と分かった時点で参照渡しに変更しましょう。

特にプログラミング初心者の場合は「全部、値渡しで作ってやるぜ!」な心持ちでいて、どうしても実現できないところだけ参照渡しを使うようにした方がバグ(プログラムの おかしいところ)は少なくなると思います。

以上を踏まえて

「この引数は値渡しですよ!」を示す目印

が「ByVal」です。
「ByVal」という表現はVBとかVBAで出てきます。
例えば

Sub hoge_sub(ByVal hikisuu As Integer)

【何かの処理】

End Sub


のように書くと、引数「hikisuu」は値渡しになります。

ByVal24

あと、ついでなので書いておくと「この引数は参照渡しですよ!」を示す目印は「ByRef」です。
例えば

Sub hoge_sub(ByRef hikisuu As Integer)

【何かの処理】

End Sub


のように書くと、引数「hikisuu」は参照渡しになります。

ByVal25

気が向いたら、セットで覚えてあげてください。

ByVal:値渡しを示す目印
ByRef:参照渡しを示す目印


です。


image piyo2

一言でまとめるよ

まぁ「ByVal」って単語が出てきたら「値渡し(渡す変数をコピーして、コピーした変数を「これを使ってね」と渡すやり方)を示す目印なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像051
書籍画像075

おまけ

■訳してみるよ

「ByVal」は多分「by value」の略です。
「by(バイ)」の意味は「~によって」とかです。
「value(バリュー)」の意味は「価値」とか「値打ち」とか「値」とかです。
何となく くっつけると

値によって

となります。




書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
ウォーターサーバーのキャッチコピーを100本考える方法
エンジニアのための生成AI入門 はじめての生成AIアプリ開発からエージェント開発まで