見出し画像

VBA初級(第三回)予習

VBA講義も今週で3回目

今週は、「プロシージャ・関数」という題目で講義を受けるんだが、中々理解に苦しむ項目あり。頭で理解しようとするが、考えがまとまらない。

以下質問用に少し考えをまとめる

参照渡しと値渡し

参照渡し・・・メモリの参照を渡す〈ByRef型〉
値渡し・・・値を渡してメモリは別に用意〈ByBal型〉

引数とパラメータの考え方

Sub Mysub3_03()
   Dim x As Long: x = 10
   Call IncrementNumber(x)
   Debug.Print x
End Sub

Sub IncrementNumber(y As Long)
   y = y + 1
End Sub

上記演習3の場合

引数・・・IncrementNumber(x)の(x)
パラメータ・・・IncrementNumber(y As Long)のy

引数の値がパラメータに渡されるので、x=y

名前が違う箱に同じ数を入れるようなものか?ややこしや。。


参照と値を渡すが少し混乱

Sub Mysub3_04()
   Dim x As Long: x = 20
   Dim y As Long: y = 4
   Call IncrementNumber1(x, y)
   Debug.Print x & "を" & y & "で割ったときの余りは" & x Mod y & "です。"
End Sub

Sub IncrementNumber1(ByVal i As Long, ByVal j As Long)
   i = i + 1
   j = j + 1
   Debug.Print i & "を" & j & "で割ったときの余りは" & i Mod j & "です。"
End Sub

演習4を少し改良上記のプロシージャを実行すると、下記のようなデバック表示をする。

21を5で割ったときの余りは1です。
20を4で割ったときの余りは0です。

Byval(値渡し)を外すと

21を5で割ったときの余りは1です。
21を5で割ったときの余りは1です。

ということは、値渡しすると元の数値をいじらずに、計算ができるという考えでいいのだろうか。(ここでいうSub IncrementNumber1プロシージャでいくら計算しようが、Mysub3_04プロシージャに影響はないということか)


SubプロシージャとFunction(関数)プロシージャの違い

2つのプロシージャの違いがそもそも分からない。

『戻り値を持つ・持たない』で区別があるみたいだが、

Sub Mysub3_02()
   Call Square(5)
End Sub

Sub Square(x As Long)
   Debug.Print x ^ 2
End Sub


Sub Mysub3_06()
   Debug.Print Square2(5)
End Sub

Function Square2(x As Long)
   Square2 = x ^ 2
End Function

演習2(Subプロシージャ)と6(Functionプロシージャ)を比較
演習2は、パラメータ(5)をSub Squareへ渡して、計算された結果を表示する。
演習6は、パラメータ(5)をFunction Squareへ渡して、計算された結果を戻り値として表示する。

結果は同じ出力なんだけど、引数そのまま出力するか戻り値として出力するかの違いか。

この記事が気に入ったらサポートをしてみませんか?